Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Polygon und Rectangle zeichen unterschiedlich (https://www.delphipraxis.net/198942-polygon-und-rectangle-zeichen-unterschiedlich.html)

bernau 13. Dez 2018 10:54

Polygon und Rectangle zeichen unterschiedlich
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich will verschiedene Formen zeichnen. Dabei verwende ich gemischt rectangle und polygon. Irgendwie will es nicht immer passen und habe nach einem Fehler in meinem Code gesucht und nicht gefunden.

Schnell mal ein kleines Testprogramm geschrieben.

Delphi-Quellcode:
procedure TFormTest.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.canvas.rectangle(
    0,0, // oben links
    100,100 // unten rechts
    );

  PaintBox1.canvas.Polygon([
   Point(10,10), // oben links
   Point(100,10),
   Point(100,100), // unten rechts
   Point(10,100)
   ]);
end;

Dabei kommt folgendes raus: (Siehe Anhang)

Die Linien auf horziontal 100 und vertikal 100 sind um einen Punkt versetzt. Warum?

Uwe Raabe 13. Dez 2018 11:03

AW: Polygon und Rectangle zeichen unterschiedlich
 
Bei einem Rectangle gehört die rechte untere Ecke nicht zum Rechteck. Das gilt für alle Rect-Strukturen in der VCL. Grund ist, daß
Delphi-Quellcode:
Right - Left = Width
und
Delphi-Quellcode:
Bottom - Top = Height
gelten soll. Das deckt sich übrigens mit der gleichnamigen Winapi-Funktion:

Zitat:

The rectangle that is drawn excludes the bottom and right edges.
https://docs.microsoft.com/de-de/win...ngdi-rectangle

Medium 13. Dez 2018 11:04

AW: Polygon und Rectangle zeichen unterschiedlich
 
Das ist immer so eine Sache mit Bitmap versus Vektorgrafik. Bei Bitmaps sind Pixel immer Integer-Koordinaten, aber bei Vektorgrafik liegt die Stelle um genau eine Pixelmitte zu treffen immer um 0,5 versetzt. Bei Rectangle wird daher vermutlich explizit darauf geachtet, dass die Gesamtbreite des Rechtecks auch in einem Float-Koordinatensystem exakt 100 ergibt, wohingegen Polygon die Linie genau mittig auf die genannten Koordinaten malt - wodurch sie ggf. je nach dem "verrutscht".

Aber auch selbst bei reiner Bitmap-Grafik gibt es unterschiedliche Ansätze, die den Rand garantiert innerhalb der angegebenen Breite zeichnet, oder diesen nicht als Teil der Angabe sehen und "drumherum" zeichnen. Evtl. gibt es eine überladene Version mit entsprechendem Parameter - weiß ich gerade nicht genau.

Generell ist das ganze letztlich eine Frage von Konvention.

Edit: Uwes Hinweis geht letztlich auf denselben Umstand zurück.

bernau 13. Dez 2018 11:17

AW: Polygon und Rectangle zeichen unterschiedlich
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1420733)
Bei einem Rectangle gehört die rechte untere Ecke nicht zum Rechteck. Das gilt für alle Rect-Strukturen in der VCL. Grund ist, daß
Delphi-Quellcode:
Right - Left = Width
und
Delphi-Quellcode:
Bottom - Top = Height
gelten soll. Das deckt sich übrigens mit der gleichnamigen Winapi-Funktion:

Zitat:

The rectangle that is drawn excludes the bottom and right edges.
https://docs.microsoft.com/de-de/win...ngdi-rectangle

Danke für den Hinweis. Ist mir noch nie aufgefallen, dass Rectangle 1 Pixel kleiner gezeichnet wird.:oops:

Deswegen sind die Parameter von Rectangle auch mir x1,y1,x2,y2 bezeichnet und nicht left,top,right,bottom. Man lernt nie aus.

bernau 13. Dez 2018 11:21

AW: Polygon und Rectangle zeichen unterschiedlich
 
Zitat:

Zitat von Medium (Beitrag 1420734)
Das ist immer so eine Sache mit Bitmap versus Vektorgrafik. Bei Bitmaps sind Pixel immer Integer-Koordinaten, aber bei Vektorgrafik liegt die Stelle um genau eine Pixelmitte zu treffen immer um 0,5 versetzt. Bei Rectangle wird daher vermutlich explizit darauf geachtet, dass die Gesamtbreite des Rechtecks auch in einem Float-Koordinatensystem exakt 100 ergibt, wohingegen Polygon die Linie genau mittig auf die genannten Koordinaten malt - wodurch sie ggf. je nach dem "verrutscht".

