Java - Benötigt die Subpixel-Liniengenauigkeit eine AffineTransform?

8

Ich habe noch nie zuvor mit Java-Zeichnungsmethoden gearbeitet, also habe ich beschlossen, eine analoge Uhr als PoC zu erstellen. Zusätzlich zu den Händen zeichne ich ein Ziffernblatt mit Markierungen für Minuten / Stunden. Ich verwende einfache sin / cos-Berechnungen, um die Position der Linien um den Kreis zu bestimmen.

Allerdings habe ich bemerkt, dass die Winkelmarkierungen sehr klein sind, weil die Winkel der Linien falsch aussehen. Ich bin mir sicher, das liegt daran, dass beide Methoden Graphics2D.drawLine() und Line2D.double() nicht mit Subpixel-Genauigkeit zeichnen können.

Ich weiß, dass ich Linien, die vom Zentrum ausgehen, zeichnen und mit einem Kreis ausblenden kann (um längere, genauere Linien zu erzeugen), aber das scheint eine solch unelegante und kostspielige Lösung zu sein. Ich habe einige Nachforschungen darüber angestellt, wie das geht, aber die beste Antwort, die ich gefunden habe, ist die Verwendung von AffineTransform . Ich nehme an, ich könnte ein AffineTransform nur mit Rotation verwenden, im Gegensatz zu einem Supersampling.

Ist dies die einzige / beste Methode zum Zeichnen mit Sub-Pixel-Genauigkeit? Oder gibt es eine potenziell schnellere Lösung?

Bearbeiten : Ich setze bereits RenderingHint auf das Objekt Graphics2D .

Wie gewünscht, hier ein kleiner Teil des Codes (nicht vollständig optimiert, da dies nur ein PoC war):

%Vor%

Hier ist ein Screenshot der Zeichnung. Es kann etwas schwierig zu sehen sein, aber sehen Sie sich das Häkchen für 59 Minuten an. Es ist perfekt vertikal.

    
D.N. 16.02.2011, 15:53
quelle

1 Antwort

8
  

Line2D.double () -Methoden können nicht zeichnen   mit Subpixelgenauigkeit.

Falsch, wenn Sie RenderingHints.VALUE_STROKE_PURE das Graphics2D-Objekt verwenden kann mit der Form Line2D "subpixel" genau zeichnen.

  

Ich nehme an, ich könnte ein   AffineTransform nur mit Rotation, wie   im Gegensatz dazu, ein   Supersampling. Ist das das einzige / Beste?   Methode zum Zeichnen mit Sub-Pixel   Richtigkeit? Oder gibt es ein potentielles?   schnellere Lösung?

Ich denke, du verpasst etwas hier. Das Graphics2D-Objekt enthält bereits ein AffineTransform und verwendet es für alle Zeichenaktionen und seine günstige Leistung.

Aber um zurück zu bekommen, was in Ihrem Code fehlt - das fehlt:

%Vor%

Unten ist ein eigenständiges Beispiel, das dieses Bild erzeugt:

%Vor%     
dacwe 16.02.2011, 16:38
quelle