Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Rekursiver Aufruf (Frakaler Baum)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 05.02.2008, 00:49    Titel: Rekursiver Aufruf (Frakaler Baum) Antworten mit Zitat

Hallo!

War schon lange nicht mehr da, aber jetzt steh ich wiedermal voll an.

Ich möchte gerne einen fraktalen Baum programmieren. Aber ich schaffs irgendwie nicht dass die Funktion sich selbst so aufruft, dass sie einen "Baum" erschafft. Ich möchte als endergebnis s einen Baum haben der sich als erstes in zwei Äste aufteilt und diese sollten sich dann wieder in zwei Äste aufteilen, aber ich schaff des einfach ned... Kann mir jemand helfen?

Achja... Ich würde das ganze ganz gern rekursiv machen, also die Funktion ruft sich selbst nochmal auf usw grinsen
_________________
Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>


Zitat:
Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler.
by DJ. Peters
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 05.02.2008, 08:33    Titel: Antworten mit Zitat

Dazu musst du der Funktion eine Laufnummer übergeben, welche du in der funktion auswertest, und anhand dieser bestimmst, wie viele durchläufe in der funktion ausgeführt werden, bevor sie verlassen wird.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 05.02.2008, 10:44    Titel: Antworten mit Zitat

So könnte es im Endeffekt aussehen:

Code:
type Tree
    as tree ptr left, right ' linker und rechter Ast
    as integer depth ' Baumtiefe
end type

function CreateTree (depth as integer) As Tree Ptr   
    Dim as tree ptr myTree = callocate(sizeof(Tree)) ' Speicher für Baum allokieren

    If depth > 0 then   
        myTree->left = CreateTree (depth-1)
        myTree->right = CreateTree (depth-1)
    End If
   
    myTree->depth = depth
   
    Return myTree   
   
end function

Dim Baum As Tree Ptr = CreateTree (3) ' Erstellt einen Baum der Tiefe 3


Erklärung:
Jeder Baum hält zwei weitere Baum-Pointer, nämlich für seinen linken und seinen rechten Ast. Die Tiefe (depth) sollte selbsterklärend sein. Joa, ansonsten gibt es ja nicht viel zu erklären. Außer vielleicht wie du den Baum rekursiv durchsuchen kannst:

Code:
sub VisitTree (myTree as Tree Ptr, depth as Integer)

    ' <- Hier beispielsweise Baum-Inhalt ausgeben

    if myTree->depth > 0 then
        VisitTree (myTree->left, depth-1)
        VisitTree (myTree->right, depth-1)   
    end if
end sub 


Dies ist allerdings nur eine Variante, wie man einen Baum entwerfen kann. Ich zum Beispiel habe einen Quadtree für Kollisionerkennung (2D) in Entwicklung.

Viel Spaß damit!
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 05.02.2008, 23:02    Titel: Antworten mit Zitat

Von mir sonst ein sehr einfach gehaltenes Beispiel:

http://beilagen.dreael.ch/QB/FRAKTAL.BAS

Der Grundzweig ist in diesem Beispiel beabsichtigt konstruiert, wobei die "Nadeln" aufgrund des rekursiven Aufrufs selber wiederum Zweige darstellen und so schlussendlich ein fraktaltypisches, selbstähnliches Gebilde entsteht.

Codebeispiel dürfte evtl. sogar 1:1 in FreeBasic lauffähig sein, ansonsten kann ein FB-Profi das Beispiel noch anpassen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 05.02.2008, 23:47    Titel: Antworten mit Zitat

Also eig. wollte ich des ganzte einen graphischen Baum zeichnen lassen und dann auch möglichst ohne Pointer, da ich das ganze auch auf einem handy in Python implementieren wollte... Ich kenn ja die Forums regeln, dass ich erstmal was liefern sollte, aber ich hab grad nix in der Hand weil ich aus verzweiflung alles weggeworfen hab... Das wo ich wirklich hänge ist, dass die Funktion wissen muss in welcher Tiefe sie liegt...

Ah! Ich hab was ausgegraben:

Code:

const pi=3.141592
randomize timer

