![]() |
MoveTo/LineTo
Ich bin gerade ein wenig verwundert ueber LineTo / Polyline. Diese zeichnen die Linie nicht bis zum angegeben Punkt sondern hoeren einen Pixel vorher auf. War das schon immer so, oder liegt das an einstellungen (Windows7 / canvas.Pen / Grafikkarte etc.) ?
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var x: Integer; begin x := 2; // Fadenkreuz zu kurz Canvas.MoveTo(100 - x, 100); Canvas.LineTo(100 + x, 100); Canvas.MoveTo(100, 100 - x); Canvas.LineTo(100, 100 + x); // vollständiges Fadenkreuz Canvas.MoveTo(150 - x, 150); Canvas.LineTo(150 + x, 150); Canvas.LineTo(150 - x, 150); Canvas.MoveTo(150, 150 - x); Canvas.LineTo(150, 150 + x); Canvas.LineTo(150, 150 - x); end; |
AW: MoveTo/LineTo
Ja, das ist schon immer so.
Tipp: ![]() Zitat:
PS: In den letzten 30 Tagen gab es schonmal einen Thread, bezüglich dem Zeichnen auf das Canvas. So, du malst auf die Form und jetzt rate mal, was passiert, wenn irgendwer (Windows, der Button oder ein anderes Programm, was mal über deiner Form lag) deine Form dazu bringt sich neu zu malen ... genau, Deines ist wieder weg. :stupid: > TPaintBox und/oder OnPaint |
AW: MoveTo/LineTo
Du hast meine Frage nicht verstanden.
|
AW: MoveTo/LineTo
Beim zweiten Lesen schon.
Aber nicht nochmal hochschauen. Hatte es zwischenzeitlich heimlich geädert. |
AW: MoveTo/LineTo
Hab mir die msdn fuer Polyline angeschaut, da stands nicht drin. Embarcadero hats von LineTo ausm msdn ubernommen, da stehts drin. Ist also gelöst.
Btw. das betrifft auch Canvas.Ellipse etc. |
AW: MoveTo/LineTo
Ein Polygon kann man als viele LineTo betrachten.
Da wäre es natürlich "sinnlos", wenn die Verbindungspunkte doppelt gezeichnet würden. :stupid: Aber ja, ich fände es auch schöner, wenn man ![]() (wie das im FMX implementiert ist ... k.A.) Bei einer 1-Pixel breiten Linie könnte man noch ein Pixel anhängen (einzeln auf X,Y draufmalen). |
AW: MoveTo/LineTo
Edit:
Man kann den vorletzten Punkt nochmal zeichnen (als letzten) dann geht das denke ich auch mit dickeren Linien. Ich bekomm es aber z.B. nicht hin einen symmetrischen 2-Pixel breiten Kreis zu zeichnen:
Delphi-Quellcode:
Canvas.Pen.Width := 1;
x := 2; Canvas.MoveTo(150 - x, 150); Canvas.LineTo(150 + x, 150); Canvas.LineTo(150 - x, 150); Canvas.MoveTo(150, 150 - x); Canvas.LineTo(150, 150 + x); Canvas.LineTo(150, 150 - x); x := 5; Canvas.Pen.Width := 2; Canvas.Brush.Style := bsClear; Canvas.Ellipse(150 - x, 150 - x, 150 + x + 1, 150 + x + 1); |
AW: MoveTo/LineTo
Das Fadenkreuz bekommst du schon hin, nur solltest du MoveTo immer zurückstellen
Delphi-Quellcode:
Wieso gibt es aber Probleme wenn man es normal macht? Ich denke das Problem liegt am Pinsel, denn auch wenn du nur eine 1 Pixel breite Linie zeichnest, wird es intern vermutlich (ich weiß es nicht, es erscheint mir nur logisch) mit einem 1 Pixel breitem Pinsel gezeichnet. Und der wird evtl. berechnet, wodurch sich Rundungsfehler ergeben können.
Canvas.MoveTo(100, 100);
Canvas.LineTo(100 - x, 100); Canvas.MoveTo(100, 100); Canvas.LineTo(100 + x, 100); Canvas.MoveTo(100, 100); Canvas.LineTo(100, 100 - x); Canvas.MoveTo(100, 100); Canvas.LineTo(100, 100 + x); |
AW: MoveTo/LineTo
Meines Wissens zeichnet LineTo bis zum Pixel (im Gegensatz zu Rectangle und Co.)?
Edit: Mit LineTo können Sie eine Line von PenPos zum Punkt (X,Y) ziehen. Der Zielpunkt selbst gehört jedoch nicht mehr zur Linie. LineTo ändert den Wert von PenPos in (X,Y). Die Linie wird mit dem aktuellen Stift gezeichnet. Anmerkung: Wenn der aktuelle Stift nicht den Stil psSolid hat, wird die Linie mit dem Hintergrund gezeichnet, den der aktuelle Pinsel vorgibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 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