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

Computer Graphics, Animaition, OpenGL, DirectX, OpenCL
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

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

帖子 523066680 »

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

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

Tweetable Mathematical
http://codegolf.stackexchange.com/quest ... atical-art

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

程序模板,你可以在RD BL GR函数内写入不同的公式以生成各种颜色值,最终将拼凑成一张图案
// 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);
}
补充:程序生成的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
联系:

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

帖子 happy886rr »

原来是二进制写入
头像
C艹艹
崭露头角
崭露头角
帖子: 26
注册时间: 2016年09月23日 11:32
联系:

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

帖子 C艹艹 »

我现在才知道,如果函数不写return,会返回第一个参数值:
#include <stdio.h>
unsigned char RD(int i, int j) { }

int main(int argc, char *argv[] )
{
for (int i=5; i<10; i++)
printf("%d ", RD(i, 255) );
return 0;
}
输出 5 6 7 8 9
24game
渐入佳境
渐入佳境
帖子: 54
注册时间: 2016年09月02日 22:09
联系:

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

帖子 24game »

图片
unsigned char RD(int i,int j)
{
return abs(abs(sqrt((_sq(i-512)+_sq(j-512)))-508)-254);
}
unsigned char GR(int i,int j)
{
return abs(abs(sqrt((_sq(i-512)+_sq(j-512)))+508/3-508)-254);
}
unsigned char BL(int i,int j)
{
return abs(abs(abs(abs(sqrt((_sq(i-512)+_sq(j-512)))+508*2/3-508)-254)-254)-254);
}
24game
渐入佳境
渐入佳境
帖子: 54
注册时间: 2016年09月02日 22:09
联系:

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

帖子 24game »

利用周期性和对称性, 一些极简单的表达式都能生成好看的图形
24game
渐入佳境
渐入佳境
帖子: 54
注册时间: 2016年09月02日 22:09
联系:

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

帖子 24game »

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

图片

图片
unsigned char RD(int i,int j)
{
i-=512;j-=512;
double t=!i&&!j?0:atan2(j,i);
return 255 - fabs(sqrt(i*i + j*j) - 511*cos(7*t)) / 1500 * 255;
}
unsigned char GR(int i,int j)
{
i-=512;j-=512;
double t=!i&&!j?0:atan2(j,i)+2*PI/7/3;
return 255 - fabs(sqrt(i*i + j*j) - 511*cos(7*t)) / 1500 * 255;
}
unsigned char BL(int i,int j)
{
i-=512;j-=512;
double t=!i&&!j?0:atan2(j,i)+2*PI/7*2/3;
return 255 - fabs(sqrt(i*i + j*j) - 511*cos(7*t)) / 1500 * 255;
}
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

修改模板,生成 BMP

帖子 523066680 »

生成PPM着实有些不方便
#pragma pack(push, 1)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PI 3.1415926535
#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
}

typedef struct
{
short bfType; //bfType(2字节),这里恒定等于0x4D 0x42
long bfSize; //文件大小,以4字节为单位 4字节
short bfReserve1; //备用=0 2字节
short bfReserve2; //备用=0 2字节
long bfoffBits; //数据区在文件中的位置偏移量 4字节
}
BMP_HEADER;

typedef struct
{
long bitSize; //位图信息头大小
long biWidth; //图象宽度
long biHeight; //图象高度
short biPlanes; //位平面数=1
short biBitCount; //单位像素的位深
long biCompression; //图片的压缩属性,bmp图片是不压缩的,等于0
long biSizeImage; //表示bmp图片数据区的大小 可省略
long biXPlosPerMeter; //水平分辨率,可省略
long biYPlosPerMeter; //垂直分辨率,可省略
long biClrUsed; //表示使用了多少个颜色索引表
long biClrImportant; //表示有多少个重要的颜色,等于0时表示所有颜色都很重要
}
BMP_INFO;

void pixel_write(int i, int j);
FILE *fp;

int main(int argc, char *argv[] )
{
BMP_HEADER bhead = { 0x4d42, 0, 0, 0, 54 };

BMP_INFO binfo = { 40, DIM, DIM, 1, 24, 0, 0, 0, 0, 0, 0 };

fp = fopen( "1024x1024.bmp", "wb" );
fwrite(&bhead, sizeof(bhead), 1, fp);
fwrite(&binfo, sizeof(binfo), 1, fp);
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);
}
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

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

帖子 523066680 »

模板
按a键test值递增,按r重设test值。(可自定义)
#include <GL/glut.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <time.h>

#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

#define SIZE_X 512
#define SIZE_Y 512

#define PI 3.1415926
#define PI2 PI*2
int winID;

float test = 0.1;

unsigned char RD(int i, int j)
{
return i * test;
}
unsigned char GR(int i, int j)
{
return j* test;
}
unsigned char BL(int i, int j)
{
return j*i* test;
}


void display(void)
{
static int x, y, n;
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POINTS);

for (int i=0; i<DIM; i++)
{
for (int j=0; j<DIM; j++)
{
glColor3f( RD(i,j)%255/255.0, GR(i,j)%255/255.0, BL(i,j)%255/255.0);
glVertex3f(i, j, 0.0);
}
}
glEnd();
glutSwapBuffers();
}

