【SEU程序设计课笔记】 17 - 2020/12/10 - Write C++ programs - 分形绘图

This is Fractal Designer 0.1.

题目

绘制一个分形图形,以之前的复数类为基础内容。

我之前的复数(Complex)类详见我的博客 【C++ 程序】 TVJ Complex Calculator (v 2.1) 复数计算器Complex.hComplex.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 z10010,则认为不发散,否则认为发散。

界面范围: 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
欢迎转载,转载请注明出处。


See also

Teddy van Jerry 的导航页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值