Раньше я никогда не работал с методами рисования Java, поэтому я решил погрузиться и создать аналоговые часы в качестве PoC. В дополнение к стрелкам я рисую циферблат с отметками для минут / часов. Я использую простые вычисления sin / cos, чтобы определить положение линий вокруг круга.
Однако я заметил, что, поскольку мелкие отметки очень короткие, угол линий выглядит неправильно. Я уверен, что это потому, что методы 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 минут. Это совершенно вертикально.