栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

这学期的线下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感兴趣,也可以参考:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/589313.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号