私はこれまでJavaの描画方法を使用したことがないので、PoCとしてアナログ時計を作成することにしました。手に加えて、分/時間の目盛りが付いた文字盤を描きます。単純なsin/cos計算を使用して、円の周りの線の位置を決定します。
しかし、細かい目盛りが非常に短いため、線の角度が間違っていることに気づきました。これは、Graphics2D.drawLine()
とLine2D.double()
メソッドの両方がサブピクセルの精度で描画できないためだと確信しています。
中心から始まり、円でマスクして(より長く、より正確な線を作成するために)線を引くことができることは知っていますが、それはそのようなエレガントでコストのかかる解決策のようです。私はこれを行う方法についていくつかの調査を行いましたが、私が遭遇した最良の答えはを使用することAffineTransform
です。AffineTransform
スーパーサンプリングを実行する必要があるのではなく、回転ありのみを使用できると思います。
これは、サブピクセル精度で描画する唯一の/最良の方法ですか?または、潜在的に高速なソリューションはありますか?
編集:私はすでにオブジェクトにを設定しRenderingHint
ていGraphics2D
ます。
要求に応じて、ここにコードの一部を示します(これは単なるPoCであったため、完全には最適化されていません)。
diameter = Math.max(Math.min(pnlOuter.getSize().getWidth(),
pnlOuter.getSize().getHeight()) - 2, MIN_DIAMETER);
for (double radTick = 0d; radTick < 360d; radTick += 6d) {
g2d.draw(new Line2D.Double(
(diameter / 2) + (Math.cos(Math.toRadians(radTick))) * diameter / 2.1d,
(diameter / 2) + (Math.sin(Math.toRadians(radTick))) * diameter / 2.1d,
(diameter / 2) + (Math.cos(Math.toRadians(radTick))) * diameter / 2.05d,
(diameter / 2) + (Math.sin(Math.toRadians(radTick))) * diameter / 2.05d));
} // End for(radTick)
これが図面のスクリーンショットです。少し見づらいかもしれませんが、59分間目盛りを見てください。それは完全に垂直です。