Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Rekursion mit 2 selbstaufrufen?!?


seppel86 - Mo 17.01.05 17:40
Titel: Rekursion mit 2 selbstaufrufen?!?
Hi,
ich soll ein Programm schreiben,welches in ein Image feld oder in die TForm ein "T" zeichnet. Bei einem 2. Durchgang zeichnet das Programm jeweils links und rechts über das T 2 kleinere T bis die Abbruchbedingung erfüllt ist.
Als Ansatz wollte ich eine Rekursion mit 2 selbaufrufen machen innerhalb der if Bedingung machen. Aber ich hab keine Ahunung wie ich das Umsetzen soll...

Schonmal viel dank für eure Hilfe,
Seppel86


Moderiert von user profile iconChristian S.: Topic aus Sonstiges verschoben am Mo 17.01.2005 um 16:42


jasocul - Mo 17.01.05 17:43

Woran scheitert es denn?
An der Rekursion oder am zeichnen der Ts?
Und was hast du schon versucht?


seppel86 - Mo 17.01.05 18:02

Wenn dus wissen willst an beidem.
Ich zeichne zuerst quasi die linke seite vom T und beim zweiten aufruf die rechte. Jedoch zeichnet er das nicht so wie gedacht. Ich ziehe die linie hoch und von da aus mit canvas(x-(l div 2),y) nach links. Jedoch geht die linie nicht nach links sondern schräg runter.
Ausserdem hab ich noch ne entlosschleife sobald ich den zweiten Aufruf mit einbaue, aber das krieg ich schon selbst hin.

Mfg,
seppel86


Delete - Mo 17.01.05 18:05

Mag jetzt der mir unbekannten Aufgabenstellung widersprechen, aber kennst du Canvas.TextOut ?
Einfach die Schriftgröße immer en wenig verkleinern und schön rekursiv immer an der richtigen Stelle ein neues, kleineres T ausgeben. Dürfte doch recht schnell gemacht sein oder?


seppel86 - Mo 17.01.05 18:08

Au ja, das wär schön einfach. Muss aber gezeichnet sein.


Delete - Mo 17.01.05 18:39

Hier wär mal ne Lösung. Die Ts werden zwar nebeneinander gezeichnet, aber das sollte kein Problem sein. Vom Prinzip her könntest du das so aufbauen, musst aber noch an der Anordnung der Ts feilen, die überschneiden sich in den hinteren Durchläufen stark.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure PrintT(x,y,size: integer; canvas: TCanvas); // Ein T zeichnen
var
  Quer: integer;
begin
  Quer := round(1/2*size);
  with canvas do
  begin
    moveto(x, y+size div 2);
    lineto(x, y-size div 2);
    moveto(x-Quer div 2, y-size div 2);
    lineto(x+Quer div 2, y-size div 2);
  end;
end;

procedure PrintTMatrix(x,y,Size: integer; canvas: TCanvas); 
var
  NewSize: integer;
begin
  if Size < 8 then exit; // Abbruchbedingung: Höhe der nächsten Generation < 8
  NewSize := Size - 10;
  PrintT(x,y,Size, canvas);

  Application.ProcessMessages;
  PrintTMatrix(x+round(size*1.5), y+Newsize div 2 + 1, NewSize, canvas); // Unten rechts neues T
  PrintTMatrix(x+round(size*1.5), y-Newsize div 2 - 1, NewSize, canvas); // Oben    "      "    "
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  printTMatrix(x,y,40, canvas);
end;