void idle(void)
{
usleep(10000);
glutPostRedisplay();
}

void reshape(int Width,int Height)
{
const float fa = 32.0;
const float half = 512.0;
glViewport(0, 0, Width, Height); //视口范围
glMatrixMode(GL_PROJECTION); // 投影视图矩阵
glLoadIdentity();
glOrtho(0.0, (float)DIM, 0.0, (float)DIM, -10.0, 100.0);
//gluPerspective(90.0, 1.0, 1.0, 80.0); // 透视投影矩阵(立体视图
glMatrixMode(GL_MODELVIEW); // 模型视图矩阵
glLoadIdentity();
gluLookAt(0.0,0.0,fa, 0.0,0.0,0.0, 0.0,1.0,fa); //设置观察点
// 观察点, 朝向的坐标, 观察点向上坐标
}

void keypress(unsigned char key, int mousex, int mousey)
{
switch (key)
{
case 'q':
glutDestroyWindow(winID);
exit(0);
break;
case 'Q':
glutDestroyWindow(winID);
exit(0);
break;
case 'a':
case 'A':
test += 0.1;
printf("%f\n", test);
break;
case 'r':
case 'R':
test = 0.0;
printf("%f\n", test);
break;
}
}

void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_BLEND);
glLineWidth( 1.0 );
glPointSize( 1.0 );
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
srand(time(NULL));
}

void main(int argc, char *argv[])
{
glutInit(&argc, argv);
//显示模式 双缓冲 RGBA
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA );
glutInitWindowSize(SIZE_X, SIZE_Y); //窗口大小
glutInitWindowPosition(200, 200); //位置
winID = glutCreateWindow("TorusVortex"); //窗口句柄
init();
glutDisplayFunc(display); //显示
glutKeyboardFunc(keypress); //按键事件响应
glutReshapeFunc(reshape); //窗口事件响应
glutIdleFunc(idle); //闲时回调函数
glutMainLoop(); //开始主循环
}
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

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

帖子 523066680 »

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

图片

test 初始值 = 1
test += test;
unsigned char RD(int i, int j)
{
double ang;
int y = i - DIM/2;
int x = j - DIM/2;

ang = atan( (float)y/(float)x );

if (x < 0)
ang += PI;
else if (y < 0 && x > 0)
ang += PI*2.0;

return (int) (255.0 * ( ang /(PI*2.0)*test ));
}
分割线
图片
unsigned char RD(int i, int j)
{
return (i*10*tan((float)j/(float)i))*(j*10*tan((float)i/(float)j)) / test;
}
图片
unsigned char RD(int i, int j)
{
int x, y;
x = i - DIM/2;
y = j - DIM/2;
return (x*tan((float)x/(float)y))*(y*tan((float)x/(float)y)) / test;
}
图片
unsigned char RD(int i, int j)
{
int x, y;
x = i;
y = j-DIM/2;
return (x*tan((float)x/(float)y))*(y*tan((float)x/(float)y)) / test;
}

unsigned char GR(int i, int j)
{
int x, y;
x = DIM-i;
y = j-DIM/2;
return (x*tan((float)x/(float)y))*(y*tan((float)x/(float)y)) / test;
}
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

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

帖子 523066680 »

在9楼的基础上,添加另外两种颜色,偏移tan角度
unsigned char RD(int i, int j)
{
int x, y;
double tv;
x = i - DIM/2;
y = j - DIM/2;
tv = tan( (float)x/(float)y+rtx*0.33 );

return (x * y * _sq(tv)) / test;
}

unsigned char GR(int i, int j)
{
int x, y;
double tv;
x = i - DIM/2;
y = j - DIM/2;
tv = tan( (float)x/(float)y+rtx*0.66 );

return (x * y * _sq(tv)) / test;
}

unsigned char BL(int i, int j)
{
int x, y;
double tv;
x = i - DIM/2;
y = j - DIM/2;
tv = tan( (float)x/(float)y+rtx*0.99 );

return (x * y * _sq(tv)) / test;
}
test = 1.0, test += test*0.125
控制缩放

rtx = 0.0, rtx += 0.2
控制旋转角
123.gif
(1.36 MiB) 已下载 3775 次
再补一个
unsigned char RD(int i, int j)
{
int x, y;
x = i-DIM/2;
y = j-DIM/2;
return (x*tan( (float)x/(float)y) )*(y*tan((float)x/(float)y+rtx*0.33)) / test;
}

unsigned char GR(int i, int j)
{
int x, y;
x = i-DIM/2;
y = j-DIM/2;
return (x*tan( (float)x/(float)y) )*(y*tan((float)x/(float)y+rtx*0.66)) / test;
}

unsigned char BL(int i, int j)
{
int x, y;
x = i-DIM/2;
y = j-DIM/2;
return (x*tan( (float)x/(float)y) )*(y*tan((float)x/(float)y+rtx*0.99)) / test;
}
test=1319.178955, rtx = 21.0 的效果, 这张图我就暂且称为肥皂泡纹理吧
图片

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

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客