Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29-12-2004, 13:38   #1 (permalink)
Neuer User
 
Benutzerbild von Raphael79
 
Registriert seit: Sep 2004
Ort: Hamburg
Beiträge: 35
Rekursive Funktion - Baum zeichnen lassen. Hilfe!

Hallo, ich möchte mit Actionscript einen Baum zeichnen. Mit einer Rekursiven Funktion. Aus jedem Ast sollen zwei Äste sprießen.
So ein wenig funktioniert das auch schon, aber er führt die zweite Funktion nicht wirklich aus.. Ich hab den zweiten Ast rot gefärbt, damit man das besser erkennen kann.

Weiß jemand wo der Fehler liegt? Oder ist der Herangehensweise komplett fürn Arsch?

Und noch eine Frage: Falls das dann gehen sollte, wie schafft man es am elegantesten, dass der Baum Schritt für Schritt aufgebaut wird?

Freue mich über jeden Tipp oder Rat!
Danke, Raphael


Hier der Code:

count = 1;
_root.createEmptyMovieClip("baum", 1);
//
zeichneAst = function (startX, startY, color) {
count++;
// zielkoordinate setzen
var newX = startX+(random(60)-30);
var newY = startY-10-random(20);
// linie zeichnen
with (_root.baum) {
lineStyle(1, color, 100);
moveTo(startX, startY);
lineTo(newX, newY);
}
// anzahl der durchgänge begrenzen
if (count>20) {
break;
} else {
// funktion rekursiv ausführen, zweimal, da aus einem ast zwei äste wachsen
zeichneAst(newX, newY, "0x000000");
zeichneAst(newX, newY, "0xFF0000");
}
};
// initial
zeichneAst(Stage.width/2, Stage.height, "0x000000");
Raphael79 ist offline   Mit Zitat antworten
Alt 29-12-2004, 14:31   #2 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
übergib noch n parameter an die funktion, der ein boolean ( true oder false) ist.
wenn der param false zeichne nur den einen ast ( wie immo deinen funktion ist), wenn aber true, dann zeichen in der gleichen funktion auch gleich noch den zweiten ast dazu...verstanden?



greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 29-12-2004, 15:27   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
sowas geht schicker:
ein rechteck als ast-mc. der nullpunkt des rechtecks liegt an einem ende. am anderen ende und z.b. in der mitte ein punkt-mc, an das du weitere ast-mc's drann hängen kannst. mit ein bisschen random die winkel ändern; fertig ist der baum.
durch scalieren das stammes "wächst" dann der ganze baum.
http://www.seibsprogrammladen.de/fra...ion/Baum/flash


zu deinem programm:
das ist soweit schon richtig. nur dein count geht nicht. er verschachtelt, verschachtelt, verschachtelt und dann brichst du einfach das zeichnen ab.
du musst die verschachtelungstiefe abbrechen um ihm die möglichkeit zu geben, zurückkehren zu können, um die anderen verschachtelungen aus zu führen.
also nicht die anzahl (die bei dir immer tiefer verschachtelt) zählen, sondern die aktuelle verschachtelungstiefe ermitteln, ab der nicht mehr tiefer verschachtelt werden soll.
und mach alle werte zu variablen mit vernüftigen namen.
ActionScript:
  1. var cAstWinkel=60;
  2. var cAstLaenge=40;
  3. var cMaxTiefe=6;
  4. //
  5. var cRAD=Math.PI/180;
  6. _root.createEmptyMovieClip("baum", 1);
  7. //
  8. zeichneAst = function (tiefe,startX, startY, color) {
  9.     var winkel=(random(cAstWinkel+cAstWinkel)-cAstWinkel)*cRAD;
  10.     var laenge=random(cAstLaenge)+cAstLaenge;
  11.     var newX = startX+laenge*Math.sin(winkel);
  12.     var newY = startY-laenge*Math.cos(winkel);
  13.     with (_root.baum) {
  14.         lineStyle(1, color, 100);
  15.         moveTo(startX, startY);
  16.         lineTo(newX, newY);
  17.     }
  18.     tiefe++;
  19.     if (tiefe>cMaxTiefe) {
  20.         break;
  21.     } else {
  22.         zeichneAst(tiefe,newX, newY, "0x000000");
  23.         zeichneAst(tiefe,newX, newY, "0xFF0000");
  24.     }
  25. };
  26. zeichneAst(0,Stage.width/2, Stage.height, "0x000000");
Schritt für Schritt:
verlege deinen baum in ein array. z.b.:
gAst[0] ist immer der stamm
ast1:1 verweisst darauf, das es einen zweig gibt, in gAst[1] definiert.
ast2:0 da wäre noch kein zweig drann, der könnte beim nächsten mal ergänzt werden mit zweig2:2 und gAst[2]...
oder z.b. zweig1 in gAst[1] usw.
ActionScript:
  1. var gAst = new Array();
  2. gAst[0] = {x:0, y:0, zweig1:1, zweig2:0};
  3. gAst[1] = {x:30, y:-50, zweig1:0, zweig2:0};
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (29-12-2004 um 15:43 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 29-12-2004, 15:35   #4 (permalink)
Neuer User
 
Benutzerbild von Raphael79
 
Registriert seit: Sep 2004
Ort: Hamburg
Beiträge: 35
Nee, das verstehe ich ehrlich gesagt nicht ganz. Geht das nicht gegen die Idee der Rekursion? Ich meine, eigentlich sollte die Funktion doch unabhängig von der Anzahl der Äste funktionieren.. Oder verstehe ich das Falsch?!
Hast du das ausprobiert bei dir, und ging es?

Danke,
Raphael
Raphael79 ist offline   Mit Zitat antworten
Alt 29-12-2004, 15:40   #5 (permalink)
Neuer User
 
Benutzerbild von Raphael79
 
Registriert seit: Sep 2004
Ort: Hamburg
Beiträge: 35
Na, da habe ich wohl geantwortet, als du gerade geantwortet hast!
Aber das ist es! Danke! Klar, ich hab die Funktion gestoppt bevor er überhaupt die Rekursionen zurücklaufen lassen konnte, ich Idiot

Weißt du auch wie man am elegantesten diesen Baum nun Schritt für Schritt animieren kann? Ist man auf Frameaktionen angewiesen oder wie macht man das am besten bei Rekursionen?

Vielen Dank,
Raphael
Raphael79 ist offline   Mit Zitat antworten
Alt 29-12-2004, 15:45   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
"..da habe ich wohl geantwortet, als du gerade geantwortet hast!.."
dito
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele