天天看點

用中點位移法繪制山脈的一個粗糙AS3示範

代碼

import flash.geom.Point;

var MINI = 0.5;//MINI指的是每個中點的振幅縮小速率
var W = stage.stageWidth;
var H = stage.stageHeight;
var iter:int = 5;//疊代次數,值越大,山脈越平滑
var left:Point,right:Point;

left = new Point(0, H-1);
right = new Point(W-1, H-1);
var hill:Sprite = new Sprite();
addChild(hill);
stage.addEventListener(MouseEvent.CLICK, myClick);

function myClick(e:MouseEvent):void
{
    //Mid-point Displacement 中點位移法
    //每次點選就用一種随機的顔色來畫山脈             
  
 hill.graphics.lineStyle(2,Math.random()*256<<16|Math.random()*256<<8|Math.random()*256);
    MD(left, right, 0);
}

function MD(l:Point, r:Point, i:int):void
{
    if(i >= iter){
        hill.graphics.moveTo(l.x, l.y);
        hill.graphics.lineTo(r.x, r.y);
        return;
    }else{
        var mx:Number = (l.x + r.x)/2;
        var my:Number = (l.y + r.y)/2 + H*Math.pow(MINI,i)*myRand();
        if (0 > my)
            trace(my);
        var mp:Point = new Point(mx, my);
        MD(l, mp, i+1);
        MD(mp, r, i+1);
    }
}

//生成一個從-1到1的随機數
function myRand():Number
{
    var positive:Boolean = Math.random() > 0.5 ? true:false;
    if(positive)
        return Math.random();
    else
        return 0 - Math.random();
}
           

繼續閱讀