[收集]用三段 140 字符以内的代码生成一张 1024×1024 的图片

Computer Graphics, Animaition, OpenGL, DirectX, OpenCL
头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

[收集]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #1 523066680 » 2016年10月09日 15:31

先分享一两个链接,因为没有获得授权,我就不搬文字过来了

用三段 140 字符以内的代码生成一张 1024×1024 的图片
http://www.matrix67.com/blog/archives/6039

Tweetable Mathematical
http://codegolf.stackexchange.com/questions/35569/tweetable-mathematical-art

我只想说,一路看下去,惊艳,叹为观止。

程序模板,你可以在RD BL GR函数内写入不同的公式以生成各种颜色值,最终将拼凑成一张图案
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. // NOTE: compile with g++ filename.cpp -std=c++11
  2.  
  3. #include <iostream>
  4. #include <cmath>
  5. #include <cstdlib>
  6. #define DIM 1024
  7. #define DM1 (DIM-1)
  8. #define _sq(x) ((x)*(x)) // square
  9. #define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
  10. #define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root
  11.  
  12. unsigned char GR(int,int);
  13. unsigned char BL(int,int);
  14.  
  15. unsigned char RD(int i,int j)
  16. {
  17.     // YOUR CODE HERE
  18. }
  19. unsigned char GR(int i,int j)
  20. {
  21.     // YOUR CODE HERE
  22. }
  23. unsigned char BL(int i,int j)
  24. {
  25.     // YOUR CODE HERE
  26. }
  27.  
  28. void pixel_write(int,int);
  29. FILE *fp;
  30. int main()
  31. {
  32.     fp = fopen("MathPic.ppm","wb");
  33.     fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);
  34.     for(int j=0;j<DIM;j++)
  35.     for(int i=0;i<DIM;i++)
  36.     pixel_write(i,j);
  37.     fclose(fp);
  38.     return 0;
  39. }
  40.  
  41. void pixel_write(int i, int j)
  42. {
  43.     static unsigned char color[3];
  44.     color[0] = RD(i,j)&255;
  45.     color[1] = GR(i,j)&255;
  46.     color[2] = BL(i,j)&255;
  47.     fwrite(color, 1, 3, fp);
  48. }


补充:程序生成的PPM文件可以用Photoshop打开也可以用GIMP打开查看。当然也可以自己写工具转成BMP之类

进一步补充:推荐Image::Magick,示例
convert -resize 512x MathPic.ppm MathPic.jpg,以及可以用convert合成GIF

基于OpenGL固定管线的渲染模板参考8楼
Shader版本待定

happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

Re: [推荐]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #2 happy886rr » 2016年10月09日 16:46

原来是二进制写入

头像
C艹艹
崭露头角
崭露头角
帖子: 26
注册时间: 2016年09月23日 11:32
拥有现金: 锁定
Has thanked: 4 times
Been thanked: 8 times
联系:

Re: [推荐]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #3 C艹艹 » 2016年10月09日 19:12

我现在才知道,如果函数不写return,会返回第一个参数值:
Code: [全选] [展开/收缩] [Download] (Untitled.c)
  1. #include <stdio.h>
  2. unsigned char RD(int i, int j) { }
  3.  
  4. int main(int argc, char *argv[] )
  5. {
  6.     for (int i=5; i<10; i++)
  7.         printf("%d ", RD(i, 255) );
  8.     return 0;
  9. }

输出 5 6 7 8 9

24game
渐入佳境
渐入佳境
帖子: 42
注册时间: 2016年09月02日 22:09
拥有现金: 锁定
Has thanked: 3 times
Been thanked: 15 times
联系:

Re: [推荐]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #4 24game » 2016年10月10日 17:16

图片

Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i,int j)
  2. {
  3.     return abs(abs(sqrt((_sq(i-512)+_sq(j-512)))-508)-254);
  4. }
  5. unsigned char GR(int i,int j)
  6. {
  7.     return abs(abs(sqrt((_sq(i-512)+_sq(j-512)))+508/3-508)-254);
  8. }
  9. unsigned char BL(int i,int j)
  10. {
  11.     return abs(abs(abs(abs(sqrt((_sq(i-512)+_sq(j-512)))+508*2/3-508)-254)-254)-254);
  12. }

24game
渐入佳境
渐入佳境
帖子: 42
注册时间: 2016年09月02日 22:09
拥有现金: 锁定
Has thanked: 3 times
Been thanked: 15 times
联系:

Re: [推荐]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #5 24game » 2016年10月10日 19:29

