科赫曲线

目录

 

科赫曲线


科赫曲线

 

科赫曲线是一种广为人知的不规则碎片形。

不规则碎片形是具有递归结构的图形。

可以通过下面的方法画出:

  • 将给定的线段三等分。

  • 以三等分点为顶点画出等边三角形。

  • 对短线段重复进行上述操作。

 

 

 

输入:一个整数n。

输出:科赫曲线各顶点的坐标(x,y),从(0,0)到(100,0)。

限制:0\leqslant n \leqslant 6

 

输出顶点的递归函数如下:

void koch(int n, point a, point b) {

	if (n == 0)return;

	koch(n - 1, a, s);
	cout << s.x << s.y << endl;
	koch(n - 1, s, u);
	cout << u.x << u.y << endl;
	koch(n - 1, u, t);
	cout << t.x << t.y << endl;
	koch(n - 1, t, b);

}

s和t的坐标通过下面的式子求出:

s.x = (2.0 * a.x + 1.0 * b.x) / 3.0;
       s.y = (2.0 * a.y + 1.0 * b.y) / 3.0;
       t.x = (2.0 * b.x + 1.0 * a.x) / 3.0;
       t.y = (2.0 * b.y + 1.0 * a.y) / 3.0;

 

以s为原点,将t逆时针旋转60°就可以的到u的坐标。

将坐标系逆时针旋转60°,旋转之后的t在原坐标系下的坐标即为u的坐标()。

u.x = (t.x - s.x) * cos(60) - (t.y - s.y) * sin(60) + s.x;
       u.y = (t.x - s.x) * sin(60) + (t.y - s.y) * cos(60) + s.y;

 

对初始的a,b两端点调用koch,我们就可以按顺序输出从a到b的顶点坐标。

 

完整的答案如下:

#include<iostream>
using namespace std;

#define M_PI 3.14159265358979323846
struct point {
	double x, y;
};

void koch(int n, point a, point b) {

	if (n == 0)return;

	point s, t, u;
	double th = M_PI*60.0/180.0;

	s.x = (2.0 * a.x + 1.0 * b.x) / 3.0;
	s.y = (2.0 * a.y + 1.0 * b.y) / 3.0;
	t.x = (2.0 * b.x + 1.0 * a.x) / 3.0;
	t.y = (2.0 * b.y + 1.0 * a.y) / 3.0;

	u.x = (t.x - s.x) * cos(th) - (t.y - s.y) * sin(th) + s.x;
	u.y = (t.x - s.x) * sin(th) + (t.y - s.y) * cos(th) + s.y;
	
	koch(n - 1, a, s);
	cout << s.x << s.y << endl;
	koch(n - 1, s, u);
	cout << u.x << u.y << endl;
	koch(n - 1, u, t);
	cout << t.x << t.y << endl;
	koch(n - 1, t, b);

}

int main() {
	
	point a, b;

	int n;
	cin >> n;

	a.x = 0;
	a.y = 0;
	b.x = 100;
	b.y = 0;

	cout << a.x << " " << a.y << endl;
	koch(n, a, b);
	cout << b.x << " " << b.y << endl;

	return 0;
}

读《挑战程序设计竞赛》第十三天(侵删)2021.3.5

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值