html5的分形KOCH雪花
来源:互联网 发布:windows管理工具内容 编辑:程序博客网 时间:2024/04/28 16:18
设想一个边长为1的等边三角形,取每边中间的三分之一,接上去一个形状完全相似的但边长为其三分之一的三角形,结果是一个六角形。现在取六角形的每个边做同样的变换,即在中间三分之一接上更小的三角形,以此重复,直至无穷。外界的变得原来越细微曲折,形状接近理想化的雪花。他的名字叫科克曲线,因为瑞典数学家科克在1904年第一次描述了这种不论由直段还是由曲段组成的始终保持连通的线。
以上完全摘自百度百科(包括图片)!
如果只是生成顶点的坐标的话,唯一需要解决的问题是:
给定点a和点b,使b点绕a点旋转某个角度,求出b点的坐标,其实这个公式证明只需三角函数和差化积公式就行,不过为了不影响主题,就不在这里证明了。南阳理工OJ上有一个问题恰好是这个,有兴趣的也可以做一下,这是链接(NYOJ 1079 图形旋转):
点击打开链接不过我已经封装好了c++函数,其中结构体表示点的x,y坐标,whirt函数表示点b绕点a逆时针旋转ang(角度单位制,可取任意实数)度后的点的坐标。
struct point{ double x,y;};point whirt(point a,point b,double ang){ double p;point ans; p=acos(-1);ang=ang*p/180; ans.x=(b.x-a.x)*cos(ang)-(b.y-a.y)*sin(ang)+a.x; ans.y=(b.x-a.x)*sin(ang)+(b.y-a.y)*cos(ang)+a.y; return ans;}有了这个函数,就容易求得每次迭代的顶点坐标,怎么在一个等边三角形的边上再产生一个等边三角形?假设此边的三等分点是a,b,只需让b绕a旋转60度就行了,得到一个点c,则三角形abc就是一个等边三角形。则有下面的c语言函数:
#include <cstdio>#include <cmath>struct point{ double x,y;};point koch[2][1000000],a,b,c;int n[2],pos,time;double aa,bb;point whirt(point a,point b,double ang){ double p;point ans; p=acos(-1);ang=ang*p/180; ans.x=(b.x-a.x)*cos(ang)-(b.y-a.y)*sin(ang)+a.x; ans.y=(b.x-a.x)*sin(ang)+(b.y-a.y)*cos(ang)+a.y; return ans;}int main(){ freopen("koch.txt","w",stdout); a.x=0;a.y=0;b.x=300;b.y=0;time=0; c=whirt(a,b,60); koch[0][0]=c;koch[0][1]=b;koch[0][2]=a;koch[0][3]=c;n[0]=3;pos=0; while(time<=5){ int hhh=0; for(int i=0;i<n[pos];i++){ koch[pos^1][hhh++]=koch[pos][i]; aa=koch[pos][i].x;bb=koch[pos][i+1].x;bb=(bb-aa)/3; a.x=aa+bb;b.x=a.x+bb; aa=koch[pos][i].y;bb=koch[pos][i+1].y;bb=(bb-aa)/3; a.y=aa+bb;b.y=a.y+bb; koch[pos^1][hhh++]=a; koch[pos^1][hhh++]=whirt(a,b,60); koch[pos^1][hhh++]=b; } koch[pos^1][hhh]=c; pos^=1; n[pos]=hhh; time++; } printf("%d\n",n[pos]); for(int i=0;i<=n[pos];i++) printf("%.6f,%.6f,",koch[pos][i].x,koch[pos][i].y); printf("\n"); return 0;}
这是迭代五次后的顶点坐标数据,存在了koch.txt文件里,其中第一行是顶点的个数,以后的都是每个顶点的x,y坐标。有了这些坐标,可以用任何方式把它们画出来,比如html5的<canvas>,只需要开个数组,把坐标复制过去(此处是一个擦汗的表情),就行了,
这是下载链接,直接单击就可以看到效果。
点击打开链接
截个图:
其实真是情况是,当初我写这个的时候,还依然对javascript存在恐惧,所以用了C语言,导致了这种情况.............
0 0
- html5的分形KOCH雪花
- Koch 分形,海岸线,雪花
- 分形生活之Koch雪花小蛋糕
- Koch snowflake fractal (科赫雪花分形)
- Koch雪花曲线的MATLAB实现
- 详解如何用java实现Koch雪花的绘制
- 典型分形模型(Koch 曲线)
- LS文法构图算法(2) Koch雪花
- Delphi XE5 FireMonkey移动开发示例:Koch分形
- OpenGL进阶(七)-康托尔集 谢尔宾斯基地毯 Koch雪花
- OpenGL进阶(七)-康托尔集 谢尔宾斯基地毯 Koch雪花
- 分形技术的一个简单示例——雪花图案(AS3实现)
- koch curve的实现思路
- CSS3 HTML5下雪特效 雪花飘飘
- 雪花的奥秘
- 徐志摩 雪花的快乐
- 中岛美嘉的雪花
- 那些凋零的雪花
- NYOJ 题目991 Registration system(set)
- Linux Wireless基础知识
- State of the "Art": A Taxonomy of Artistic Stylization Techniques for Images and Video(三)
- linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent_helper
- OpenSSL源码中SHA1_Init()的实现在哪里?
- html5的分形KOCH雪花
- 设计模式之大原则
- 最近的3个困惑:信守承诺、技术产品先行还是市场销售先行、客户从哪来
- TopCoder SRM 647 Div2 Problem 500 - TravellingSalesmanEasy (思维)
- Linux中的无线架构
- 2.14 求数组的子数组之和的最大值
- java 操作mongo, 查询语句
- 关于cfg80211
- 电脑编程入门教程