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