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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
生成分形图案是利用数学公式和计算机程序来实现的,以下是使用Python语言生成分形图案的一些方法: 1. Mandelbrot集合:Mandelbrot集合是一种著名的分形图案,可以通过使用Python中的matplotlib库绘制出来。具体实现方法可以参考以下代码: ```python import numpy as np import matplotlib.pyplot as plt def mandelbrot(Re, Im, max_iter): c = complex(Re, Im) z = 0.0j for i in range(max_iter): z = z*z + c if(z.real*z.real + z.imag*z.imag) >= 4: return i return max_iter def mandelbrot_set(xmin, xmax, ymin, ymax, width, height, max_iter): r1 = np.linspace(xmin, xmax, width) r2 = np.linspace(ymin, ymax, height) return [[mandelbrot(r, i, max_iter) for r in r1] for i in r2] plt.imshow(mandelbrot_set(-2.0, 0.5, -1.25, 1.25, 500, 500, 100), cmap='hot', interpolation='nearest') plt.show() ``` 2. Julia集合:Julia集合是另一种著名的分形图案,也可以使用Python中的matplotlib库绘制出来。具体实现方法可以参考以下代码: ```python import numpy as np import matplotlib.pyplot as plt def julia(Re, Im, max_iter): c = complex(-0.7, 0.27015) z = complex(Re, Im) for i in range(max_iter): z = z*z + c if(z.real*z.real + z.imag*z.imag) >= 4: return i return max_iter def julia_set(xmin, xmax, ymin, ymax, width, height, max_iter): r1 = np.linspace(xmin, xmax, width) r2 = np.linspace(ymin, ymax, height) return [[julia(r, i, max_iter) for r in r1] for i in r2] plt.imshow(julia_set(-1.5, 1.5, -1.5, 1.5, 500, 500, 100), cmap='hot', interpolation='nearest') plt.show() ``` 3. Barnsley fern:Barnsley fern是一种常见的分形植物图案,可以通过使用Python中的turtle库绘制出来。具体实现方法可以参考以下代码: ```python import turtle import random def barnsley_fern(n): x, y = 0, 0 for i in range(n): r = random.random() if r < 0.01: x, y = 0, 0.16*y elif r < 0.86: x, y = 0.85*x + 0.04*y, -0.04*x + 0.85*y + 1.6 elif r < 0.93: x, y = 0.2*x - 0.26*y, 0.23*x + 0.22*y + 1.6 else: x, y = -0.15*x + 0.28*y, 0.26*x + 0.24*y + 0.44 turtle.penup() turtle.goto(85*x, 57*y-275) turtle.pendown() turtle.dot(2, 'green') turtle.speed('fastest') turtle.hideturtle() barnsley_fern(10000) turtle.done() ``` 以上是几种常见的生成分形图案的方法,欢迎尝试!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程与实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值