利用周期性和对称性, 一些极简单的表达式都能生成好看的图形

24game
渐入佳境
渐入佳境
帖子: 42
注册时间: 2016年09月02日 22:09
拥有现金: 锁定
Has thanked: 3 times
Been thanked: 15 times
联系:

Re: [推荐]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #6 24game » 2016年10月10日 22:01

:crazylaugh2 玩游戏啦, 发图猜代码
图片

图片

图片

Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i,int j)
  2. {
  3.     i-=512;j-=512;
  4.     double t=!i&&!j?0:atan2(j,i);
  5.     return 255 - fabs(sqrt(i*i + j*j) - 511*cos(7*t)) / 1500 * 255;
  6. }
  7. unsigned char GR(int i,int j)
  8. {
  9.     i-=512;j-=512;
  10.     double t=!i&&!j?0:atan2(j,i)+2*PI/7/3;
  11.     return 255 - fabs(sqrt(i*i + j*j) - 511*cos(7*t)) / 1500 * 255;
  12. }
  13. unsigned char BL(int i,int j)
  14. {
  15.     i-=512;j-=512;
  16.     double t=!i&&!j?0:atan2(j,i)+2*PI/7*2/3;
  17.     return 255 - fabs(sqrt(i*i + j*j) - 511*cos(7*t)) / 1500 * 255;
  18. }

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

修改模板,生成 BMP

帖子 #7 523066680 » 2016年10月11日 00:54

生成PPM着实有些不方便
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. #pragma pack(push, 1)
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #define PI  3.1415926535
  7. #define DIM 1024
  8. #define DM1 (DIM-1)
  9. #define _sq(x) ((x)*(x)) // square
  10. #define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
  11. #define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root
  12.  
  13. unsigned char GR(int,int);
  14. unsigned char BL(int,int);
  15.  
  16. unsigned char RD(int i,int j)
  17. {
  18.     // YOUR CODE HERE
  19. }
  20. unsigned char GR(int i,int j)
  21. {
  22.     // YOUR CODE HERE
  23. }
  24. unsigned char BL(int i,int j)
  25. {
  26.     // YOUR CODE HERE
  27. }
  28.  
  29. typedef struct
  30. {
  31.     short bfType;      //bfType(2字节),这里恒定等于0x4D 0x42
  32.     long  bfSize;      //文件大小,以4字节为单位        4字节
  33.     short bfReserve1;  //备用=0                         2字节
  34.     short bfReserve2;  //备用=0                         2字节
  35.     long  bfoffBits;   //数据区在文件中的位置偏移量     4字节
  36. }
  37. BMP_HEADER;
  38.  
  39. typedef struct
  40. {
  41.     long bitSize;           //位图信息头大小
  42.     long biWidth;           //图象宽度
  43.     long biHeight;          //图象高度
  44.     short biPlanes;         //位平面数=1
  45.     short biBitCount;       //单位像素的位深
  46.     long biCompression;     //图片的压缩属性,bmp图片是不压缩的,等于0              
  47.     long biSizeImage;       //表示bmp图片数据区的大小 可省略
  48.     long biXPlosPerMeter;   //水平分辨率,可省略
  49.     long biYPlosPerMeter;   //垂直分辨率,可省略
  50.     long biClrUsed;         //表示使用了多少个颜色索引表
  51.     long biClrImportant;    //表示有多少个重要的颜色,等于0时表示所有颜色都很重要
  52. }
  53. BMP_INFO;
  54.  
  55. void pixel_write(int i, int j);
  56. FILE *fp;
  57.  
  58. int main(int argc, char *argv[] )
  59. {
  60.     BMP_HEADER bhead = { 0x4d42, 0, 0, 0, 54 };
  61.  
  62.     BMP_INFO binfo = { 40, DIM, DIM, 1, 24, 0, 0, 0, 0, 0, 0 };
  63.  
  64.     fp = fopen( "1024x1024.bmp", "wb" );
  65.     fwrite(&bhead, sizeof(bhead), 1, fp);
  66.     fwrite(&binfo, sizeof(binfo), 1, fp);
  67.     for(int j=0; j<DIM; j++)
  68.     for(int i=0; i<DIM; i++)
  69.     pixel_write(i, j);
  70.     fclose(fp);
  71.  
  72.     return 0;
  73. }
  74.  
  75. void pixel_write(int i, int j)
  76. {
  77.     static unsigned char color[3];
  78.     color[0] = RD(i,j) &255;
  79.     color[1] = GR(i,j) &255;
  80.     color[2] = BL(i,j) &255;
  81.     fwrite(color, 1, 3, fp);
  82. }

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

