这学期的线下C语言课程,大一学生学完递归后,为了加深对递归的理解,布置了一次分形图片生成实验的PBL。这次,介绍同学们实现的毕达哥拉斯树。以下提供了分步骤的实现思路、代码,大家可以参考。

首先是同学们调研的目标效果:

毕达哥拉斯树是由毕达哥拉斯根据勾股定理所画出来的一个可以无限重复的图形。又因为重复数次后的形状好似一棵树,所以被称为毕达哥拉斯树,也叫“勾股树”。数学中它是一个美妙的定理,编程中它又是一个关于递归的绝妙的例子。

最终绘制效果:

依次实现步骤:

最终代码:

#include <graphics.h>
#include <conio.h>
#include <math.h>

const double PI = 3.1415926536;
int drawMode = 1;// 定义一个结构体 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) % 256), 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 度形式
Point p = Rotate(p11, p22, a);p = Zoom(p11, p, cos(a));Draw(p, p22);Draw(p11, p);Sleep(20);}
}// 主函数
int main()
{initgraph(800, 640);               // 初始化窗口
    setbkcolor(WHITE);              // 设置背景颜色
    cleardevice();Point p1 = { 290, 400 };Point p2 = { 370, 400 };Draw(p1, p2);_getch();closegraph();                     // 关闭窗口
    return 0;
}

总结与体会

这次小组合作给我们的体会是在小组内要分工明确,相互配合完成任务,选题时要快速果断,遇到问题时要积极查阅资料,虚心请教有经验的同学,努力去解决问题,就一定可以达到预期的结果。

更多趣味学C语言教程,可以参考之前写的图书:

如果对趣味学Python感兴趣,也可以参考:

C语言递归分形实验-毕达哥拉斯树相关推荐

  1. C语言递归分形实验-曼德勃罗集

    这学期的线下C语言课程,大一学生学完递归后,为了加深对递归的理解,布置了一次分形图片生成实验的PBL.这次,介绍同学们实现的曼德勃罗集.以下提供了分步骤的实现思路.代码,大家可以参考. 同学们调研的目 ...

  2. C语言实现“勾股树”——毕达哥拉斯树

    序 将所以的烦恼搓成几缕无须羁绊的情绪,抛之脑后~ 嗨!这里是狐狸~ 今天给大家带来了一个'勾股树'--毕达哥拉斯树! 毕达哥拉斯树(Pythagoras tree)是由毕达哥拉斯根据勾股定理所画出来 ...

  3. 第11章 递归分形树(《Python趣味创意编程》教学视频)

    (图书介绍:童晶:<Python趣味创意编程>新书预告) 本章我们将绘制递归分形树,如图所示.首先学习递归的概念,并学习if-elif-else语句:接着学习分形的概念,并利用递归调用绘制 ...

  4. 小白第一步|Java实现递归分形(以谢尔宾斯基三角形和勾股树为例)

    一个递归分形搞得我心态爆炸 于是 我一定要写个博客祭奠一下!!!!!! 首先回顾一下递归的几个要素: 1.return:往上回溯 2.调用自身:往下挖掘 3.设置条件:防止无限递归 4.递归操作:分析 ...

  5. 实践 - 使用Python画一棵递归分形树

    本实践中,作者要介绍用Python在Tkinter上画一棵树的方法.通过本实践,读者可以:练习面向对象的程序设计方法:了解生成器的使用方法:运用递归函数:了解Tkinter画图的基本方法:以及学习&q ...

  6. 数据结构C语言版(李云清)实验6 树

    实验6 树 1.编写算法函数void levelorder(tree t)实现树的层次遍历. #include "tree.h"void levelorder(tree t) /* ...

  7. 毕达哥拉斯树(Pythagoras-tree)

    分形几何学是一门以不规则几何形态为研究对象的几何学.一个数学意义上分形的生成是基于一个不断迭代的方程式,即一种基于递归的反馈系统.虽然分形是一个数学构造,它们同样可以在自然界中被找到,这使得它们被划入 ...

  8. 数据结构实验三 树的遍历生成树

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A)     2019年4月19日 学院 计算机科学与教育软件学院 年级.专业.班 计算机科学与技术 姓名 学号 实验课程名称 数据 ...

  9. 数据结构实验二 树和二叉树的实现

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A)     2019年5月13日 学院 计算机科学与教育软件学院 年级.专业.班 计算机科学与技术172班 姓名 学号 17061 ...

最新文章

  1. 快速理解 session/token/cookie 认证方式
  2. FLEX RSL 部署产生的问题
  3. GDB调试:观察点(数据断点)【GDB调试】
  4. ORA-28002: the password will expire within 7 days 解决方法(后面部分为拷贝,前面加上了自己遇到的问题的时候解决方案)
  5. 一维小波变换的C++实现
  6. 名校博士被撤销学位,只因7行文字抄袭及1张互联网图片​……
  7. kgtp linux内核调试
  8. java设置全选_[Java教程]jQuery设置checkbox全选(区别jQuery版本)
  9. CITRIX环境下无法打印原因方法
  10. Finalize/Dispose资源清理模式
  11. uniapp vite 路由跳转、登录模块封装(非无感登录)
  12. “元宇宙”火了,这玩意到底是啥?
  13. 解决Qt安装后没有桌面图标
  14. 查看PDF文件的字体格式
  15. level set method 水平集方法基本问题
  16. 天理-数据结构(考研)
  17. ElementUI的表格换行符失效、不换行
  18. 软件工程文档中的数据库模型设计
  19. html table拓宽,excel拉长单元格_excel调整单元格大小的方法步骤详解
  20. 讲台英语怎么读计算机,一种计算机教学讲台的制作方法

热门文章

  1. Timeout expired
  2. etCapture() 和 ReleaseCapture()的用法
  3. X509Certificate2 系统找不到指定的文件
  4. Affinity Propagation聚类算法详解
  5. 详解SAX解析XML
  6. Java---Scanner
  7. QQ和360替代方案。
  8. CANfd 一次采样点和二次采样点
  9. 便携式充气式泳池安全标准
  10. JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型