分形之koch曲线生成

概论:

自然界的分形,其自相似性并不是严格的,而是,在统计意义下的自相似性,海岸线也是其中一个例子。凡是满足统计自相似性的分形称之为无规分形。另外,还有所谓有规分形,这类分形, 由于它是按一定的数学法则呈现,因此具有严格的自相似性。所谓koch曲线,就是属于有规分形 

  

它的生成方法是把一条直线等分成三段,将中间一段用夹角为600的二条等长(1/3)的折线来代替,形成一个生成单元,如图1.5(b).然后再把每一条直线段用生成单元进行代替,经过无穷多次迭代后就呈现一条无穷多弯曲的koch曲线。用它来模拟自然界中的海岸线是相当理想的。

实现

生成效果:

JS源代码:

    $(function () {
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");

        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;

        context.lineWidth = 2;
        context.strokeStyle = "#4c79c3";

        FT({x:200,y:300},{x:1300,y:300},Math.PI/3)
        function FT(po1,po2,angle) {  //注意!po1,po2,有方向,要按照一定的方向传参
            if(Math.abs(po1.x-po2.x)<5){ //设置中止函数
                return;
            }
            //核心算法,注意加上var,防止全局变量干扰,好习惯
            var x1=(2*po1.x+po2.x)/3;
            var y1=(2*po1.y+po2.y)/3;
            var x3=(2*po2.x+po1.x)/3;
            var y3=(2*po2.y+po1.y)/3;

            //按照坐标旋转公式求算x2,y2
            var x2=(x3-x1)*Math.cos(angle)-(y3-y1)*Math.sin(angle)+x1
            var y2=(x3-x1)*Math.sin(angle)+(y3-y1)*Math.cos(angle)+y1
            //核心算法
            draw([po1,{x:x1,y:y1},{x:x2,y:y2},{x:x3,y:y3},po2])
            FT(po1,{x:x1,y:y1},Math.PI/3)
            FT({x:x1,y:y1},{x:x2,y:y2},Math.PI/3)
            FT({x:x2,y:y2},{x:x3,y:y3},Math.PI/3)
            FT({x:x3,y:y3},po2,Math.PI/3)
        }
        function draw(points) {
            context.beginPath()   //加上这句重新绘制,接口文档是最好的资料!
            //擦去底部线条
            context.strokeStyle='#ffffff'
            context.lineTo(points[1].x,points[1].y)
            context.moveTo(points[1].x,points[1].y)
            context.lineTo(points[3].x,points[3].y)
            context.closePath()
            context.stroke()//擦除原来的底线
            context.strokeStyle = "#002fa7";
            context.beginPath()
            for(i=0;i<points.length;i++){
                context.lineTo(points[i].x,points[i].y);
                context.moveTo(points[i].x,points[i].y)
            }
            context.closePath()
            context.stroke()
        }
    })

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Koch曲线是由瑞典数学家 Helge von Koch 在1904年首先提出的。它是一个自相似的分形曲线,可以通过反复迭代生成。下面我们来利用分形几何绘制Koch曲线和雪花。 Koch曲线的构造方法: 1. 将一条线段分成三段。 2. 将中间一段向外平移,形成一个等边三角形。 3. 在等边三角形的底边上再次重复第一步和第二步。 4. 重复以上步骤,不断迭代,生成越来越复杂的Koch曲线。 绘制Koch曲线的代码如下: ```python import turtle def koch(t, order, size): """ 绘制Koch曲线的函数 t: Turtle对象 order: 迭代次数 size: 初始线段长度 """ if order == 0: t.forward(size) else: for angle in [60, -120, 60, 0]: koch(t, order-1, size/3) t.left(angle) def main(): t = turtle.Turtle() t.speed(0) t.penup() t.goto(-200, 0) t.pendown() koch(t, 4, 400) turtle.done() if __name__ == '__main__': main() ``` 这个程序使用Python的turtle库绘制Koch曲线,迭代次数为4,初始线段长度为400。可以根据需要调整这两个参数。 接下来,我们来绘制Koch雪花。Koch雪花是由三条Koch曲线组成的,它们的共同起点和终点组成一个等边三角形。我们只需要在绘制完一条Koch曲线后,向左旋转120度,再绘制另外两条Koch曲线就可以了。 绘制Koch雪花的代码如下: ```python import turtle def koch_snowflake(t, order, size): """ 绘制Koch雪花的函数 t: Turtle对象 order: 迭代次数 size: 初始线段长度 """ for i in range(3): koch(t, order, size) t.right(120) def main(): t = turtle.Turtle() t.speed(0) t.penup() t.goto(-200, 0) t.pendown() koch_snowflake(t, 4, 200) turtle.done() if __name__ == '__main__': main() ``` 这个程序使用Python的turtle库绘制Koch雪花,迭代次数为4,初始线段长度为200。可以根据需要调整这两个参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值