这学期的线下C语言课程,大一学生学完递归后,为了加深对递归的理解,布置了一次分形图片生成实验的PBL。这次,介绍同学们实现的毕达哥拉斯树。以下提供了分步骤的实现思路、代码,大家可以参考。
首先是同学们调研的目标效果:
毕达哥拉斯树是由毕达哥拉斯根据勾股定理所画出来的一个可以无限重复的图形。又因为重复数次后的形状好似一棵树,所以被称为毕达哥拉斯树,也叫“勾股树”。数学中它是一个美妙的定理,编程中它又是一个关于递归的绝妙的例子。
最终绘制效果:
依次实现步骤:
最终代码:
#include总结与体会#include #include 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感兴趣,也可以参考:



