本想以等边三角形实现kock雪花曲线,却错误的画出与之完全不同的皇冠上的钻石,体会到了分形学的奥妙

首先来看kock曲线是如何生成的:(1)过程:主要分为三大步骤:第一步,给定一个初始图形(这里是线段);第二步,将这条线段中间的1/3从中点向外折起(夹角为60度);第三步,按照第二步的方法不断的把各段线段中间的1/3处向外折起。(2)新生成图形的坐标:假设原直线的首尾点是P0(x0,y0)和P1(x1,y1),那么新生成的图形的五个端点就是:(注意第三个端点的正负号表示中间两条新直线位...
摘要由CSDN通过智能技术生成

首先来看kock曲线是如何生成的:

(1)过程:
主要分为三大步骤:第一步,给定一个初始图形(这里是线段);第二步,将这条线段中间的1/3从中点向外折起(夹角为60度);第三步,按照第二步的方法不断的把各段线段中间的1/3处向外折起。
在这里插入图片描述
(2)新生成图形的坐标:
假设原直线的首尾点是P0(x0,y0)和P1(x1,y1),那么新生成的图形的五个端点就是:(注意第三个端点的正负号表示中间两条新直线位于原直线的哪一侧
在这里插入图片描述
(3)之后就是结婚、离婚、结婚、再离婚,永无宁日。

正是上面加粗的那句话:注意第三个端点的正负号表示中间两条新直线位于原直线的哪一侧导致第一次取正号画出了这样的图像:

在这里插入图片描述
原本图像应该是:
在这里插入图片描述
这两个图像在代码上的区别只有一个正负号,就是第三个端点的正负号分别取正和负的结果,这的很神奇很有魅力,这大概就是分形学成为图形学重要分支的原因吧。

最后给出实现的代码:

代码中void compute()函数中注释的代码就是画上面两个图的区别之处:

//取正画皇冠上的钻石
tmp.x=(V[j][iteration_num-1][i].x+V[j][iteration_num-1][i+1].x)/2+(V[j][iteration_num-1][i].y-V[j][iteration_num-1][i+1].y)*sqrt(3.0)/6;
tmp.y=(V[j][iteration_num-1][i].y+V[j][iteration_num-1][i+1].y)/2+(V[j][iteration_num-1][i+1].x-V[j][iteration_num-1][i].x)*sqrt(3.0)/6;
//取负画雪花
//tmp.x=(V[j][iteration_num-1][i].x+V[j][iteration_num-1][i+1].x)/2-(V[j][iteration_num-1][i].y-V[j][iteration_num-1][i+1].y)*sqrt(3.0)/6;
//tmp.y=(V[j][iteration_num-1][i].y+V[j][iteration_num-1][i+1].y)/2-(V[j][iteration_num-1][i+1].x-V[j][iteration_num-1][i].x)*sqrt(3.0)/6;

完整代码:

#include <GL/freeglut.h>
#include <math.h>
#include <vector>
#define max_iteration_num 6//最多迭代六次
using namespace std;

struct Vertex{
   
	GLfloat x,y;
};
vector<Vertex> V[3][max_iteration_num+1];//分别记录3条边各自6次迭代的数据(0、1、2、3、4、5、6)
int iteration_num=0;//记录迭代次数
GLfloat width=800.0,height=800.0;

//用户初始化函数
void myinit(void)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值