我以前从未使用过Java绘图方法,所以我决定尝试创建一个模拟时钟作为PoC。除了指针外,我还绘制了一个包括分钟/小时刻度的时钟表盘。我使用简单的sin/cos计算来确定圆周上线条的位置。
然而,我注意到由于分钟刻度非常短,线条的角度看起来不正确。我确信这是因为
我知道我可以从中心绘制线条并用圆形遮罩它(以创建更长、更准确的线条),但这似乎是一种不优雅且昂贵的解决方案。我已经对如何做这个问题进行了一些研究,但我找到的最好的答案是使用
这是使用亚像素精度绘制的唯一/最佳方法吗?还是有可能有更快的解决方案?
编辑:我已经将
根据请求,这里有一些代码(由于这只是一个PoC,代码没有完全优化):
这是绘图的截图。可能有些难以看清,但请注意59分钟的刻度线。它是完全垂直的。
然而,我注意到由于分钟刻度非常短,线条的角度看起来不正确。我确信这是因为
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分钟的刻度线。它是完全垂直的。