AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Polygon und Rectangle zeichen unterschiedlich
Thema durchsuchen
Ansicht
Themen-Optionen

Polygon und Rectangle zeichen unterschiedlich

Ein Thema von bernau · begonnen am 13. Dez 2018 · letzter Beitrag vom 15. Jan 2019
Antwort Antwort
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#1

Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 10:54
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?
Angehängte Grafiken
Dateityp: png PolygonRectangle.png (834 Bytes, 18x aufgerufen)
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#2

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 11:03
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ß Right - Left = Width und 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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#3

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 11:17
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ß Right - Left = Width und 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.

Deswegen sind die Parameter von Rectangle auch mir x1,y1,x2,y2 bezeichnet und nicht left,top,right,bottom. Man lernt nie aus.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 11:04
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#5

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 11:21
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.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 11:28
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.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#7

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 11:34
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 14. Dez 2018, 12:42
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
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 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