143.Mandelbrot分形图案

简介: 143.Mandelbrot分形图案
/*
原理:
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) <= 1.25
   其中Re(z)表示z的实部, Im(z)表示z的虚部
*/
#include <graphics.h>
typedef struct { float x, y; } complex; /*定义复数的结构,x表示实部,y表示虚部*/
complex complexSquare( complex c ) 
/*计算复数的平方
(x+yi)^2 = (x^2-y^2) + 2xyi
*/
{
  complex csq;
  csq.x = c.x * c.x - c.y * c.y;
  csq.y = 2 * c.x * c.y;
  return csq;
}
int iterate( complex zInit, int maxIter )
/*叠代计算颜色,maxIter是最多叠代的次数,*/
{
  complex z = zInit;
  int cnt = 0;
  /* 当 z*z > 4的时候退出 */
  while((z.x * z.x + z.y * z.y <= 4.0) && (cnt < maxIter))
  {
    /*叠代公式:z[k] = z[k-1]^2 + zInit, cnt是叠代次数*/
    z = complexSquare( z );
    z.x += zInit.x;
    z.y += zInit.y;
    cnt++;
  }
  return cnt;
}
void mandelbrot( int nx, int ny, int maxIter, float realMin, float realMax, float imagMin, float imagMax )
/*画Mandelbrot图形的主程序,参数意义如下:
nx: x轴的最大值
ny: y轴的最大值
maxIter: 叠代的最大次数
realMin: 初值zInit的实部最小值
realMax: 初值zInit的实部最大值
imagMin: 初值zInit的虚部最小值
imagMax: 初值zInit的虚部最大值
*/
{
  float realInc = (realMax - realMin) / nx; /*x轴叠代的步长*/
  float imagInc = (imagMax - imagMin) / ny; /*y轴叠代的步长*/
  complex z; /*初值zInit*/
  int x, y; /*点(x,y)的横纵坐标*/
  int cnt; /*叠代的次数*/
  for( x = 0, z.x = realMin; x<nx; x++, z.x += realInc )
  {
    for( y = 0, z.y = imagMin; y < ny; y++, z.y+= imagInc )
    {
      cnt = iterate( z, maxIter ); /*计算叠代次数*/
      if( cnt == maxIter ) /*当叠代最大时,为黑色*/
        putpixel( x, y, BLACK );
      else /*否则将叠代次数作为颜色*/
        putpixel( x, y, cnt  );
    }
  }
}
void main()
{
  int gdriver = 9, gmode=2;
  /*registerbgidriver( EGAVGA_driver );*/
  initgraph( &gdriver, &gmode, "e:\\tc\\bgi");
  mandelbrot( 640, 480, 255, -2.0, 0.55, -1.0, 1.25 );
  getch();
  closegraph();
}
相关文章
【每日一题Day144】LC1617统计子树中城市之间最大距离 | 树形dp
【每日一题Day144】LC1617统计子树中城市之间最大距离 | 树形dp
65 0
|
7月前
|
缓存 前端开发 JavaScript
React 视频弹幕组件 Video Danmaku
视频弹幕(Danmaku)是在线视频平台中实时显示用户评论的方式,增强互动体验。本文介绍如何在React中实现视频弹幕组件,涵盖基本结构、常见问题及解决方案,如避免弹幕重叠、优化性能、确保同步等,并通过代码示例详细解释。帮助开发者解决样式不一致、输入验证不足和加载延迟等问题,提供实用参考。
244 20
|
11月前
|
存储 缓存 监控
Flink如何优化?需要注意哪些方面?
【10月更文挑战第10天】Flink如何优化?需要注意哪些方面?
358 6
|
自然语言处理 网络架构 索引
Elasticsearch7.1之cerebro使用(一)
Elasticsearch7.1之cerebro使用(一)
188 1
|
6月前
|
安全 网络协议 网络安全
只有IP地址没有域名,如何实现HTTPS访问?
在仅有IP地址而无域名的情况下,实现HTTPS访问并非不可能。主要挑战包括证书颁发机构(CA)对IP地址的支持有限及浏览器兼容性问题。解决方案有:1) 搭建私有CA为内部IP地址颁发证书;2) 使用支持IP地址的公共CA服务。选择合适的方案需根据需求权衡。具体步骤包括选择证书类型、生成CSR文件、提交并完成验证、安装SSL证书和配置强制HTTPS访问。确保IP地址稳定,并定期维护安全性。 **申请优惠**:访问JoySSL官网并填写注册码“230907”可优惠申请IP地址证书。
892 5
|
网络协议 Java 关系型数据库
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
184 2
|
Dart IDE Unix
Flutter:创建和发布一个 Dart Package
在 Dart 生态系统中使用 packages(包) 实现代码的共享,比如一些 library 和工具。本文旨在介绍如何创建和发布一个 package。
763 0
Flutter:创建和发布一个 Dart Package
|
前端开发
前端知识笔记(三十一)———css实现水波纹效果(水球图)
前端知识笔记(三十一)———css实现水波纹效果(水球图)
611 0
|
前端开发
pug
pug
169 0