Daha önce hiç Java çizim yöntemleri ile çalışmadım, bu yüzden bir PoC olarak analog bir saat oluşturmaya ve oluşturmaya karar verdim. Ellere ek olarak, dakika/saat için onay işaretlerini içeren bir saat yüzü çiziyorum. Dairenin çevresindeki çizgilerin konumunu belirlemek için basit sin/cos hesaplamaları kullanırım.Java - Alt piksel doğruluk oranı bir AffineTransform gerektirir mi?
Ancak, dakika kene-işaretleri beri çok kısadır, çizgilerin açısı yanlış göründüğünü fark etmiş. Bunun nedeni, hem Graphics2D.drawLine()
hem de Line2D.double()
yöntemlerinin subpixel doğruluğu ile çizilememesidir.
I (daha doğru çizgiler daha oluşturmak için) merkezinden çıkan ve bir daire ile maskeleyerek çizgiler çizmek biliyorum, ama böyle bir kaba ve pahalı bir çözüm gibi görünmektedir. Bunu nasıl yapacağım konusunda biraz araştırma yaptım, ama karşılaştığım en iyi cevap bir AffineTransform
kullanmak. Bir supersampling yapmak zorunda kalmanın aksine, sadece AffineTransform
kullanabileceğimi farz ediyorum.
bu alt piksel doğrulukla çizim tek/en iyi yöntem var mı? Ya da potansiyel olarak daha hızlı bir çözüm var mı?
Düzenleme: Zaten Graphics2D
nesneye bir RenderingHint
kuruyorum. İstendiği gibi
, burada kod biraz (bu sadece bir PoC olarak tam olarak optimize edilmemiş) 'dir:
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)
İşte çizimin bir ekran var. Görmek biraz zor olabilir ama 59 dakika için onay işaretine bakın. Mükemmel dikey.
sc saatin tekrar hesaplanması ve saatin hesaplanması/çizilmesi yardımcı olacaktır. –