算法之美---由计算机生成的图像

发几幅由计算机生成的图像,以展示算法之美.并提供生成图像的算法代码.代码中,一部分是由C++实现,另一部分是由一种我定义的脚本语言实现.

相关软件见:Why数学图像生成工具.

(1)树

 1 void            CPixelIFSTree::BuildPixelsMap()
 2 {
 3     float m[5][7];
 4
 5     //‘IFS码赋值
 6     m[0][0] = 0.195f;  m[0][1] =-0.488f; m[0][2] = 0.344f; m[0][3] = 0.433f; m[0][4] = 0.4431f; m[0][5] = 0.2452f; m[0][6] = 0.25f;
 7     m[1][0] = 0.462f;  m[1][1] = 0.414f; m[1][2] =-0.252f; m[1][3] = 0.361f; m[1][4] = 0.2511f; m[1][5] = 0.5692f; m[1][6] = 0.25f;
 8     m[2][0] =-0.058f;  m[2][1] =-0.07f;  m[2][2] = 0.453f; m[2][3] =-0.111f; m[2][4] = 0.5976f; m[2][5] = 0.0969f; m[2][6] = 0.25f;
 9     m[3][0] =-0.035f;  m[3][1] = 0.07f;  m[3][2] =-0.469f; m[3][3] =-0.022f; m[3][4] = 0.4884f; m[3][5] = 0.5069f; m[3][6] = 0.2f;
10     m[4][0] =-0.637f;  m[4][1] = 0.0f;   m[4][2] = 0.0f;   m[4][3] = 0.501f; m[4][4] = 0.8562f; m[4][5] = 0.2513f; m[4][6] = 0.05f;
11
12     float a, b, c, d, e, f;    //‘仿射变幻中的系数
13
14     float x = 0.0f;
15     float y = 0.0f;
16     float t;
17
18     for (int i = 0; i < 100000000; i++)
19     {
20         float R = (float)rand()/RAND_MAX;
21
22         if (R <= m[0][6])
23         {
24             a = m[0][0]; b = m[0][1]; c = m[0][2]; d = m[0][3]; e = m[0][4]; f = m[0][5];
25         }
26         else if (R <= m[0][6] + m[1][6])
27         {
28             a = m[1][0]; b = m[1][1]; c = m[1][2]; d = m[1][3]; e = m[1][4]; f = m[1][5];
29         }
30         else if (R <= m[0][6] + m[1][6] + m[2][6])
31         {
32             a = m[2][0]; b = m[2][1]; c = m[2][2]; d = m[2][3]; e = m[2][4]; f = m[2][5];
33         }
34         else if (R <= m[0][6] + m[1][6] + m[2][6] + m[3][6])
35         {
36             a = m[3][0]; b = m[3][1]; c = m[3][2]; d = m[3][3]; e = m[3][4]; f = m[3][5];
37         }
38         else
39         {
40             a = m[4][0]; b = m[4][1]; c = m[4][2]; d = m[4][3]; e = m[4][4]; f = m[4][5];
41         }
42
43         t = a*x + b*y + e;
44         y = c*x + d*y + f;
45         x = t;
46
47         int ix = ((int)(x*1024.0f))&0x3ff;
48         int iy = 1024 - ((int)(y*1024.0f))&0x3ff;
49         m_pixels_map[iy][ix]+=1;
50     }
51
52     if (!m_pixels_map[0][0])
53     {
54         m_pixels_map[0][0] = 1;
55     }
56 }
57
58 unsigned int    CPixelIFSTree::CalculatePixel(unsigned int x, unsigned int y)
59 {
60     if (!m_pixels_map[0][0])
61     {
62         BuildPixelsMap();
63     }
64
65     float fr = logf((float)m_pixels_map[y][x])*32.0f;
66     unsigned int r = FLOAT_255_TO_BYTE(fr);
67     float fg = logf((float)m_pixels_map[y][x]*1.2f)*56.0f;
68     unsigned int g = FLOAT_255_TO_BYTE(fg);
69
70     unsigned b = m_pixels_map[y][x] & 0xff;
71
72     return MAKE_RGB(r,g,b);
73 }

(2)晕