function branch(x,y,depth,child,r,maxdepth,n)
'x=Anfangspunkt x
'y=-"- y
'depth=Tiefe der Verzweigung (wie vielter Recall der Funktion)
'child=Anzahl der 'Kinder', also wie viele neue Funktionen aufgerufen werden sollen.
'r=Länge des Astes
'maxdepth=Maximale Tiefe der Iteration (Iterationsanzahl)

depth+=1
r*=0.5
a=pi*2*rnd
x1=x+cos(a)*r
y1=y+sin(a)*r
line (x,y)-(x1,y1),&hffffff

if depth<=maxdepth then
branch(x1,y1,depth,child,r,maxdepth)
endif
end function


Kann man damit wenigstens irgendwas anfangen?
_________________
Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>


Zitat:
Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler.
by DJ. Peters
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 06.02.2008, 01:53    Titel: Antworten mit Zitat

Du wirst statt des Aufrufs
Code:
branch(x1,y1,depth,child,r,maxdepth)

vermutlich etwas in dieser Art brauchen:
Code:
for i as integer = 1 to child
  branch(x1,y1,depth,child,r,maxdepth)
next

(übrigens END IF statt ENDIF zwinkern )
Das wird den Baum aber nicht von oben nach unten zeichnen, sondern Ast für Ast.
Warum nimmst du überhaupt eine Funktion? Hat doch keinen Rückgabewert, würde ich lieber eine Sub nehmen.

Nachtrag: das ganze sieht meines Erachtens ein wenig besser aus, wenn du
Code:
a=pi*rnd

nimmst - dann geht der Baum zumindest immer nach unten und überlappt sich nicht gar so übel. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 06.02.2008, 02:26    Titel: Antworten mit Zitat

Ok, ist klar, aber selbst wenn ich die deiden zusätze benutze zeichnet der nicht von oben nach unten alle äste, sondern einen und bricht dann ab...
_________________
Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>


Zitat:
Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler.
by DJ. Peters
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 06.02.2008, 12:10    Titel: Antworten mit Zitat

Also, bei mir zeichnet er alle Äste ...
Code:
const pi=3.141592
randomize timer
screen 18

sub branch(x as integer, y as integer, depth as ubyte, child as ubyte, r as ubyte, maxdepth as ubyte)
  'x=Anfangspunkt x
  'y=-"- y
  'depth=Tiefe der Verzweigung (wie vielter Recall der Funktion)
  'child=Anzahl der 'Kinder', also wie viele neue Funktionen aufgerufen werden sollen.
  'r=Länge des Astes
  'maxdepth=Maximale Tiefe der Iteration (Iterationsanzahl)

  depth+=1
  r*=0.5
  dim as single a=pi*2*rnd
  dim as integer x1=x+cos(a)*r, y1=y+sin(a)*r
  line (x,y)-(x1,y1), 15

  if depth<=maxdepth then
    for i as integer = 1 to child
      branch(x1,y1,depth,child,r,maxdepth)
    next
  end if
end sub

' Hier mal ein Test
dim taste as string
do
  cls
  branch 200, 200, 0, 7, 500, 5
  taste = input(1)
loop until taste = chr(27)


Habe sonst nur ein paar Änderungen wegen des DIM und der Farbwahl vorgenommen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 06.02.2008, 16:39    Titel: Antworten mit Zitat

omfg... es funktioniert?!

Bei mir hat des nie geklappt...

Nagut grinsen Vielen vielen vielen dank! Das ist ein echter durchbruch für mich! durchgeknallt lachen
_________________
Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>


Zitat:
Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler.
by DJ. Peters
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 07.02.2008, 01:05    Titel: Antworten mit Zitat

So, ich hab das ganze jetzt mal so weit wie ichs eig. wollte. Vielleicht könnte sich jemand nochmal das ganze anschauen und mir bugs suchen, die ich bis jetzt noch nicht lösen konnte... danke lachen

Code:

'Woods of Chaotic Decay
'by psygate
'Use as you like, but give credits.
'Thanks to nemored for help, and drael for his fractal code.

