Java - Требуется ли для точности субпиксельной линии AffineTransform?

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

Sample image

9
задан D.N. 16 February 2011 в 16:26
поделиться