题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_5_C
输入:n,标识科赫曲线要分割多少次
输出:分割n次后每个点的坐标,依次输出。
科赫曲线如上,每次分割都可以看做是由基础单元组成,基础分割单元就是一条线段,分割成4条线段。s和t分别是三等分点,坐标容易表达,u可以看做是,点t绕点s旋转60°得到的点,由旋转矩阵可以得到:
[cosA -sinA] [x] [X]
[sinA cosA] x [y] = [Y]
表示出u点坐标后,输出即可,代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct point{
double x;
double y;
};
void print_point(point a){
printf("%.8f %.8f\n",a.x,a.y);
return ;
}
void koch(int n ,point a ,point b){
if(n==0) return ;
point c,d,e;
c.x=a.x+(b.x-a.x)/3;
c.y=a.y+(b.y-a.y)/3;
e.x=a.x+2*(b.x-a.x)/3;
e.y=a.y+2*(b.y-a.y)/3;
d.x=c.x+(e.x-c.x)*cos(M_PI*60/180)+(e.y-c.y)*(-sin(M_PI*60/180));
d.y=c.y+(e.x-c.x)*sin(M_PI*60/180)+(e.y-c.y)*cos(M_PI*60/180);
koch(n-1,a,c);
print_point(c);
koch(n-1,c,d);
print_point(d);
koch(n-1,d,e);
print_point(e);
koch(n-1,e,b);
return;
}
int main (){
int n ;
cin>>n;
point a,b;
a.x=0;a.y=0;
b.x=100;b.y=0;
print_point(a);
koch(n,a,b);
print_point(b);
return 0;
}
错点:
1. C++中pi在math.h头文件中定义为M_PI
2.打印时,递归只打印中间三个点,两个顶点在外面打印
3.运算规则:double a=2/4*2=0;
double b=2*2/4=1;
数值计算会默认为整形,不会因为变量定义而改变。