目录
科赫曲线
科赫曲线是一种广为人知的不规则碎片形。
不规则碎片形是具有递归结构的图形。
可以通过下面的方法画出:
-
将给定的线段三等分。
-
以三等分点为顶点画出等边三角形。
-
对短线段重复进行上述操作。
输入:一个整数n。
输出:科赫曲线各顶点的坐标(x,y),从(0,0)到(100,0)。
限制:
。
输出顶点的递归函数如下:
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