2011-01-05 10 views
1

Ich versuche Sierpinski Dreieck auf AS3 zu schreiben, aber es sieht aus wie ich etwas fehlt.Ich bin in diesen Zeilen des Codes stecken und versuchen zu lösen, was das Problem ist.Ich machte die Berechnungen, aber es scheint als ob etwas fehlt. Kannst du helfen?Sierpinski Dreieck AS3 Problem


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

Markieren Sie Ihren Code in der Posting Box und drücken Sie die {} Taste, um es formatiert zu bekommen, das ein Chaos aussieht :) geben Sie auch Fehler. – shaunhusain

+0

Definieren Sie "missing" :) Meinst du die Paket {} -Deklaration und die Importanweisungen für die Sprite- und Point-Klasse? Schaut auch in der else-Anweisung in der drawTriangle-Methode nach: Ich denke, eure Koordinaten sind ein wenig entfernt. –

Antwort

3

Dies kann ohne große mathematische Fähigkeiten getan werden, da Sie nur die komplizierte Berechnung in der ersten Stunde zu tun haben, und dann einfach die Mittelpunkte verwenden (in meinem Beispiel: p12 => Mittelpunkt zwischen p1 und p2 usw.) der Seiten des Dreiecks. Es ist eine rekursive Funktion, die sich dreimal in jeder Runde aufruft, bis ein maximaler Level erreicht ist. Ich habe mein Beispiel unten eingefügt. Seien Sie vorsichtig mit dem Wert für max, weil es Ihren Computer für eine Weile einfrieren kann, wenn zu hoch eingestellt ...

Das war eine wirklich lustige Frage!

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

Vielen Dank, das hat super funktioniert. – 5et

+0

Sie sind herzlich willkommen, ich hatte eine tolle Zeit, dies zu schreiben :) – weltraumpirat