毕达哥拉斯树(Pythagoras-tree)
分形几何学是一门以不规则几何形态为研究对象的几何学。一个数学意义上分形的生成是基于一个不断迭代的方程式,即一种基于递归的反馈系统。虽然分形是一个数学构造,它们同样可以在自然界中被找到,这使得它们被划入艺术作品的范畴。
计算机协助了人们推开分形几何的大门。法国数学家曼德尔勃罗特这位计算机和数学兼通的人物,开创了新的数学分支——分形几何学。分形在医学、土力学、地震学和技术分析中都有应用。
毕达哥拉斯树(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)
// 作 者:LOVE MY D.O. <1509840721@qq.com>
// 最后修改:2020-4-10
//
#include <graphics.h>
#include <conio.h>
#include <math.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;
}
毕达哥拉斯树(Pythagoras-tree)相关推荐
- C语言实现“勾股树”——毕达哥拉斯树
序 将所以的烦恼搓成几缕无须羁绊的情绪,抛之脑后~ 嗨!这里是狐狸~ 今天给大家带来了一个'勾股树'--毕达哥拉斯树! 毕达哥拉斯树(Pythagoras tree)是由毕达哥拉斯根据勾股定理所画出来 ...
- 毕达哥拉斯树(pythagorasTree)原理解析及canvas动画实现
以前就看到了这个东西,由于太忙了最近才有时间来实现这个; 该文章适合有一定 canvas 基础的人阅读; 首先说说他的原理: The construction of the Pythagoras tr ...
- 毕达哥拉斯树实现代码
毕达哥拉斯树实现代码(带颜色单击变化)递归加勾股实现(canvas作图) <!DOCTYPE html> <html lang="en" style=" ...
- 使用行为树(Behavior Tree)实现网游奖励掉落系统
原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统 by AKara 2 ...
- 数据结构与算法(C++)– 树(Tree)
数据结构与算法(C++)– 树(Tree) 1.树的基础知识 树(tree): 一些节点的集合,可以为空集 子树(sub tree): 树的子集 根(root): 树的第一个节点 孩子和父亲(Chil ...
- C语言实现段树segment tree(附完整源码)
C语言实现段树segment tree 段树结构体定义 实现以下6个接口 完整实现和main测试源码 段树结构体定义 typedef struct segment_tree {void *root; ...
- 看动画学算法系列之:后缀树suffix tree
文章目录 简介 字典树Trie 压缩字典树 后缀树Suffix Tree 后缀树的搜索 查找最长重复子字符串 查找两个字符串的最长公共子字符串 后缀树的代码实现 简介 模式匹配是一个在工作中经常会用到 ...
- 伸展树(Splay tree)图解与实现
伸展树(Splay tree)图解与实现 伸展树(Splay tree)图解与实现_小张的专栏-CSDN博客_splay树 Splay树详解 Splay树详解 - 秦淮岸灯火阑珊 - 博客园 平衡树 ...
- 使用行为树(Behavior Tree)实现游戏AI
注意:本文版权归Csdn AKara所有,此处纯粹转载,如有再转,请严格按如下方式显示标明原创作者及出处,以示尊重!! 关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上 ...
最新文章
- 二、如何保存MNIST数据集中train和test的图片?
- 扩展基于注解的spring缓存,使缓存有效期的设置支持方法级别-redis篇
- 一场开源数据库的精酿啤酒节,会有多少种味道?
- 「测评」酷炫“霸王龙”Miposaur机器人测评
- matlab apfc,APFC-Boost 带APFC的Boost升压变换器在Matlab中的仿真实现 - 下载 - 搜珍网...
- day16——函数式编程和内置函数
- 开启及关闭go mod
- [react] 什么渲染劫持?
- Spark学习-SparkSQL--01-SparkSQL CLI
- 纠结也好,蛋疼也罢,既然创业了,就把路走好。
- 搭建深度学习推荐系统实战
- 《python基础教程(第二版)》学习笔记 基础部分(第1章)
- sql server 恢复数据库时提示有其他用户连接,怎么办?
- 复习HTTP状态码+301和302
- PyTorch神经网络搭建入门
- 可作为工质状态参数的是_§2工质的热力状态及其基本状态参数
- centos挂载本地镜像作为yum源
- 写给学生看的系统分析与验证笔记(一)——形式化基础
- 学习笔记(4):零基础掌握 Python 入门到实战-深入浅出字符串(二)
- Spring源码杂集