, Я уже знал, что реализация почти не использует вычислительную мощность (1 час 50 мс обновлений занимал 0,3 с времени обработки), поэтому я не хотел нарушать эффективность. Теперь это занимает значительно больше времени обработки, но все еще совершенно незначительно (я измерял 0,025 с за 60 с, что примерно в 5 раз больше).

огда раньше не работал с методами рисования 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 минут. Это совершенно вертикально.

Ответы на вопрос(1)

Ваш ответ на вопрос