Autor Beitrag
seppel86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54



BeitragVerfasst: Mo 17.01.05 17:40 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54



BeitragVerfasst: 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
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54



BeitragVerfasst: Mo 17.01.05 18:08 
Au ja, das wär schön einfach. Muss aber gezeichnet sein.
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden volle Höhe 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;