这学期的线下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. 大到31x31的超大卷积核,涨点又高效,一作解读RepLKNet
  2. getRunningTask API
  3. [USACO 2.2.2]循环数 (循环链表 枚举)
  4. ABAP delete的用法
  5. Hadoop2调优(一):如何控制job的map任务和reduce任务的数量
  6. Eclipse将引用了第三方jar包的Java项目打包成jar文件
  7. 习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)
  8. php课程 4-15 数组遍历、超全局数组、表单提交数据(多看学习视频)
  9. 用c++写的一个词典工具
  10. java终结方法_Java终结任务:Callable和Future
  11. SQL 数据发现和分类
  12. Django中的cookie与session
  13. python基础---文件处理
  14. python爬虫淘宝评论_记录一次爬取淘宝/天猫评论数据的过程
  15. android设置wifi蓝牙共享网络,Android无线网络共享设置指南
  16. 自己用qt编写的图片查看器
  17. 黑小米真不应该,如今它已是国货之光,成为国产手机在海外领军者
  18. 7-3 找零钱***分数 20作者 李祥单位 湖北经济学院
  19. OPENGL—钻石图案
  20. 分布式任务调度平台XXL-JOB深度实战

热门文章

  1. 数字后端知识点扫盲——HVT/SVT/LVT cell
  2. 小红帽学前端 | 0 开头瞎BB
  3. 奇妙的 CSS,Amazing,CSS 也能实现烟雾效果
  4. jad环境变量配置_Java Jad 反编译
  5. 【题库】上海市学校心理咨询师-普通心理学-考点解析 9.2 意志行动过程
  6. CSS hover 改变其他元素状态
  7. 生态系统服务(InVEST模型应用)
  8. 在 VS 中调试 Qt 源码
  9. 华为nova7 SE和荣耀30S的区别 哪个好?
  10. java切金条,分金条 - 前端工程师-Becket - BlogJava