事情是这么一回事: 国外有个大佬在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 的图片。
- // NOTE: compile with g++ filename.cpp -std=c++11
- #include <iostream>
- #include <cmath>
- #include <cstdlib>
- #define DIM 1024
- #define DM1 (DIM-1)
- #define _sq(x) ((x)*(x)) // square
- #define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
- #define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root
- unsigned char GR(int,int);
- unsigned char BL(int,int);
- unsigned char RD(int i,int j){
- // YOUR CODE HERE
- }
- unsigned char GR(int i,int j){
- // YOUR CODE HERE
- }
- unsigned char BL(int i,int j){
- // YOUR CODE HERE
- }
- void pixel_write(int,int);
- FILE *fp;
- int main(){
- 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++)
- pixel_write(i,j);
- fclose(fp);
- return 0;
- }
- void pixel_write(int i, int j){
- 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);
- }
|