Java - A precisão da linha de subpixel requer um AffineTransform?
Eu nunca trabalhei com métodos de desenho Java antes, então decidi mergulhar e criar um relógio analógico como um PoC. Além dos ponteiros, desenho um mostrador de relógio que inclui marcas de escala por minutos / horas. Uso cálculos simples sin / cos para determinar a posição das linhas ao redor do círculo.
No entanto, notei que, como as marcas de minuto são muito curtas, o ângulo das linhas parece errado. Estou certo de que isso ocorre porque ambosGraphics2D.drawLine()
eLine2D.double()
métodos não podem desenhar com precisão de subpixel.
Sei que posso desenhar linhas originárias do centro e mascará-las com um círculo (para criar linhas mais longas e precisas), mas isso parece uma solução tão deselegante e dispendiosa. Eu fiz algumas pesquisas sobre como fazer isso, mas a melhor resposta que encontrei é usar umAffineTransform
. Eu suponho que eu poderia usar umAffineTransform
somente com rotação, em vez de precisar fazer uma superamostragem.
Esse é o único / melhor método de desenho com precisão sub-pixel? Ou existe uma solução potencialmente mais rápida?
Editar: Já estou definindo umRenderingHint
aoGraphics2D
objeto.
Conforme solicitado, aqui está um pouco do código (não totalmente otimizado, pois era apenas um 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)
Aqui está uma captura de tela do desenho. Pode ser um pouco difícil de ver, mas observe a marca por 59 minutos. É perfeitamente vertical.