TBitmap.Canvas.Line zu kurz?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

TBitmap.Canvas.Line zu kurz?

Beitrag von Timm Thaler »

Ich habe eine Routine, in der ein paar Linien auf ein Image gezeichnet werden. Ursprünglich habe ich die mit TFPCustomCanvas aus der unit fpimgcanv gezeichnet, da das in der Konsole lief.

Jetzt will ich mit dieser Routine auf das Canvas eines TBitmap aus der unit Graphics zeichnen, welches in eine TPaintBox ausgegeben wird. Funktioniert soweit, aber: Alle Linien sind genau 1 Pixel zu kurz.

Das ist mir auch schon an anderer Stelle aufgefallen. Laut https://www.freepascal.org/docs-html/rtl/graph/line.html sollte die Linie vom Startpunkt zum Endpunkt gehen, was meiner Erfahrung nach den Endpunkt mit einschließt. Auch bei Rectangle ist es so, dass ein Canvas.Rectangle(1, 1, 5, 5); ein genau 4 Pixel breites und 4 Pixel hohes Rechteck zeichnet, mit Canvas.Pen.Width := 1.

Meiner Meinung nach wiederspricht das den Angaben in der Beschreibung, verwirrend ist hier auch, dass sich verschiedene units unterschiedlich verhalten. Nennt mich kleinlich, aber beim Versuch Diagramme zu zeichnen ist das extrem nervig.

Was wäre denn das richtige Verhalten?

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: TBitmap.Canvas.Line zu kurz?

Beitrag von MacWomble »

Bei deinem Beispiel des Rechtecks ist es jedenfalls OK.
Das geht von 1, 1 bis 5, 5 also 4x4 Punkte .

Eine Linie 1, 5 ist demnach 4 Punkte lang.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TBitmap.Canvas.Line zu kurz?

Beitrag von Timm Thaler »

MacWomble hat geschrieben:Bei deinem Beispiel des Rechtecks ist es jedenfalls OK.
Das geht von 1, 1 bis 5, 5 also 4x4 Punkte .

Eine Linie 1, 5 ist demnach 4 Punkte lang.


Ähm nein, es fängt bei 1,1 an und sollte bei 5,5 aufhören, es hört aber bei 4,4 auf.

Ein Rechteck mit 1,1 bis 5,2 wird zum Beispiel gar nicht gezeichnet.

Andererseits wird mit Linienbreite 3 eine Linie 1,1 bis 5,1 von Pixel 0 bis einschließlich Pixel 6 gezeichnet, also so wie man es erwarten würde.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TBitmap.Canvas.Line zu kurz?

Beitrag von Timm Thaler »

Folgender Code erzeugt die angehängte Bitmap:

Code: Alles auswählen

      iHND.Canvas.Line(1, 1, 4, 1);
      iHND.Canvas.Line(1, 1, 4, 4);
      iHND.Canvas.Line(1, 1, 4, 7);
      iHND.Canvas.Line(1, 1, 4, 10);
      iHND.Canvas.Line(1, 1, 4, 13);

Bis 4,7 wird die Linie in X-Richtung 3 Pixel gezeichnet, ab 4,10 wird sie 4 Pixel breit gezeichnet.
Dateianhänge
Line-01.png
Line-01.png (147 Bytes) 1701 mal betrachtet

Antworten