Aber auch selbst bei reiner Bitmap-Grafik gibt es unterschiedliche Ansätze, die den Rand garantiert innerhalb der angegebenen Breite zeichnet, oder diesen nicht als Teil der Angabe sehen und "drumherum" zeichnen. Evtl. gibt es eine überladene Version mit entsprechendem Parameter - weiß ich gerade nicht genau.

Generell ist das ganze letztlich eine Frage von Konvention.

Edit: Uwes Hinweis geht letztlich auf denselben Umstand zurück.

Ähm. Das hat nichts mit Float-Werten zu tun. Polygon verwendet als Parameter Integer-Werte.

Medium 13. Dez 2018 11:28

AW: Polygon und Rectangle zeichen unterschiedlich
 
Ich war jetzt von FMX ausgegangen. Aber auch wenn die Funktion nur Integer nimmt, bleibt "hinter den Kulissen" die Problematik dieselbe. Die ganz zugrunde liegende Sache ist eigentlich eher mathematischer als programmiererischer Natur: Gehört der Rand zum Rechteck? Ja/Nein/Nur halb! - letzteres geht nämlich auch, dann liegt die Mitte des Randes genau an den Rechtecksgrenzen. (Zumal, so ein Rand muss ja nicht immer nur 1px dick sein.)

Uwe Raabe 13. Dez 2018 11:34

AW: Polygon und Rectangle zeichen unterschiedlich
 
Man muss das auch etwas relativieren, da auch Microsoft das offenbar nicht konsistent umsetzt:
Zitat:

When an application calls the Rectangle function, the system draws the rectangle, excluding the right and lower sides if no world transformation is set for the given device context.

If a world transformation has been set by using the SetWorldTransform or ModifyWorldTransform function, the system includes the right and lower edges.
https://docs.microsoft.com/de-de/win...ing-rectangles

stahli 14. Dez 2018 12:42

AW: Polygon und Rectangle zeichen unterschiedlich
 
Ich habe bei dem Thema auch einiges herumprobiert und meine Ergebnisse etwas zusammengefasst.
Falls Du mal stöbern willst: https://www.delphipraxis.net/185374-...-schatten.html

Graf Gustav 12. Jan 2019 10:50

AW: Polygon und Rectangle zeichen unterschiedlich
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin auf diesen Thread gestoßen, weil ich auch nicht nachvollziehen kann, wie TCanvas.Rectangle zeichnet.
Ich hoffe, es ist ok, dass ich hier weitermache, aber die Antworten passen z.T. schon gut.
(Die Info mit der rechten unteren Ecke hilft mir zu verstehen, wieso ein TImage-ClipRect von 0..width/height geht, also 1 Pixel zuviel)

Ich will TImages mit unterschiedlichen Linienbreiten umranden.

Delphi-Quellcode:
 
  Canvas.Brush.Color := FColor;
  Canvas.FillRect(Canvas.ClipRect);

  Canvas.Pen.Color := FBorderColor;
  Canvas.Pen.Width := FBorderWidth;

  x1 := Canvas.ClipRect.Left;
  y1 := Canvas.ClipRect.Top;
  x2 := Canvas.ClipRect.Right;
  y2 := Canvas.ClipRect.Bottom;
  Canvas.Rectangle(x1, y1, x2, y2);
Mit Linienbreite = 1 klappt das, >1 wird's mystisch (für mich)
Ich habe mit verschiedenen Linienbreiten und x/y-Versatzkombinationen getestet,
aber der erkenntnismäßige Durchbruch ist ausgeblieben.

jfheins 13. Jan 2019 10:39

AW: Polygon und Rectangle zeichen unterschiedlich
 
Ich vermute mal, wenn du ein Rechteck zeichnest mit einer Strichbreite über 1, dass die Mitte des Rahmens das Rechteck bildet.

D.h. bei einer Strichbreite von 3 wird (im Vergleich zu 1) sowohl außen als auch innen ein Reihe Pixel hinzugefügt. Welche das dann ist bei einer Strichbreite von 2, weiß ich nicht.
Aber schau dir das doch mal ohne Clipping an, dann wird es vielleicht klarer ;-) (Weil du weißt ja momentan nicht, was du abschneidest)

Und natürlich: Wenn du ein Bild umrahmst, wird das Ergebnis entweder größer sein, oder ein Teil des Bildes geht verloren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.
Seite 1 von 2  1 2   

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