当前位置:C++技术网 > 资讯 > 用140个字符内的C++代码生成世界最美妙图片大赛

用140个字符内的C++代码生成世界最美妙图片大赛

更新时间:2015-10-09 15:45:22浏览次数:1+次

    在StackExchange上有一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三个函数的代码来生成一张图片。具体地说,参赛者需要用 C++ 语言编写 RD 、 GR 、 BL 三个函数,每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数(0 ≤ i, j ≤ 1023),然后需要返回一个 0 到 255 之间的整数,表示位于 (i, j) 的像素点的颜色值。举个例子,如果 RD(0, 0) 和 GR(0, 0) 返回的都是 0 ,但 BL(0, 0) 返回的是 255 ,那么图像的最左上角那个像素就是蓝色。参赛者编写的代码会被插进下面这段程序当中,最终会生成一个大小为 1024×1024 的图片。


程序框架代码如下:

#include <iostream>
#include <cmath>
#include <cstdlib>
#define DIM 1024
#define DM1 (DIM-1)
#define _sq(x) ((x)*(x)) // 平方
#define _cb(x) abs((x)*(x)*(x)) // 立方的绝对值
#define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // 立方根
unsigned char RD(int i, int j);
unsigned char GR(int i, int j);
unsigned char BL(int i, int j);

unsigned char RD(int i, int j) 
{
    // - 在这里填写函数代码
    return (char)(_sq(cos(atan2(j - 512, i - 512) / 2)) * 255);
}

unsigned char GR(int i, int j) 
{
    // - 在这里填写函数代码
    return (char)(_sq(cos(atan2(j - 512, i - 512) / 2 - 2 * acos(-1) / 3)) * 255);
}

unsigned char BL(int i, int j) 
{
    // - 在这里填写函数代码
    return (char)(_sq(cos(atan2(j - 512, i - 512) / 2 + 2 * acos(-1) / 3)) * 255);
}

void main() 
{
    FILE *fp=0;
    fp = fopen("MathPic.ppm", "wb");
    fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);
    for (int j = 0; j < DIM; j++)
    {
        for (int i = 0; i < DIM; i++)
        {
            static unsigned char color[3];
            color[0] = RD(i, j) & 255;
            color[1] = GR(i, j) & 255;
            color[2] = BL(i, j) & 255;
            fwrite(color, 1, 3, fp);
        }
    }
    fclose(fp);
}


程序说明:
1.在RD、GR和BL函数中填写你的代码,且只能在这三个地方填写代码,其他位置代码不要动。
2.保存的图片文件格式为ppm。原项目为linux下的程序,所以生成的是linux下的图片文件格式。ppm图像格式请使用XnView软件打开。
3.XnView软件下载:点此下载Xnview


已有的作品代码如下:
第一组

unsigned char RD(int i,int j)
{
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,3.);
}
unsigned char GR(int i,int j)
{
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,.7);
}
unsigned char BL(int i,int j)
{
   double a=0,b=0,c,d,n=0;
   while((c=a*a)+(d=b*b)<4&&n++<880)
   {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}
   return 255*pow((n-80)/800,.5);
}


第二组:

unsigned char RD(int i,int j)
{
  double a=0,b=0,d,n=0;
  for(;a*a+(d=b*b)<4&&n++<8192;b=2*a*b+j/5e4+.06,a=a*a-d+i/5e4+.34);
  return n/4;
}
unsigned char GR(int i,int j)
{
  return 2*RD(i,j);
}
unsigned char BL(int i,int j)
{
  return 4*RD(i,j);
}


第三组:

unsigned char RD(int i,int j)
{
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;
}
unsigned char GR(int i,int j)
{
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;
}
unsigned char BL(int i,int j)
{
    float s=3./(j+99);
    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;
    return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;
}


第四组:

char RD(int i, int j) 
{
    #define r(n)(rand()%n)
    static char c[1024][1024]; return!c[i][j] ? c[i][j] = !r(999) ? r(256) : RD((i + r(2)) % 1024, (j + r(2)) % 1024) : c[i][j];
}
char GR(int i, int j)
{
    static char c[1024][1024]; return!c[i][j] ? c[i][j] = !r(999) ? r(256) : GR((i + r(2)) % 1024, (j + r(2)) % 1024) : c[i][j];
}
char BL(int i, int j) 
{
    static char c[1024][1024]; return!c[i][j] ? c[i][j] = !r(999) ? r(256) : BL((i + r(2)) % 1024, (j + r(2)) % 1024) : c[i][j];
}


