143.Mandelbrot分形图案

举报
C语言与CPP编程 发表于 2022/05/12 00:25:19 2022/05/12
【摘要】 /*原理:1. 使用叠代公式: z[0] = zInit; z[k] = z[k-1]*z[k-1] + z[0]其中z[i]是复数,要使用复数的运算法则。2. Mandelbort图形集的初始化要求 -2.25<= Re(zInit) <= 0.75 -1.25<= Im(zInit) &lt...

  
  1. /*
  2. 原理:
  3. 1. 使用叠代公式:
  4. z[0] = zInit;
  5. z[k] = z[k-1]*z[k-1] + z[0]
  6. 其中z[i]是复数,要使用复数的运算法则。
  7. 2. Mandelbort图形集的初始化要求
  8. -2.25<= Re(zInit) <= 0.75
  9. -1.25<= Im(zInit) <= 1.25
  10. 其中Re(z)表示z的实部, Im(z)表示z的虚部
  11. */
  12. #include <graphics.h>
  13. typedef struct { float x, y; } complex; /*定义复数的结构,x表示实部,y表示虚部*/
  14. complex complexSquare( complex c )
  15. /*计算复数的平方
  16. (x+yi)^2 = (x^2-y^2) + 2xyi
  17. */
  18. {
  19. complex csq;
  20. csq.x = c.x * c.x - c.y * c.y;
  21. csq.y = 2 * c.x * c.y;
  22. return csq;
  23. }
  24. int iterate( complex zInit, int maxIter )
  25. /*叠代计算颜色,maxIter是最多叠代的次数,*/
  26. {
  27. complex z = zInit;
  28. int cnt = 0;
  29. /* 当 z*z > 4的时候退出 */
  30. while((z.x * z.x + z.y * z.y <= 4.0) && (cnt < maxIter))
  31. {
  32. /*叠代公式:z[k] = z[k-1]^2 + zInit, cnt是叠代次数*/
  33. z = complexSquare( z );
  34. z.x += zInit.x;
  35. z.y += zInit.y;
  36. cnt++;
  37. }
  38. return cnt;
  39. }
  40. void mandelbrot( int nx, int ny, int maxIter, float realMin, float realMax, float imagMin, float imagMax )
  41. /*画Mandelbrot图形的主程序,参数意义如下:
  42. nx: x轴的最大值
  43. ny: y轴的最大值
  44. maxIter: 叠代的最大次数
  45. realMin: 初值zInit的实部最小值
  46. realMax: 初值zInit的实部最大值
  47. imagMin: 初值zInit的虚部最小值
  48. imagMax: 初值zInit的虚部最大值
  49. */
  50. {
  51. float realInc = (realMax - realMin) / nx; /*x轴叠代的步长*/
  52. float imagInc = (imagMax - imagMin) / ny; /*y轴叠代的步长*/
  53. complex z; /*初值zInit*/
  54. int x, y; /*点(x,y)的横纵坐标*/
  55. int cnt; /*叠代的次数*/
  56. for( x = 0, z.x = realMin; x<nx; x++, z.x += realInc )
  57. {
  58. for( y = 0, z.y = imagMin; y < ny; y++, z.y+= imagInc )
  59. {
  60. cnt = iterate( z, maxIter ); /*计算叠代次数*/
  61. if( cnt == maxIter ) /*当叠代最大时,为黑色*/
  62. putpixel( x, y, BLACK );
  63. else /*否则将叠代次数作为颜色*/
  64. putpixel( x, y, cnt );
  65. }
  66. }
  67. }
  68. void main()
  69. {
  70. int gdriver = 9, gmode=2;
  71. /*registerbgidriver( EGAVGA_driver );*/
  72. initgraph( &gdriver, &gmode, "e:\\tc\\bgi");
  73. mandelbrot( 640, 480, 255, -2.0, 0.55, -1.0, 1.25 );
  74. getch();
  75. closegraph();
  76. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124665608

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。