C语言实现“勾股树”——毕达哥拉斯树!
创作时间:
作者:
@小白创作中心
C语言实现“勾股树”——毕达哥拉斯树!
引用
网易
1.
https://www.163.com/dy/article/JI41VKRQ05566XY7.html
分形几何学是一门以不规则几何形态为研究对象的几何学。一个数学意义上分形的生成是基于一个不断迭代的方程式,即一种基于递归的反馈系统。虽然分形是一个数学构造,它们同样可以在自然界中被找到,这使得它们被划入艺术作品的范畴。
计算机协助了人们推开分形几何的大门。法国数学家曼德尔勃罗特这位计算机和数学兼通的人物,开创了新的数学分支——分形几何学。分形在医学、土力学、地震学和技术分析中都有应用。
毕达哥拉斯树(Pythagoras tree)是由毕达哥拉斯根据勾股定理所画出来的一个可以无限重复的图形。又因为重复数次后的形状好似一棵树,所以被称为毕达哥拉斯树,也叫“勾股树”。
这个程序,展示了毕达哥拉斯树的生成。执行效果如下:
程序实现思路
- 确定直线 p1-p2,并在 p1-p2 的左侧求出 p11-p22,使 p1-p2-p22-p11 构成正方形。
- 求出点 p,使 p-p11-p22 构成含 60 度角的直角三角形。
- 分别将直线 p-p11 和 p-p22 看作 p1-p2,递归。递归的条件是正方形的边长大于 3。
C语言源代码
/////////////////////////////////////////////////////
// 程序名称:毕达哥拉斯树(Pythagoras tree)
// 编译环境:Mictosoft Visual Studio 2010, EasyX_20200315(beta)
#include <graphics.h>
#include <math.h>
#include <conio.h>
const double PI = 3.1415926536;
// 定义一个结构体 Point,存储点的坐标
struct Point {
double x;
double y;
};
// 直线的旋转(p1 是定点)
Point Rotate(Point p1, Point p2, double angle) {
Point r;
r.x = p1.x + (p2.x - p1.x) * cos(angle) + (p2.y - p1.y) * sin(angle);
r.y = p1.y + (p2.y - p1.y) * cos(angle) - (p2.x - p1.x) * sin(angle);
return r;
}
// 直线的缩放(p1 是定点)
Point Zoom(Point p1, Point p2, double ratio) {
Point r;
r.x = p1.x + (p2.x - p1.x) * ratio;
r.y = p1.y + (p2.y - p1.y) * ratio;
return r;
}
// 画出正方形
void Draw(Point p1, Point p2) {
Point p11 = Rotate(p1, p2, 90 * PI / 180);
Point p22 = Rotate(p2, p1, 270 * PI / 180);
POINT pts[] = {
{ int(p1.x + 0.5), int(p1.y + 0.5) }, // +0.5 是为了四舍五入
{ int(p2.x + 0.5), int(p2.y + 0.5) },
{ int(p22.x + 0.5), int(p22.y + 0.5) },
{ int(p11.x + 0.5), int(p11.y + 0.5) }
};
static int color_H = 270;
setfillcolor(HSVtoRGB(float(color_H), 1, 1)); // 设置正方形的填充颜色
setlinecolor(HSVtoRGB(float((color_H + 80) % 360), 0.5, 0.5)); // 设置正方形的边框颜色
color_H = (color_H + 1) % 360;
fillpolygon(pts, 4); // 填充正方形颜色
if (((p22.x - p11.x) * (p22.x - p11.x) + (p22.y - p11.y) * (p22.y - p11.y)) > 3 * 3 ) // 正方形的边长 >3 时递归
{
double a = 60 * PI / 180; // 60 度形式
//double a = 45 * PI / 180; // 45 度形式
Point p = Rotate(p11, p22, a);
p = Zoom(p11, p, cos(a));
Draw(p, p22);
Draw(p11, p);
}
}
// 主函数
int main() {
initgraph(640, 480); // 初始化窗口
setbkcolor(0xfecaeb); // 设置背景颜色
cleardevice();
Point p1 = { 290, 400 };
Point p2 = { 350, 400 };
Draw(p1, p2);
_getch();
closegraph(); // 关闭窗口
return 0;
}
通过改变旋转的角度可以产生不同形状的树。例如,修改 Draw 函数里的 double a 变量为 45 度,可以得到这样的效果:
热门推荐
什么是让与人和受让人:法律实务中的基本概念
婚后私房钱怎么存最安全的
【重庆疾控权威解读】老人和儿童易感!肺炎链球菌如何预防?看看专家怎么说
b受体阻滞剂的作用与功效
脂肪肝逆转攻略:饮食运动作息全方位调整
乌拉圭U20迎战阿根廷U20:历史交锋与近期状态分析
降低体脂肪率的科学饮食指南
寒假余额不足!迎接新学期,学生、家长、老师应如何调整心理状态?「内有锦囊」!
如何通过军事模拟游戏提升心理健康服务行业的有效性?
人体温度提升一度免疫力提高多少
杭州地铁线路图,杭州地铁全图高清版大图(最新版)
“隔声”问题,是“好房子”建设面临的最大挑战!
梦境中的自我意识:你的潜意识告诉了你什么?
关于新型人工肾的进展情况简介
绝区零支援角色哪个强?四大支援角色强度排行榜
宫崎骏动画电影的人物特征
软件与硬件:定义、功能及区别详解
什么是红光疗法?
被领导针对时的职场生存攻略在此
2024 CSRankings全球计算机科学排名更新!清华仅次于卡梅,亚洲第一!
U盘标称容量和实际不符 真的不是偷工减料
打造农业援外新范式:中国援柬埔寨农业发展规划项目正式移交
C13 至 C14 电源线:选择合适电源解决方案的综合指南
它是我国成年人致死、致残的第一大原因! 做好几点可预防
蔡昉:延迟退休政策需做好配套 要为大龄劳动者加强公共就业服务和技能培训
最强郑钦文回来了!轰12记ace超轻松晋级:44万奖金+重返世界第8
郑钦文迈阿密赛开门红 晋级第三轮
0.7cm肾结石需要碎石吗?
确诊脊柱侧弯之后:努力被扳正的青少年
为什么植物油比动物油营养价值高?这个结论并非绝对