![]() |
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? |
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:
und
Right - Left = Width
Delphi-Quellcode:
gelten soll. Das deckt sich übrigens mit der gleichnamigen Winapi-Funktion:
Bottom - Top = Height
Zitat:
![]() |
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. |
AW: Polygon und Rectangle zeichen unterschiedlich
Zitat:
Deswegen sind die Parameter von Rectangle auch mir x1,y1,x2,y2 bezeichnet und nicht left,top,right,bottom. Man lernt nie aus. |
AW: Polygon und Rectangle zeichen unterschiedlich
Zitat:
|
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.)
|
AW: Polygon und Rectangle zeichen unterschiedlich
Man muss das auch etwas relativieren, da auch Microsoft das offenbar nicht konsistent umsetzt:
Zitat:
![]() |
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: ![]() |
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:
Mit Linienbreite = 1 klappt das, >1 wird's mystisch (für mich)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); Ich habe mit verschiedenen Linienbreiten und x/y-Versatzkombinationen getestet, aber der erkenntnismäßige Durchbruch ist ausgeblieben. |
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 08:12 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