我之前從未使用過Java繪圖方法,因此我決定潛入並創建一個模擬時鐘作爲PoC。除了手之外,我還繪製了一個包含刻度線的鐘面,分鐘/小時。我使用簡單的正弦/餘弦計算來確定圓周線的位置。Java - 子像素行精度是否需要AffineTransform?
但是,我注意到,由於分鐘刻度非常短,線條的角度看起來不正確。我確定這是因爲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分鐘的刻度線。這是完美的垂直。
sc時鐘和計算/繪製時鐘的代碼的恢復將有所幫助。 –