ALDS1_5_C:Koch Curve

题目链接: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;

                  数值计算会默认为整形,不会因为变量定义而改变。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值