这是由Sin函数生成的图像,让人看着眼花

pixels = W:1024 H:1024

x = from (-8*PI) to (8*PI) W
y = from (-8*PI) to (8*PI) H

r = sin(x+y)
g = sin(x-y)
b = sin(x*y)

r = r*0.5 + 0.5
g = g*0.5 + 0.5
b = b*0.5 + 0.5

(3)格

这是由Tan函数生成的图像,密集恐惧症者可以拿它来练胆.

pixels = W:1024 H:1024

x = from 0 to 1023 W
y = from 0 to 1023 H

r = tan(x*y)
g = r*0.5
b = r*0.2

(4)JuliaSets

 1 unsigned int    CPixelJuliaSets3::CalculatePixel(unsigned int x, unsigned int y)
 2 {
 3     int K=100;
 4     int m=500;
 5     float xs = -1.5f;
 6     float xl = 1.5f;
 7     float ys = -1.5f;
 8     float yl = 1.5f;
 9     float p = 0.32f;
10     float q = 0.043f;
11     float xb = (xl - xs) / m_width;
12     float yb = (yl - ys) / m_height;
13
14     float x0=xs+x*xb;
15     float y0=ys+y*yb;
16     int k=0;
17     int H;
18 loop1:
19     float xk=x0*x0-y0*y0+p;
20     float yk=2*x0*y0+q;
21     k=k+1;
22     float r=xk*xk+yk*yk;
23     x0=xk;
24     y0=yk;
25     if(r>m)
26     {
27         H=k;
28         goto loop2;
29     }
30     if(k==K)
31     {
32         H=int(r*10);
33         goto loop2;
34     }
35     if(r<=m && k<K)
36     {
37         goto loop1;
38     }
39 loop2:
40
41     float fr = logf((float)H)*256.0f;
42     unsigned int br = (unsigned char)fr;
43
44     float fg = logf((float)H)*128.0f;
45     unsigned int bg = (unsigned char)fg;
46
47     unsigned int bb = (H*100)&0xff;
48
49     return MAKE_RGB(br,bg,bb);
50 }

(5)Mandlbrot

 1 unsigned int    CPixelMandlbrot1::CalculatePixel(unsigned int x, unsigned int y)
 2 {
 3     int K=100;
 4     int m=500;
 5     float pl=0.9f;
 6     float ps=-2.3f;
 7     float ql=1.2f;
 8     float qs=-1.2f;
 9
10     float p=(pl-ps)/m_width;
11     float q=(ql-qs)/m_height;
12
13     float p0=ps+x*p;
14     float q0=qs+y*q;
15     int k=0;
16     float x0=0.0f;
17     float y0=0.0f;
18     int H;
19
20     float xk;
21     float yk;
22     float r;
23
24 loop1:
25     xk=x0*x0-y0*y0+p0;
26     yk=2*x0*y0+q0;
27     k=k+1;
28     r=xk*xk+yk*yk;
29     x0=xk;
30     y0=yk;
31     if(r>m)
32     {
33         H=k;
34         goto loop2;
35     }
36     if(k==K)
37     {
38         H=int(r*1);
39         goto loop2;
40     }
41     if(r<=m && k<K)
42     {
43         goto loop1;
44     }
45
46 loop2:
47     float fr = logf((float)H)*256.0f;
48     unsigned int br = (unsigned char)fr;
49
50     float fg = logf((float)H)*128.0f;
51     unsigned int bg = (unsigned char)fg;
52
53     unsigned int bb = (H*100)&0xff;
54
55     return MAKE_RGB(br,bg,bb);
56 }

(6)棋盘

pixels = W:1024 H:1024

u = from 0 to 16 W
v = from 0 to 16 H

m = floor(u%2)
n = floor(v%2)

r = if(xor_bool(m,n), 0.0, 1.0)
g = r
b = r

时间: 2024-08-27 21:06:12

算法之美---由计算机生成的图像的相关文章

算法之美---100幅由程序生成的图像,总有一幅让你感到惊艳[下]

