MannoMann ... das wird eine Geburt
Wie gesagt... ich kenne die ganzen Routinen wie LineTo, MoveTo ... etc...
Das ist doch alles gar kein Problem ....
Also ... ich nenne mal ein Beispiel *gg* (mal wieder)
Also es gibt ja die Anweisung: Paintbox1.Canvas.Lineto(30,50);
sprich es wird eine Linie von der letztes Position des Stifts nach 30,50 gezeichnet.
Jetzt brauch ich aber eine Routine um ein gefülltes Dreieck auf ein Canvas zu zeichnen. (ich denk du bist dir der Problematik gar nicht bewusst, die dahinter steckt) Mit ein paar LinesTo und MovesTo ist das nicht gegessen.
Ich zeig Dir mal nen Algo zum Dreieckzeichnen:
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: 33: 34:
| procedure TDreieck.Zeichnen(canv:Tcanvas;ax,ay,bx,by,cx,cy:integer;Farbe:TColor); var y : integer; { Schleifenvariable für die Scanzeile } x1,x2,x3 : real; { x-Werte für Scanline-Algorithmus } m1,m2,m3 : real; { Increments für die x-Werte } begin Canv.Pen.Color:=Farbe; Canv.Brush.Color:=Farbe; x1 := ax; { x-Wert Linie A -> B } x2 := bx; { x-Wert Linie B -> C } x3 := ax; { x-Wert Linie A -> C }
m1 := (bx-ax) / (by-ay); { Increments A -> B } m2 := (bx-cx) / (by-cy); { Increments B -> C } m3 := (cx-ax) / (cy-ay); { Increments A -> C }
for y := ay to by-1 do { erste Teilfläche } begin Canv.MoveTo(round(x1), y); Canv.LineTo(round(x3), y); // Line (round(x1), y, round(x3), y, color); { horiz. Linie } x1 := x1 + m1; x3 := x3 + m3 end;
for y := by to cy do { zweite Teilfläche } begin Canv.MoveTo(round(x2), y); Canv.LineTo(round(x3), y); // Line (round(x2), y, round(x3), y, color); { horiz. Linie } x2 := x2 + m2; x3 := x3 + m3 end end; |
stör dich nicht an dem TDreieck... ist nur ne selbst erstellte Klasse.
Dieser Algorithmus ist aber ziemlich schlampig und nicht geeignet für beliebig kleine Dreiecke....
(wie ich im letzten Beitrag schon gesagt hab - so würde das aussehen, wenn man den Code "hinklatscht")
Es gibt doch bestimmt noch elegantere
und vor allem performantere Lösungen.... Leute aus dem 3D Bereich, die eigene Engines geschrieben haben dürften das doch kennen
P.S.: Schulzeit liegt laaaaaaaaaange hinter mir
