이전에는 Java 드로잉 메서드로 작업 해본 적이 없기 때문에 PoC로 살펴보고 아날로그 시계를 제작하기로 결정했습니다. 손에 더하여, 분/시간 동안 틱 마크가 포함 된 시계면을 그립니다. 나는 단순한 sin/cos 계산을 사용하여 원 주위의 선의 위치를 결정합니다.Java - 서브 픽셀 라인 정확도에 AffineTransform이 필요합니까?
그러나 눈금이 매우 짧기 때문에 선의 각도가 잘못 표시됩니다. 이것은 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 분간보십시오. 완벽하게 수직입니다.
sc 시계를 계산/그리기위한 시계 및 코드의 reenshot 도움이 될 것입니다. –