Nunca antes había trabajado con los métodos de dibujo de Java, así que decidí bucear y crear un reloj analógico como PoC. Además de las manos, dibujo un reloj que incluye marcas por minutos/horas. Utilizo cálculos simples de sin/cos para determinar la posición de las líneas alrededor del círculo.Java: ¿la precisión de línea de subpixel requiere un AffineTransform?
Sin embargo, he notado que desde el minuto en que las marcas son muy cortas, el ángulo de las líneas parece incorrecto. Estoy seguro de que esto se debe a que los métodos Graphics2D.drawLine()
y Line2D.double()
no se pueden dibujar con precisión subpíxel.
Sé que puedo dibujar líneas que se originan en el centro y enmascararlas con un círculo (para crear líneas más largas y precisas), pero parece una solución tan poco elegante y costosa. Hice algunas investigaciones sobre cómo hacer esto, pero la mejor respuesta que he encontrado es usar un AffineTransform
. Supongo que podría usar un AffineTransform
solo con rotación, en lugar de tener que realizar un supermuestreo.
¿Es este el único/mejor método de dibujo con precisión subpíxel? ¿O hay una solución potencialmente más rápida?
Editar: Ya estoy estableciendo un RenderingHint
al objeto Graphics2D
.
a lo solicitado, aquí es un poco de código (no completamente optimizado ya que esto era sólo una 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)
Aquí hay una captura de pantalla del dibujo. Puede ser algo difícil de ver, pero mira la marca durante 59 minutos. Es perfectamente vertical.
sc una nueva visión del reloj y el código para calcular/dibujar el reloj ayudaría. –