来看看算法能生成什么样的图像,继续发余下的50幅.这50幅图像中大部分与分形有关,算法难度要比前50幅大一些,当然其视觉效果会更为惊艳.所有图像均由我开发的软件“Why数学图像生成工具”生成. (51)Sharp Edges (52)Binary Flash (53)Mandelbrot 1 (54)Mandelbrot By Martin (55)Mandelbrot By Kasten (56)Mandelbrot By Lehman (57)Julia Sets 1 (58)Julia S

算法之美隆重上市欢迎关注(更有三重好礼)

探秘算法世界,求索数据结构之道: 汇集经典问题,畅享编程技法之趣: 点拨求职热点,敲开业界名企之门. 内容简介:本书围绕算法与数据结构这个话题,循序渐进.深入浅出地介绍了现代计算机技术中常用的四十余个经典算法,以及回溯法.分治法.贪婪法和动态规划等算法设计思想.在此过程中,本书也系统地讲解了链表(包括单向链表.单向循环链表和双向循环链表).栈.队列(包括普通队列和优先级队列).树(包括二叉树.哈夫曼树.堆.红黑树.AVL树和字典树).图.集合(包括不相交集)与字典等常用数据结构.同时,通过对二十

YChaos生成混沌图像

YChaos是一款通过数学公式生成混沌图像的软件,展示混沌之美,数学之美.软件中定义一套简易的脚本语言,用于描述数学表达式.使用时需要先要将数学表达式写成该脚本的形式,解析脚本代码以生成相应的图形与图像.该软件与我之前写的Why数学图像生成工具和WHY数学图形可视化工具(开源)有很大关联.它们使用的是同一套数学表达式解析代码.如果你对数学生成图形图像感兴趣,欢迎加入QQ交流群: 367752815 一.软件使用 双击"YChaos图像生成软件.exe"启动软件. 软件中有两种模式:编辑

推荐学习《算法之美:指导工作与生活的算法》中文PDF+英文PDF

我们所有人的生活都受到有限空间和有限时间的限制,因此常常面临一系列难以抉择的问题.在一天或者一生的时光里,哪些事是我们应该做的,哪些是应该放弃的?我们对杂乱无序的容忍底线是什么?新的活动与熟悉并喜爱的活动之间如何平衡,才能取得令人愉快的结果?这些看似是人类特有的难题,其实不然,因为计算机也面临同样的问题,计算机科学家几十年来也一直在努力解决这些问题,而他们找到的解决方案可以给我们很多启发. 通过丰富的跨学科研究,<算法之美:指导工作与生活的算法>指出,计算机算法也可以用来解答人类面临的这些问题

算法之美_源代码发布(5)

本文辑录了<算法之美--隐匿在数据结构背后的语言>(电子工业出版社2016年出版)一书第5~6章之代码(P149~P183).全文目录."45个算法"目录."22个经典问题目录",以及有奖捉虫活动详情请见如下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题参考答案请见: http://blog.csdn.net/baimafujinji/article/

每日算法之三十七:Rotate Image (图像旋转)

You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 原地图像顺时针旋转90度.因为要求空间复杂度是常数,因此应该迭代旋转操作. class Solution { public: void rotate(vector<vector<int> > &mat

算法之美_源码公布(1)

本文辑录了<算法之美--隐匿在数据结构背后的语言>(电子工业出版社2016年出版)一书第1~2章之代码(P1~P61).全文文件夹."45个算法"文件夹."22个经典问题文件夹",以及有奖捉虫活动详情请见例如以下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题參考答案请见: http://blog.csdn.net/baimafujinji/articl

算法之美_源代码发布(11)——完结篇

本文辑录了<算法之美--隐匿在数据结构背后的语言(C++版)>(电子工业出版社2016年出版)一书第11章之代码(P375~P406).全文目录."45个算法"目录."22个经典问题目录",以及有奖捉虫活动详情请见如下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题参考答案请见: http://blog.csdn.net/baimafujinji/art

算法之美_源代码发布(3)

本文辑录了<算法之美--隐匿在数据结构背后的语言>(电子工业出版社2016年出版)一书第4章之代码(P91~P117).全文目录."45个算法"目录."22个经典问题目录",以及有奖捉虫活动详情请见如下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题参考答案请见: http://blog.csdn.net/baimafujinji/article/det