![]() |
Re: Eine Eigene Linen Zeichnen ?
probier mal folgende Funktion:
Delphi-Quellcode:
Wie bereits erwähnt geht es hier um ein Verhältnis damit die Linie nicht 45 Grad wird und nicht wie du es machst entweder +1 oder 0. Sondern der X Punkt muss sich zum Y Punkt in dem Verhältnis ändern wie das Verhältnis der Länge der Linien ist.
procedure DrawLine(ACanvas: TCanvas; x1, y1, x2, y2: Integer; AColor: TColor);
var lCount, lDistanceX, lDistanceY, lStepSize : Integer; begin lDistanceX := x2 - x1; lDistanceY := y2 - y1; if Abs(x2 - x1) < Abs(y2 - y1) then begin lCount := 0; if (lDistanceY > 0) then lStepSize := +1 else lStepSize := -1; while (lCount <> lDistanceY) do begin ACanvas.Pixels[x1 + Trunc(lCount * lDistanceX / lDistanceY), y1 + lCount] := AColor; lCount := lCount + lStepSize; end; end else begin lCount := 0; if (lDistanceX > 0) then lStepSize := +1 else lStepSize := -1; while (lCount <> lDistanceX) do begin ACanvas.Pixels[x1 + lCount, y1 + Trunc(lCount * lDistanceY / lDistanceX)] := AColor; lCount := lCount + lStepSize; end; end; ACanvas.Pixels[x2, y2] := AColor; end; |
Re: Eine Eigene Linen Zeichnen ?
BESTEN DANK ! Ich werde ihn mir mal genau ansehen.
|
Re: Eine Eigene Linen Zeichnen ?
wie gesagt. Es geht darum im Verhältnis etwas zu berechnen.
Wenn du zum Beispiel eine Linie von x: 0 - y: 0 nach x: 10 - y: 40 zeichnen willst, musst du bei jedem Schritt auf der X-Achse 4 Schritte auf der Y-Achse gehen. Du musst also das Verhältnis der X-Distance zur Y-Distance gleich setzen mit dem SchrittX zu SchrittY. Nennt sich glaub ich auch Dreiecksgleichung. Wenn du später mal eine Linie mit Farbverlauf zeichnen willst musst du die Farbanzteile zur Länge der Linie ebenso ins Verhältnis setzen. |
Re: Eine Eigene Linen Zeichnen ?
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal die alte Demo von mir mit den Marching Ants. Da ist noch eine andere Möglichkeit aufgezeigt.
/EDIT: Aber basiert auf einem WinAPI Befehl! |
Re: Eine Eigene Linen Zeichnen ?
Danke Muetze1 werde ich mir gleich mal ansehen.
Ich finde dieses Thema im Moment recht Intressant, weil ich mich in den letzten 10 Jahren wo ich mit Object Pascal arbeite damit mich noch nie befast habe. Später geht es mir auch noch um andere Figuren wie z.b. Kreise, Vierecke, Abgerundete Ecken.... Aber erstmal die Line mein Ziel ist es in erster Line SirThornberry Procedure so zu erweitern, das ich Linen Style verwenden kann(eigene) und natürlich Farb Style die man mit den Linen Style Verbinden kann. Wie das geht weiß ich schon. Kennt jemand von euch ein Tutorial was das gut beschreibt ? also mit einfachen Wörtern die jeder "normale" Mensch versteht ? Weil auf den meisten seiten die ich zum Thema gefunden habe, wird leider alles über Formulen erklärt, aber ich habe keine Idee, wie man diese Formueln verstehen soll.... Wie gesagt, ich möchte dieses Thema verstehen..... |
Re: Eine Eigene Linen Zeichnen ?
ich habe in deiner Pas Datei gesehen, das du
LineDDA benutz, was mir nicht viel Weiter hilf. Ich wollte ja eine eigene Funktion, Ich meine diese Procedure gibt es auch für Lazarus. Trotzdem Danke ! |
Re: Eine Eigene Linen Zeichnen ?
ich habe jetzt die Procedure erweitert von:SirThornberry Vielen Dank noch mal für dein Code.
Delphi-Quellcode:
Nun Kann sie mit Farb Stylen und Linen Stylen umgehen*freu*
procedure DrawLine(ACanvas: TCanvas; x1, y1, x2, y2: Integer; AColor: TColor; style:array of Boolean; FarbStyle:array of TColor);
procedure StyleFarbeLine(var zc,zw,z,lenStyle, lenColor,W:Integer); begin if (lenStyle > -1) and (lenColor > 0) then begin if zc +1 <= lenColor then inc(zc) else zc:=0; end; // lenColor if lenStyle > -1 then begin if z +1 <= Length(style) then inc(z) else z:=0; end; // lenStyle if (lenStyle = -1) and (lenColor > 0) then begin if zw+1 >= w then begin zw:=0; if zc+1 <=lenColor then inc(zc); end else inc(zw); end; end; var lCount,lDistanceX,lDistanceY,lStepSize: Integer; z,zc,lenColor,lenStyle,w,zw:Integer; lc:TColor; begin lDistanceX := x2 - x1; lDistanceY := y2 - y1; z:=0; zc:=0; zw:=0; lenColor:=Length(FarbStyle); lenStyle:=Length(style)-1; if lenColor = -1 then lc:=AColor; if Abs(x2 - x1) < Abs(y2 - y1) then begin lCount := 0; if (lDistanceY > 0) then lStepSize := +1 else lStepSize := -1; w:=abs(lDistanceY div lenColor); while (lCount <> lDistanceY) do begin if lenColor > 0 then lc:=FarbStyle[zc]; if (lenStyle = -1) or (lenStyle >= 0) and (style[z]) then ACanvas.Pixels[x1 + Trunc(lCount * lDistanceX / lDistanceY), y1 + lCount] := lc; StyleFarbeLine(zc,zw,z,lenStyle,lenColor,w); lCount := lCount + lStepSize; end; end else begin lCount := 0; if (lDistanceX > 0) then lStepSize := +1 else lStepSize := -1; w:=abs(lDistanceX div lenColor); while (lCount <> lDistanceX) do begin if lenColor > 0 then lc:=FarbStyle[zc]; if (lenStyle = -1) or (lenStyle >= 0) and (style[z]) then ACanvas.Pixels[x1 + lCount, y1 + Trunc(lCount * lDistanceY / lDistanceX)] := lc; StyleFarbeLine(zc,zw,z,lenStyle,lenColor,w); lCount := lCount + lStepSize; end; end; ACanvas.Pixels[x2, y2] := AColor; end; // Beispiel Aufruf: DrawLine(PaintBox1.Canvas,mx,my,x,y,clRed,[],[clred,clBlue,clYellow]); Edit00: Proceure geändert. Edit01: Neue Version von der Proceure: Jetzt dürfte alles klappen. Ich hatte im Obigen teil ein abs vergessen bei der w Zuweisung. |
Re: Eine Eigene Linen Zeichnen ?
Zitat:
Und warum sollte dir die Funktion (neben dem eben erwähnten) denn nicht helfen? Die Funktion implementiert den Linien-zeichnen Algorithmus und berechnet jeden einzelnen Punkt, welcher zu Zeichnen ist und ruft zum zeichnen jeweils die angegebene Funktion auf. Somit kannst du doch deinen Style/Farbe etc frei anpassen. Du wirst für jeden einzelnen Punkt aufgerufen. Von daher kapier ich deinen Einwand nicht oder du hast die Funktion nicht im Detail verstanden. |
Re: Eine Eigene Linen Zeichnen ?
ehrlich gesagt, habe ich mir die Funktion lineDDA gar nicht angesehen....
ich habe nur die Parameter gesehen und das reichte mir schon. Du meinst damit ist sowas schon möglich ? von Windows aus ? Bunte Linen ? |
Re: Eine Eigene Linen Zeichnen ?
so wie ich muetze verstanden habe gibt man eine callbackmethode an welche dann für das zeichnen jedes pixels aufgerufen wird
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 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-2025 by Thomas Breitkreuz