OpenGL模板,方便观察动画效果

帖子 #8 523066680 » 2016年10月11日 01:08

模板
按a键test值递增,按r重设test值。(可自定义)
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. #include <GL/glut.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <math.h>
  5. #include <time.h>
  6.  
  7. #define DIM 1024
  8. #define DM1 (DIM-1)
  9. #define _sq(x) ((x)*(x)) // square
  10. #define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
  11. #define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root
  12.  
  13. #define SIZE_X 512
  14. #define SIZE_Y 512
  15.  
  16. #define PI 3.1415926
  17. #define PI2 PI*2
  18. int winID;
  19.  
  20. float test = 0.1;
  21.  
  22. unsigned char RD(int i, int j)
  23. {
  24.     return i * test;
  25. }
  26. unsigned char GR(int i, int j)
  27. {
  28.     return j* test;
  29. }
  30. unsigned char BL(int i, int j)
  31. {
  32.     return j*i* test;
  33. }
  34.  
  35.  
  36. void display(void)
  37. {
  38.     static int x, y, n;
  39.     glClear(GL_COLOR_BUFFER_BIT);
  40.  
  41.     glBegin(GL_POINTS);
  42.  
  43.     for (int i=0; i<DIM; i++)
  44.     {
  45.         for (int j=0; j<DIM; j++)
  46.         {
  47.             glColor3f( RD(i,j)%255/255.0, GR(i,j)%255/255.0, BL(i,j)%255/255.0);
  48.             glVertex3f(i, j, 0.0);
  49.         }
  50.     }
  51.     glEnd();
  52.     glutSwapBuffers();
  53. }
  54.  
  55. void idle(void)
  56. {
  57.     usleep(10000);
  58.     glutPostRedisplay();
  59. }
  60.  
  61. void reshape(int Width,int Height)
  62. {
  63.     const float fa = 32.0;
  64.     const float half = 512.0;
  65.     glViewport(0, 0, Width, Height);     //视口范围
  66.     glMatrixMode(GL_PROJECTION);              // 投影视图矩阵
  67.     glLoadIdentity();
  68.     glOrtho(0.0, (float)DIM, 0.0, (float)DIM, -10.0, 100.0);
  69.     //gluPerspective(90.0, 1.0, 1.0, 80.0);     // 透视投影矩阵(立体视图
  70.     glMatrixMode(GL_MODELVIEW);               // 模型视图矩阵
  71.     glLoadIdentity();
  72.     gluLookAt(0.0,0.0,fa, 0.0,0.0,0.0, 0.0,1.0,fa);  //设置观察点
  73.     // 观察点,   朝向的坐标, 观察点向上坐标
  74. }
  75.  
  76. void keypress(unsigned char key, int mousex, int mousey)
  77. {
  78.     switch (key)
  79.     {
  80.         case 'q':
  81.             glutDestroyWindow(winID);
  82.             exit(0);
  83.             break;
  84.         case 'Q':
  85.             glutDestroyWindow(winID);
  86.             exit(0);
  87.             break;
  88.         case 'a':
  89.         case 'A':
  90.             test += 0.1;
  91.             printf("%f\n", test);
  92.             break;
  93.         case 'r':
  94.         case 'R':
  95.             test = 0.0;
  96.             printf("%f\n", test);
  97.             break;
  98.     }
  99. }
  100.  
  101. void init(void)
  102. {
  103.     glClearColor(0.0, 0.0, 0.0, 0.0);
  104.     glEnable(GL_BLEND);
  105.     glLineWidth( 1.0 );
  106.     glPointSize( 1.0 );
  107.     glEnable(GL_POINT_SMOOTH);
  108.     glEnable(GL_LINE_SMOOTH);
  109.     srand(time(NULL));
  110. }
  111.  
  112. void main(int argc, char *argv[])
  113. {
  114.     glutInit(&argc, argv);
  115.             //显示模式   双缓冲         RGBA  
  116.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA );
  117.     glutInitWindowSize(SIZE_X, SIZE_Y);       //窗口大小
  118.     glutInitWindowPosition(200, 200);         //位置
  119.     winID = glutCreateWindow("TorusVortex");  //窗口句柄
  120.     init();
  121.     glutDisplayFunc(display);          //显示
  122.     glutKeyboardFunc(keypress);        //按键事件响应
  123.     glutReshapeFunc(reshape);          //窗口事件响应
  124.     glutIdleFunc(idle);                //闲时回调函数
  125.     glutMainLoop();                    //开始主循环
  126. }

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

