2011-01-05 86 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