1. 程式人生 > >分形之樹模型

分形之樹模型

生成效果:

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 = "#1230ff";

        FT({x:300,y:800},{x:300,y:650},31*Math.PI/36,23*Math.PI/18)
        FT({x:700,y:800},{x:700,y:500},31*Math.PI/36,23*Math.PI/18)
        function FT(po1,po2,angle1,angle2) {  //注意!po1,po2,有方向,要按照一定的方向傳參
            if(Math.abs(po1.y-po2.y)<5){ //設定中止函式
                return;
            }
            //核心演算法,注意加上var,防止全域性變數干擾,好習慣
            var x0=(2*po1.x+po2.x)/3;
            var y0=(2*po1.y+po2.y)/3;

            //按照座標旋轉公式求算x2,y2
            var x1=(x0-po2.x)*Math.cos(angle1)-(y0-po2.y)*Math.sin(angle1)+po2.x;
            var y1=(x0-po2.x)*Math.sin(angle1)+(y0-po2.y)*Math.cos(angle1)+po2.y;
            var x2=(x0-po2.x)*Math.cos(angle2)-(y0-po2.y)*Math.sin(angle2)+po2.x;
            var y2=(x0-po2.x)*Math.sin(angle2)+(y0-po2.y)*Math.cos(angle2)+po2.y;
            //核心演算法
            draw([po1,po2,{x:x1,y:y1},{x:x2,y:y2}]);
            FT(po2,{x:x1,y:y1},31*Math.PI/36,23*Math.PI/18)
            FT(po2,{x:x2,y:y2},31*Math.PI/36,23*Math.PI/18)
        }
        function draw(points) {
            context.beginPath()   //加上這句重新繪製,介面文件是最好的資料!
            num=points.length;
            for(i=0;i<num-1;i++){
                context.lineTo(points[i].x,points[i].y);
                context.moveTo(points[i].x,points[i].y)
            }
            context.moveTo(points[num-3].x,points[num-3].y);
            context.lineTo(points[num-1].x,points[num-1].y);
            context.closePath()
            context.stroke()
        }
    })