我以前从未使用过 Java 绘图方法,因此我决定深入研究并创建一个模拟时钟作为 PoC。除了指针之外,我还绘制了一个包含分钟/小时刻度线的钟面。我使用简单的 sin/cos 计算来确定圆周围线条的位置。
但是,我注意到由于分钟刻度线很短,线条的角度看起来不对。我确定这是因为Graphics2D.drawLine()
和Line2D.double()
方法都不能以亚像素精度绘制。
我知道我可以画出从中心开始的线条并用一个圆圈将其遮住(以创建更长、更准确的线条),但这似乎是一个不雅且昂贵的解决方案。我已经对如何做到这一点进行了一些研究,但我遇到的最佳答案是使用AffineTransform
. 我假设我只能使用AffineTransform
with 旋转,而不是必须执行超级采样。
这是以亚像素精度绘制的唯一/最佳方法吗?还是有可能更快的解决方案?
编辑:我已经RenderingHint
为Graphics2D
对象设置了 a 。
根据要求,这里有一些代码(没有完全优化,因为这只是一个 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 分钟的刻度线。它是完全垂直的。