加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Koch曲线(FLASH)

(2012-05-27 10:20:19)
标签:

koch

库赫

曲线

flash

as3

分类: 学习笔记
Koch曲线是1904年瑞典数学家H.von Koch(科赫)构造的,其构造过程是取一条长度为L0的直线段,将其三等分,保留两端的线段,将中间的一段改换成夹角为60度的两个等长直线。再将长度为L0/3的4个直线段分别进行三等分,并将它们中间的一段均改换成夹角为60度的两段长为L0/9的直线段。重复以上操作直至无穷,可得以一条具有自相似结构的折线,即Koch典线。如图:
http://s10/middle/67532f7cgc0fb4da04f49&690
算法描述:
1、对于给定的初始直线AB,按Koch曲线的构成原理,相关坐标点计算方法如下:
xc=xa+(xb-xa)/3
yc=ya+(yb-ya)/3
xe=xb-(xb-xa)/3
ye=yb-(yb-ya)/3
L=sqrt((xe-xc)*(xe-xc)+(ye-yc)*(ye-yc))
alpha=atan((ye-yc)/xe-xc))
xd=xc+cos(alpha+PI/3)*L
yd=yc+sin(alpha+PI/3)*L
2、分别对AC,CD,DE,EB线段调用koch函数,通过递归来实现“无穷”。计算机不能像数学家的设想那样运算至无穷,所以要根据要显示的最小长度来做为递归的终止条件。
http://s7/bmiddle/67532f7cgc1052983ca26&690

算法实现:
package   
    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.display.Graphics;
    import flash.geom.Matrix;   
    public class Koch extends MovieClip {
       
        private var shape:Shape;
        private var minL:int=200;
        public function Koch() {
            // constructor code
            shape=new Shape();           
            shape.x=50;
            shape.y=200;
            var matrix:Matrix = shape.transform.matrix;
            matrix.d=-1;
            shape.transform.matrix=matrix;
            shape.graphics.lineStyle(.1,0xFF0000,1);
            this.addChild(shape);
            koch(0,0,400,0);
        }
        private function koch(xa:Number,ya:Number,xb:Number,yb:Number):void
        {
            if(((xb-xa)*(xb-xa)+(yb-ya)*(yb-ya))<minL)
            {
                shape.graphics.moveTo(xa,ya);
                shape.graphics.lineTo(xb,yb);
            }else
            {
                var xc,yc,xd,yd,xe,ye:Number;
                var L:Number;
                var aa:Number;
                xc=xa+(xb-xa)/3;
                yc=ya+(yb-ya)/3;
                xe=xb-(xb-xa)/3;
                ye=yb-(yb-ya)/3;
                koch(xa,ya,xc,yc);
                koch(xe,ye,xb,yb);
                L=Math.sqrt((xe-xc)*(xe-xc)+(ye-yc)*(ye-yc));
                aa=Math.atan((ye-yc)/(xe-xc));
                if((aa>=0 && (xe-xc)<0)||(aa<0 && (xe-xc)<0)) aa+=Math.PI;
                xd=xc+Math.cos(aa+Math.PI/3)*L;
                yd=yc+Math.sin(aa+Math.PI/3)*L;
                koch(xc,yc,xd,yd);
                koch(xd,yd,xe,ye);                           
            }
        }
     
}

运行结果:
http://s12/middle/67532f7cgc0fc6764325b&690

0

阅读 收藏 喜欢 打印举报/Report
后一篇:库赫雪花
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有