2011-01-05 85 views
1

我想在AS3上編寫sierpinski三角形,但它看起來像我缺少的東西。我卡在這行代碼,並試圖解決什麼是問題。我做了計算,但它似乎就像缺少一些東西,你能幫忙嗎?Sierpinski三角形AS3問題


public class Fract extends Sprite 
{ 
    private var rand:Function = Math.random; 
    private var num:Number = 5; 
    private var w:Number = stage.stageWidth; 
    private var h:Number = stage.stageHeight; 
    private var spr:Sprite; 
    private var small:Sprite; 

    public function Fract() 
    { 
     init(); 
    } 

    private function init():void 
    { 
     var i:Number; 
     spr = new Sprite(); 
     small = new Sprite(); 
     addChild(spr); 
     addChild(small); 

     for (i = 1; i < num; i++) 
     { 
      drawTriangle(i); 
     } 
    } 

    private function drawTriangle(i:Number):void 
    { 
     //CREATE P1 & P2 
     var p1:Point = new Point((w/4), (h - h/4)); 
     var p2:Point = new Point((w - w/4), p1.y); 
     //Calculate distance between first two points 
     var dist:Number = p2.x - p1.x; 
     var dist2:Number = dist/2; 
     //Calculate p3y-so the triangle is equilateral 
     var p3y:Number = Math.sqrt((dist * dist) - (dist2 * dist2)); 
     var p3:Point = new Point(p1.x + dist2, p1.y - p3y); 

     if (i == 1) 
     { 
      spr.graphics.lineStyle(1, 0, 1); 
      spr.graphics.beginFill(0, 1); 
      spr.graphics.moveTo(p1.x, p1.y); 
      spr.graphics.lineTo(p2.x, p2.y); 
      spr.graphics.lineTo(p3.x, p3.y); 
      spr.graphics.lineTo(p1.x, p1.y); 
      spr.graphics.endFill(); 
     } 
     else 
     { 
      var p4:Point = new Point(p1.x + (dist2/i), p1.y - (p3y/i)); 
      var p5:Point = new Point(p4.x + (dist2/(i - 1)), p4.y); 
      var smallDist:Number = p5.x - p4.x; 
      var smallDist2:Number = smallDist/2; 
      var p6y:Number = Math.sqrt((smallDist * smallDist) - (smallDist2 * smallDist2)); 
      var p6:Point = new Point(p4.x + smallDist2, p4.y + p6y); 

      small.graphics.lineStyle(1, 0, 1); 
      small.graphics.beginFill(0xffffff, 1); 
      small.graphics.moveTo(p4.x, p4.y); 
      small.graphics.lineTo(p5.x, p5.y); 
      small.graphics.lineTo(p6.x, p6.y); 
      small.graphics.lineTo(p4.x, p4.y); 
      small.graphics.endFill(); 
     } 
    } 
} 
+0

在發帖框中突出顯示您的代碼,並點擊{}按鈕以使其格式化,看起來一團糟:)也給錯誤。 – shaunhusain 2011-01-05 23:42:32

+0

定義'缺少':)你的意思是包裝聲明和Sprite和Point類的導入語句嗎?另外,請在drawTriangle方法的else語句中查看一下:我認爲你的座標已經關閉了 – 2011-01-06 02:11:42

回答

3

這可以在不偉大的數學技能來完成,因爲你只需要做的一開始就複雜的計算,然後簡單地使用中點(在我的例子:P12 =>中點在p1和p2之間等)。它是一個遞歸函數,每回合調用三次,直到達到最大值。我在下面列出了我的例子。請注意最大值,因爲它可以很容易地凍結你的電腦一段時間,如果設置得太高...

這是一個非常有趣的問題!

public class Fract extends Sprite 
{ 
    private var w : Number = stage.stageWidth; 
    private var h : Number = stage.stageHeight; 
    private var max : uint = 6; 

    public function Fract() 
    { 
     init(); 
    } 

    private function init() : void 
    { 
     var p1 : Point = new Point((w/4), (h - h/4)); 
     var p2 : Point = new Point((w - w/4), p1.y); 
     var dist : Number = (p2.x - p1.x); 
     var dist2 : Number = dist * .5; 
     var p3 : Point = new Point(p1.x + dist2, p1.y - Math.sqrt((dist * dist) - (dist2 * dist2))); 

     drawTriangles(p1, p2, p3, 0, max); 
    } 

    private function drawTriangles (p1 : Point, p2 : Point, p3 : Point, level : uint, max : uint) : void 
    { 
     var spr : Sprite = new Sprite(); 
     addChild(spr); 
     var g : Graphics = spr.graphics; 
     g.lineStyle(1, 0, 1); 
     g.moveTo(p1.x, p1.y); 
     g.lineTo(p2.x, p2.y); 
     g.lineTo(p3.x, p3.y); 
     g.lineTo(p1.x, p1.y); 

     if (level < max) 
     { 
      var p12 : Point = new Point(p1.x + (p2.x - p1.x) * .5, p1.y + (p2.y - p1.y) * .5); 
      var p23 : Point = new Point(p2.x + (p3.x - p2.x) * .5, p2.y + (p3.y - p2.y) * .5); 
      var p31 : Point = new Point(p3.x + (p1.x - p3.x) * .5, p3.y + (p1.y - p3.y) * .5); 
      drawTriangles(p1, p12, p31, level + 1, max); 
      drawTriangles(p12, p2, p23, level + 1, max); 
      drawTriangles(p31, p23, p3, level + 1, max); 
     } 
    } 
} 
+0

非常感謝,這個工作很棒。 – 5et 2011-01-06 13:24:45

+0

非常歡迎,我有一個很好的時間寫這:) – weltraumpirat 2011-01-06 13:35:32