, Я уже знал, что реализация почти не использует вычислительную мощность (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 минут. Это совершенно вертикально.