Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   moveto, lineto (https://www.delphipraxis.net/209138-moveto-lineto.html)

jotbeyer 1. Nov 2021 07:15

Delphi-Version: 11 Alexandria

moveto, lineto
 
Moin zusammen,

mir ist bekannt, dass lineto ansetzt (startet) bei dem durch moveto(x,y) definierten Punkt und eine Linie zeichnet, allerdings den letzten Punkt der Linie nicht.
So weit so gut.
Wenn ich aber lineto der Länge Null setze, also moveto(x,y) und danach LineTo(x,y), dann wird ein Punkt gesetzt. Zu erwarten wäre ja, dass eine Linie der Länge Null nichts zeichnet.

Wie sind eure Meinungen dazu?

Viele Grüße, Jürgen

Rollo62 1. Nov 2021 08:43

AW: moveto, lineto
 
Lineto hat zwei Punkte, bei null Länge siehst Du Punkt 1.

Jasocul 1. Nov 2021 09:52

AW: moveto, lineto
 
Es wird vom Startpunkt bis zum Endpunkt gezeichnet, wobei der Endpunkt ausgelassen wird. D.h.: Wenn Startpunkt und Endpunkt identisch sind, wird der Punkt gezeichnet. Den Endpunkt nicht zu zeichnen, heißt ja nicht, dass dort vorhandene Zeichnungen gelöscht werden. Somit bleibt der Startpunkt als gezeichnet stehen.
Oder kurz:
Am Startpunkt mit dem Zeichnen anfangen und am Endpunkt nichts machen (auch nicht löschen).

Ob man nun bei der Bezeichnung lineto berücksichtigen sollte, ob es wirklich eine Linie wird, könnte man diskutieren. Oder man betrachtet einen Punkt als den Sonderfall einer Linie der Länge 0. Wobei man dann noch überlegen muss, ob ein Pixel nicht doch schon eine Länge 1 hat. Allerdings wird dann die Diskussion aufkommen, dass man eine Linie auch verlängern können muss. Bei einem Pixel ist allerdings nicht eindeutig, in welche Richtungen das gemacht werden darf. :mrgreen:
Spaß beiseite. Eine Linie ist erst durch zwei unterschiedliche Punkte oder einen Punkt und einem Vektor definiert, wenn mich meine mathematischen Kenntnisse nicht verlassen haben. Wenn man das als Grundlage nimmt, dürfte lineto eigentlich nichts zeichnen. Offensichtlich ist dieser Sonderfall aber nicht berücksichtigt worden. Muss aber auch nicht, da das auch vom Programmierer berücksichtigt werden kann. Man muss nur wissen, wie lineto in so einem Fall reagiert.

himitsu 1. Nov 2021 13:12

AW: moveto, lineto
 
Nein, bei Länge 0 sieht man nichts.

Bei Länge 1 (2 Pixel lang) sieht man einen Punkt.


Ich weiß grade nicht wie rum, aber ein Ende ist exclusive und wird nie gezeichnet.
Entweder der Endpunkt oder der Startpunkt. (vermutlich der Endpunkt, sie auch Rechtangle)



Im Prinzip, wenn man mehrere Linien hinterinander zeichnet, dann wird an den gemeinsamen Punkten nicht doppelt gezeichnet.
Ebenso bei Rechtangle oder Circle, wo die Figuren je ein Pixel kleiner sind, als width/height,



Fazit: die Linie ein Pixel länger berechnen oder zusätzlich noch einen Pixel zeichnen (wenn die Linie nur 1 Pixel breit ist).

jotbeyer 1. Nov 2021 14:17

AW: moveto, lineto
 
ja, vielen Dank für eure Antworten!

Zitat Jasocul: "Am Startpunkt mit dem Zeichnen anfangen und am Endpunkt nichts machen (auch nicht löschen)."

Das klingt logisch und so wird es sein.

Warum mache ich das überhaupt mit Linienlänge Null? Ich will eine Strichpunktlinie programmieren, und da sitzen zwischen den Strichen nun mal Punkte. Mit Pixels[] hatte ich das versucht, aber man sah sie nicht. Sie waren einfach zu klein. Bei der Auflösung bei meinem Surface pro 7 also nicht mehr sichtbar.(2736x1728)

Durch die LineTo() Geschichte ergibt sich mir nun die Möglichkeit, die Strichbreite zu setzen (muss ja genauso breit sein, wie die langen Striche...

Wie auch immer, LineTo() ist die Lösung, wenn man "dicke Punkte" braucht.

Danke nochmal!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz