Java - 子像素线精度是否需要AffineTransform?
我之前从未使用过Java绘图方法,因此我决定深入研究并创建一个模拟时钟作为PoC。除了手之外,我画了一个钟面,包括刻度标记,分钟/小时。我使用简单的sin / cos计算来确定圆周线的位置。
但是,我注意到由于分钟刻度非常短,因此线条的角度看起来不对。我确定这是因为
Graphics2D.drawLine()
和Line2D.double()
方法都无法以亚像素精度绘制。
我知道我可以画出来自中心的线条并用圆圈遮盖它(以创建更长,更准确的线条),但这似乎是一种不那么优雅和昂贵的解决方案。我已经做过一些关于如何做到这一点的研究,但我遇到的最好的答案是使用AffineTransform
。我假设我只能使用旋转AffineTransform
,而不是必须执行超级采样。
这是以亚像素精度绘制的唯一/最佳方法吗?或者是否有更快的解决方案?
编辑:我已经在Graphics2D
对象中设置了RenderingHint
。
根据要求,这里有一些代码(没有完全优化,因为这只是一个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分钟的刻度线。它是完全垂直的。
没有找到相关结果
已邀请:
1 个回复
琶竞捆栓
,Graphics2D对象可以使用形状
绘制“子像素”精度。 我想我可以使用 AffineTransform仅限旋转,如 反对必须执行 超级采样。这是唯一/最好的 用子像素绘制的方法 准确性?或者是否有潜力 解决方案更快 我想你在这里错过了什么。 Graphics2D对象已经拥有一个
,它正在将它用于所有绘图操作及其廉价的性能。 但是要回复你的代码中缺少的东西 - 这是缺失的:
下面是一个自包含的示例,生成此图片: