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.
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%
Tags und Links java line drawing affinetransform subpixel