Re: [推荐]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #9 523066680 » 2016年10月12日 14:46

试着模仿前面24game的第一张图,然后,继续摩尔纹

图片

test 初始值 = 1
test += test;
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i, int j)
  2. {
  3.     double ang;
  4.     int y = i - DIM/2;
  5.     int x = j - DIM/2;
  6.  
  7.     ang = atan( (float)y/(float)x );
  8.  
  9.     if (x < 0)
  10.         ang += PI;
  11.     else if (y < 0 && x > 0)
  12.         ang += PI*2.0;
  13.  
  14.     return (int) (255.0 * ( ang /(PI*2.0)*test ));
  15. }


分割线


图片
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i, int j)
  2. {
  3.     return (i*10*tan((float)j/(float)i))*(j*10*tan((float)i/(float)j)) / test;
  4. }


图片
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i, int j)
  2. {
  3.     int x, y;
  4.     x = i - DIM/2;
  5.     y = j - DIM/2;
  6.     return (x*tan((float)x/(float)y))*(y*tan((float)x/(float)y)) / test;
  7. }


图片
Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i, int j)
  2. {
  3.     int x, y;
  4.     x = i;
  5.     y = j-DIM/2;
  6.     return (x*tan((float)x/(float)y))*(y*tan((float)x/(float)y)) / test;
  7. }
  8.  
  9. unsigned char GR(int i, int j)
  10. {
  11.     int x, y;
  12.     x = DIM-i;
  13.     y = j-DIM/2;
  14.     return (x*tan((float)x/(float)y))*(y*tan((float)x/(float)y)) / test;
  15. }

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

Re: [推荐]用三段 140 字符以内的代码生成一张 1024×1024 的图片

帖子 #10 523066680 » 2016年10月13日 12:45

在9楼的基础上,添加另外两种颜色,偏移tan角度

Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i, int j)
  2. {
  3.     int x, y;
  4.     double tv;
  5.     x = i - DIM/2;
  6.     y = j - DIM/2;
  7.     tv = tan( (float)x/(float)y+rtx*0.33 );
  8.  
  9.     return (x * y * _sq(tv)) / test;
  10. }
  11.  
  12. unsigned char GR(int i, int j)
  13. {
  14.     int x, y;
  15.     double tv;
  16.     x = i - DIM/2;
  17.     y = j - DIM/2;
  18.     tv = tan( (float)x/(float)y+rtx*0.66 );
  19.  
  20.     return (x * y * _sq(tv)) / test;
  21. }
  22.  
  23. unsigned char BL(int i, int j)
  24. {
  25.     int x, y;
  26.     double tv;
  27.     x = i - DIM/2;
  28.     y = j - DIM/2;
  29.     tv = tan( (float)x/(float)y+rtx*0.99 );
  30.  
  31.     return (x * y * _sq(tv)) / test;
  32. }

test = 1.0, test += test*0.125
控制缩放

rtx = 0.0, rtx += 0.2
控制旋转角
123.gif
123.gif (1.36 MiB) 查看 1982 次
123.gif
123.gif (1.36 MiB) 查看 1982 次

再补一个

Code: [全选] [展开/收缩] [Download] (Untitled.cpp)
  1. unsigned char RD(int i, int j)
  2. {
  3.     int x, y;
  4.     x = i-DIM/2;
  5.     y = j-DIM/2;
  6.     return (x*tan( (float)x/(float)y) )*(y*tan((float)x/(float)y+rtx*0.33)) / test;
  7. }
  8.  
  9. unsigned char GR(int i, int j)
  10. {
  11.     int x, y;
  12.     x = i-DIM/2;
  13.     y = j-DIM/2;
  14.     return (x*tan( (float)x/(float)y) )*(y*tan((float)x/(float)y+rtx*0.66)) / test;
  15. }
  16.  
  17. unsigned char BL(int i, int j)
  18. {
  19.     int x, y;
  20.     x = i-DIM/2;
  21.     y = j-DIM/2;
  22.     return (x*tan( (float)x/(float)y) )*(y*tan((float)x/(float)y+rtx*0.99)) / test;
  23. }


test=1319.178955, rtx = 21.0 的效果, 这张图我就暂且称为肥皂泡纹理吧
图片

以上代码都是胡乱拼出来的,并不知道具体形成原理。


回到 “计算机图形”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客