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
Seite 1 von 2  1 2      
Benutzerbild von bernau
bernau

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

Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 11: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?
Miniaturansicht angehängter Grafiken
polygonrectangle.png  
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.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 12: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
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 12: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.295 Beiträge
 
Delphi 12 Athens
 
#4

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 12: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
Benutzerbild von bernau
bernau

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

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 12: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.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 12: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.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Dez 2018, 12: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.343 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 14. Dez 2018, 13: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
Graf Gustav

Registriert seit: 13. Mär 2011
51 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 12. Jan 2019, 11:50
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.
Miniaturansicht angehängter Grafiken
rectangle-test.jpg  
Reinhold
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

AW: Polygon und Rectangle zeichen unterschiedlich

  Alt 13. Jan 2019, 11:39
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:57 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