第五组:

unsigned char RD(int i, int j) 
{
    return (char)(_sq(cos(atan2(j - 512, i - 512) / 2)) * 255);
}

unsigned char GR(int i, int j) 
{
    return (char)(_sq(cos(atan2(j - 512, i - 512) / 2 - 2 * acos(-1) / 3)) * 255);
}

unsigned char BL(int i, int j) 
{
    return (char)(_sq(cos(atan2(j - 512, i - 512) / 2 + 2 * acos(-1) / 3)) * 255);
}


第六组:

char RD(int i,int j)
{
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k>31?256:k*8;
}
char GR(int i,int j)
{
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k>63?256:k*4;
}
char BL(int i,int j)
{
    float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return k;
}

第七组:

unsigned short RD(int i, int j) 
{
    #define D(x) (x-DIM/2.)/(DIM/2.)
    float x = D(i), y = D(j), X, Y, n = 0; while (n++<200 && (X = x*x) + (Y = y*y)<4) { x = X - Y + .36237; y = 2 * x*y + .32; }return log(n) * 256;
}

unsigned short GR(int i, int j) 
{
    float x = D(i), y = D(j), X, Y, n = 0; while (n++<200 && (x*x + y*y)<4) { X = x; Y = y; x = X*X - Y*Y + -.7; y = 2 * X*Y + .27015; }return log(n) * 128;
}

unsigned short BL(int i, int j) 
{
    float x = D(i), y = D(j), X, Y, n = 0; while (n++<600 && (x*x + y*y)<4) { X = x; Y = y; x = X*X - Y*Y + .36237; y = 2 * X*Y + .32; }return log(n) * 128;
}


第八组:

unsigned char RD(int i,int j)
{
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}
unsigned char GR(int i,int j)
{
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}
unsigned char BL(int i,int j)
{
   static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;
}


第九组:

unsigned char RD(int i, int j) 
{
    #define A int x=0,y=0,p[10]={512,9,0,381,196,981,827,981,DM1,381}
    auto s = 99. / (j + 99); return GR(i, j) ? 0 : abs(53 - int((3e3 - i)*s + j*s) % 107);
}

unsigned char GR(int i, int j) 
{ 
    static int c[DIM][DIM]; if (i + j<1) { A; for (int n = 0; n<2e7; n++) { int v = (rand() % 11 + 1) % 5 * 2; x += p[v]; x /= 2; y += p[v + 1]; y /= 2; c[x][y]++; } }return c[i][j]; 
}

unsigned char BL(int i, int j) 
{ 
    static int c[DIM][DIM]; if (i + j<1) { A; for (int n = 0; n<3e7; n++) { int v = (rand() % 11 + 4) % 5 * 2; x += p[v]; x /= 2; y += p[v + 1]; y /= 2; c[x][y]++; } }return c[i][j]; 
}


第十组:

unsigned char RD(int i,int j)
{
    #define A float a=0,b,k,r,x
    #define B int e,o
    #define C(x) x>255?255:x
    #define R return
    #define D DIM
    R BL(i,j)*(D-i)/D;
}
unsigned char GR(int i,int j)
{
    #define E DM1
    #define F static float
    #define G for(
    #define H r=a*1.6/D+2.4;x=1.0001*b/D
    R BL(i,j)*(D-j/2)/D;
}
unsigned char BL(int i,int j)
{
    F c[D][D];if(i+j<1){A;B;G;a<D;a+=0.1){G b=0;b<D;b++){H;G k=0;k<D;k++){x=r*x*(1-x);if(k>D/2){e=a;o=(E*x);c[e][o]+=0.01;}}}}}R C(c[j][i])*i/D;
}

    美到爆的十个短短代码生成超级漂亮的图片,叹服不已。你想来试试吗?编程与艺术的结合,堪称美妙绝伦。编程之美,在此可见一斑,编程如此魅力,让多少程序员为之折腰。

    心动了吗?你也可以来试试哦。说不定也发现了神奇的大陆哦。加油。