CONST pi=3.141592
randomize TIMER
'SCREEN 18
screenres 640,480,24,,
SUB branch(x AS INTEGER, y AS INTEGER, depth AS UBYTE, child AS UBYTE, r AS UBYTE, maxdepth AS UBYTE)
    dim as ubyte r1,g1,b1,d
  'x=Anfangspunkt x
  'y=-"- y
  'depth=Tiefe der Verzweigung (wie vielter Recall der Funktion)
  'child=Anzahl der 'Kinder', also wie viele neue Funktionen aufgerufen werden sollen.
  'r=Länge des Astes
  'maxdepth=Maximale Tiefe der Iteration (Iterationsanzahl)

  depth+=1
  r*=0.5
  DIM AS SINGLE a
  DIM AS INTEGER x1,y1
 
  if depth=1 then               'if first line, stam (sry, my english is a bit rusty happy) should be upwards, not sidewards.
      a=3*pi/8+pi+pi/8*2*rnd
  elseif depth>1 then
      a=-pi*RND                 'Branches can go everywhere but down.
  end if
 
  x1=x+COS(a)*r
  y1=y+SIN(a)*r
 
  g1=int(rnd*255)               'Setting colours for the leafes, GREEN
  r1=int(rnd*(g1-10))           'Smaller than green, or the leaf isn't green anymore...
  b1=r1
  if depth=1 then               'If first line, stam should be brown (must work on that).
      r1=128+int(rnd*128)
      g1=r1/2+int(rnd*(r1/4))
      b1=g1
  endif
 
  if r1<g1 then r1=0:b1=0       'I forgot what that line now really does... sry happy
  'Routine für Brauntöne fehlt noch...
'  if depth<maxdepth/2 then
'        d=int(rnd*3)
'        if d=0 then
'            r1=int(rnd*255)
'            g1=r1
'            b1=int(rnd*(r1-10))
'        elseif d=1 then
'            r1=int(rnd*255)
'            g1=r1-128
'            b1=int(rnd*g1)
'        elseif d=2 then
'            r1=int(rnd*255)
'            g1=int(rnd*(g1-128))
'            b1=int(rnd*(b1-128))
'        end if
'  end if

  LINE (x,y)-(x1,y1), rgb(r1,g1,b1)

  IF depth<=maxdepth THEN
    FOR i AS INTEGER = 1 TO child
      branch(x1,y1,depth,child,r,maxdepth)
    NEXT
  END IF
END SUB

' Hier mal ein Test
DIM taste AS STRING
DO
  'CLS
  branch int(rnd*640), 479, 0, 2+int(rnd*3), 10+int(rnd*190), 4+int(rnd*6)
  taste = inkey$'INPUT(1)
  sleep 100
LOOP UNTIL taste = CHR(27)

_________________
Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>


Zitat:
Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler.
by DJ. Peters
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 07.02.2008, 01:58    Titel: Antworten mit Zitat

Sieht doch schön aus lächeln
Bis auf ein weiteres ENDIF habe ich fast nichts zu meckern grinsen - na ja, ein bisschen was ist mir aufgefallen:
Code:
'Thanks to nemored for help, and drael for his fractal code.

nicht drael, sondern dreael.

Code:
  if r1<g1 then r1=0:b1=0       'I forgot what that line now really does... sry happy

Wenn alles richtig laufen würde, hättest du damit immer einen reinen Grünton (außer für den Stamm), weil r1 ja immer kleiner als g1 sein sollte. Dass dies nicht so ist, liegt hieran:
Code:
  r1=INT(RND*(g1-10))           'Smaller than green, OR the leaf isn't green anymore...

Wenn g1 < 10 ist, dann kommen für r1 negative Werte heraus, die als UBYTE wieder positiv interpretiert werden und dann größer als g1 sind.

Code:
if depth=1 then               'if first line, stam (sry, my english is a bit rusty happy) should be upwards, not sidewards.

Meinst du den Baumstamm? Ich denke aber branch wäre ein passendes Wort.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
psygate



Anmeldungsdatum: 05.04.2005
Beiträge: 304
Wohnort: Wien und der Computer

BeitragVerfasst am: 07.02.2008, 16:06    Titel: Antworten mit Zitat

<okok, um 2 in der nacht nach latein und fanzösisch hüs keine englisch ausflüge mehr durchgeknallt
_________________
Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>


Zitat:
Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler.
by DJ. Peters
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 07.02.2008, 18:49    Titel: Antworten mit Zitat

@nemored: Was spricht gegen "EndIf"?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz