2013-08-16 52 views
1

我繪製了4個堆疊的矩形,圍繞一個點旋轉畫布,然後再次繪製相同的形狀,但堆疊的矩形不會完全對齊。Graphics2D旋轉精度問題

以下是截圖:

Alignment Issue

正如你所看到的,第一,未旋轉的塊是完美的,但以下的有錯位。爲什麼會發生這種情況,我該如何預防它?


SSCE

//Just import everything to keep it short and sweet 
import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class AlignmentIssue extends JComponent { 
    @Override 
    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D)g; 
     double angle = Math.toRadians(30); 
     int numRects = (int)Math.floor(2.0 * Math.PI/angle); 
     Rectangle rect = new Rectangle(0, 100, 20, 25); 

     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.translate(getWidth()/2, getHeight()/2); 

     for(int i = 0; i < numRects; ++i) { 
      AffineTransform transform = g2d.getTransform(); 

      for(int n = 0; n < 3; ++n) { 
       g2d.draw(rect); 
       g2d.translate(0, rect.height); 
      } 

      g2d.setTransform(transform); 
      g2d.rotate(angle); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Alignment Issue"); 

     frame.add(new AlignmentIssue()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(800, 600)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

回答

2

你需要更精確的行程控制:

g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 

默認可以讓幾何形狀會略有不同,這取決於實現。 Pure試圖保持亞像素的準確性。

+0

嗯,有趣。我需要閱讀更多的RenderingHints地圖。謝謝! – Lerp

+0

不客氣:-)我花了一些時間來弄清楚。 – kiheru

+0

這真是救命救命。雖然我正在使用其他渲染手勢,但這個主要提示:) 非常感謝。 – Soley