![]() |
Eine Eigene Linen Zeichnen ?
Hallo,
da ich schon länger Zeit für verschiedene Zwecke eine eigene Linen Zeichne möchte, habe ich diese Code heute geschrieben:
Delphi-Quellcode:
Ich würde gerne von euch wisse, ob dieser Code alle Situationen Abdeckt und ob es "noch schneller" geht.
procedure DrawLinePluto(aCanvas:TCanvas; const x1,y1,x2,y2:Integer; PenColor:TColor);
var wx,wy:Integer; fx,fy,mx,my:Integer; begin wx:=abs(x2-x1); wy:=abs(y2-y1); fx:=x1; fy:=y1; if wx = 0 then mx:=0 else mx:=+1; if wy = 0 then my:=0 else my:=+1; while True do begin aCanvas.Pixels[fx,fy]:=PenColor; fx:=fx+mx; fy:=fy+my; if (my <> 0) and (fy = y2) then break; if (mx <> 0) and (fx = x2) then break; end; end; Im Internet habe ich leider nur sehr viele Beschreibungen gesehen, die mir zu Kompliziert beschrieben wahren. Ich möchte später nach einigen Tests, verschiedene Varianten von dieser Procedere erstellen. Z.b. Welche Die Mehrer Farben da stellen könne, im Moment kann die Line ja nur in einer Farbe da gestellt werden. Mein Ziel ist es mehrer Farben hinzubekommen, und mit Farb Muster und sowas. das ist aber nicht weiter schwierig. Was haltet ihr von der Procedere ? edit:
Delphi-Quellcode:
So diese Procedere kann jetzt auch mit Negativen Werten arbeiten(scheint auf jedenfall so)procedure DrawLinePluto(aCanvas:TCanvas; const x1,y1,x2,y2:Integer; PenColor:TColor); var wx,wy:Integer; fx,fy,mx,my:Integer; begin wx:=x2-x1; wy:=y2-y1; fx:=x1; fy:=y1; if wx = 0 then mx:=0 else mx:=+1; if wy = 0 then my:=0 else my:=+1; while True do begin aCanvas.Pixels[fx,fy]:=PenColor; if wx > 0 then fx:=fx+mx else fx:=fx-mx; if wy > 0 then fy:=fy+my else fy:=fy-my; if (my <> 0) and (fy = y2) then break; if (mx <> 0) and (fx = x2) then break; end; end; Edit2: Leider kann diese Procedere nur Perfekte Lienen da stellen, was aber nicht immer sinvoll ist. es werden keine "Treppen" Lienen gezeichnet. |
Re: Eine Eigene Linen Zeichnen ?
|
Re: Eine Eigene Linen Zeichnen ?
das weiß ich auch, aber dort kann man nicht ohne weiteres eine Line z.b. in mehrer Farben zeichnen ohne das mühevoll mit Polygonen oder anders zu lösen.
ich kenne die TCanvas Klasse sehr gut. Edit01: Erste Tests haben ergeben, das diese Procedere leider nicht mit negativen Zahlen umgehen kann. hat einer eine Idee wie ich das am einfachsten einbauen könnte ? |
Re: Eine Eigene Linen Zeichnen ?
Ich schätz mal das der Code hier
Delphi-Quellcode:
das gleiche macht wie deiner... :idea:
procedure DrawLine(aCanvas: TCanvas ; x1,y1,x2,y2: Integer ; color: TColor);
var crntColor: TColor; begin crntColor := aCanvas.Pen.Color; aCanvas.Pen.Color := color; aCanvas.MoveTo(x1,y1); aCanvas.LineTo(x2,y2); aCanvas.Pen.Color := crntColor; end; wegen den negativen zahlen: Im Form links oben ist (0|0) weiter nach links gehts in dem fall nicht. Du müsstest da dann ein Offset einbauen das bspw. gezeichnet 50 gerechnet 0 ist. |
Re: Eine Eigene Linen Zeichnen ?
Zitat:
folgender Aufruf klappt (verständlicher Weise) nicht:
Delphi-Quellcode:
es wird eine Linie gezeichnet im 45 Grad Winkel aber nicht zu dem Punkt den ich angegeben habe. Die Funktion ist so nutzlos, die Logic stimmt einfach nicht.
DrawLinePluto(Self.Canvas, 0, 0, 150, 600, clBlue);
Dein Quelltext bewirkt das du eintweder in jedem Schritt 1 oder gar kein Pixel nach Rechts und unten gehst. Das bewirkt logischer Weise ein 45 Grad Winkel oder 0 Grad. |
Re: Eine Eigene Linen Zeichnen ?
Ja ! da gebe ich dir Recht.
Aber ich möchte ja später die Möglichkeit haben eine mehrfarbige Line zu gestalten das ist mit MoveTo und LieneTo leider sehr aufwendig. und mit Poligonen möchte ich das erst recht nicht machen. Außerdem möchte ich selber verstehen wie ein DDA Algorithmus arbeitet . Es gibt für viele mehrer Möglichkeiten je nach dem was man gerade braucht bzw. machen möchte. Wie mein Zweck eignet sich MoveTo und LineTo leider nicht. es sei denn man kann irgendwie mit nur einem Procedere Aufruf mehrfarbig zeichnen. edit: was schlägst du also vor ? |
Re: Eine Eigene Linen Zeichnen ?
ich schlage eine Verhältnisgleichung vor.
Wenn eine Linie von x1 nach x2 gezeichnet werden soll dann muss x bei der hälfte der Stecke auch auf der y-Achse die hälfte der Stecke zurück gelegt haben. |
Re: Eine Eigene Linen Zeichnen ?
Ja das ist logisch..... und weiter ?
edit: Aber das mache ich doch schon im Prinzip ? beide Variablen werden um den gleichen Faktor erhört..... |
Re: Eine Eigene Linen Zeichnen ?
du erhöhst nicht um einen Factor sondern um 1 oder 0
|
Re: Eine Eigene Linen Zeichnen ?
wie meinst du das ?
Wenn es eine Negative Line ist verringere ich den "Faktor" und wenn es eine Positive ist erhöhe ist sie. Aber was müsste ich jetzt genau ändern damit das klappt ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz