This is Fractal Designer 0.1.
题目
绘制一个分形图形,以之前的复数类为基础内容。
我之前的复数(Complex)类详见我的博客 【C++ 程序】 TVJ Complex Calculator (v 2.1) 复数计算器 中
Complex.h
和Complex.cpp
。
这个复数类功能比较强大,定义了多种运算,可以直接使用,包括+
(加法),^
(乘方),.modulus()
(取模)。
最新版的复数类(Complex)见我的博客 【C++ 程序】 复数类 (Complex)。
平面上的每一个点,都对应了一个复数坐标,下面判断该点是否发散:
原来的点设为
z
0
z_0
z0,下面对于每一个
z
z
z,进行如下操作100次:
z
n
+
1
=
(
z
n
)
2
+
z
0
,
z_{n+1}=(z_n)^2+z_0\text{,}
zn+1=(zn)2+z0,
如果
∣
z
100
∣
⩽
10
|z_{100}|\leqslant10
∣z100∣⩽10,则认为不发散,否则认为发散。
界面范围: x x x: − 2.3 -2.3 −2.3 ~ 0.9 0.9 0.9; y y y: − 1.2 -1.2 −1.2 ~ 1.2 1.2 1.2。
初级版
代码
#include <iostream>
#include <graphics.h> // the EasyX graphics library
#include "Complex.h"
using namespace std;
IMAGE blue, black;
int main(int argc, char** argv)
{
initgraph(801, 601);
for (double i = 800; i >= 0; i--)
{
for (double j = 0; j <= 600; j++)
{
Complex this_point((i - 575) / 250, (j - 300) / 250);
Complex z0 = this_point;
bool test = true;
for (int k = 0; k != 100; k++)
{
if (this_point.modulus() > 10)
{
test = false;
break;
}
this_point = (this_point ^ 2) + z0; // the bracket can not be omitted due to the priority
}
if (!test)
{
loadimage(&black, _T("Black.jpg"), 1, 1);
putimage(i, j, &black);
}
else
{
loadimage(&blue, _T("Blue.jpg"), 1, 1);
putimage(i, j, &blue);
}
}
}
system("pause");
return 0;
}
// This is Fractal Designer 0.1 by Teddy van Jerry.
(此外有蓝色和黑色两张图片在文件夹内)
结果
分析
- 打印过程比较缓慢,需要耐心等待。
打印中的图形
- 运用 EasyX 的
graphics.h
图形库,详见我的博客 【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)。 - 25行应该加括号,因为运算符重载改变不了优先级(
^
C++中是取异或,优先级很低,比加减法还要低,而运算符重载改变不了优先级) - 不足:边界转换过于生硬(比如最左边的线特别长,其实应该是很淡的),应该一格的颜色由其中九个位置来决定,这样会有一个过渡的效果。
查看 Fractal Designer 最新版
【Qt】 Fractal Designer - Latest Version
ALL RIGHTS RESERVED © 2020 Teddy van Jerry
欢迎转载,转载请注明出处。