2012-02-28 48 views
1

我試圖通過一系列小角度圓弧和矩形來模擬拐角。組合圓弧和矩形時出現小間隙

當抗鋸齒開啓渲染,我得到一個畫面如下圖所示:

http://i.imgur.com/xgzme.png

當我打開抗鋸齒的時候,我得到了下面的圖片:

http://i.imgur.com/mB6Id.png

它幾乎看起來好像我的計算關閉了一個或兩個像素,但我使用所有渲染的雙打,所以我甚至不認爲是這樣。

該類的代碼是在這裏:

http://pastebin.com/1SHu7rH0

這不是它一個巨大的問題,因爲線是很難分心或計算的嚴重錯誤,但它是什麼,我想如果可能的話,能夠修復。

感謝

+2

如果不盡快得到一個體面的解決辦法,我認爲,在獲得一個離我們最好的辦法是建立一個小的編譯和執行的程序不包含無關的問題,但任何代碼演示了這個問題。這段代碼沒有「模型」或「控制」代碼或依賴關係,它不需要外部數據或圖像,但只會嘗試使用硬編碼數據繪製一些帶曲線的通道。這個過程被稱爲創建一個[sscce](http://sscce.org),並且需要您付出相當大的努力,但是如果沒有答案即將到來,這個努力是值得的。 – 2012-02-28 23:34:27

+1

有什麼問題?爲什麼不簡單地打開反鋸齒呢? – kleopatra 2012-02-29 13:10:02

+0

@kleopatra我在最後做了。我最終無法找出解決方案。我只需要在曲線段之間的小線上做些事情。 – 2012-03-05 19:58:59

回答

2

編輯:其實這個問題可能只使用填充(形狀):它只是填充內部。調用draw(Shape)以及可能會修正Shapes不排隊。

你爲什麼不把這些彎曲畫成單個形狀?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.geom.Arc2D; 
import java.awt.geom.Area; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Path2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestDonut extends JPanel { 
    public TestDonut() { 
     setPreferredSize(new Dimension(100, 100)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Ellipse2D.Double gap = new Ellipse2D.Double(25, 25, 50, 50); 
     Ellipse2D.Double circle = new Ellipse2D.Double(0, 0, 100, 100); 
     Shape quarter = new Rectangle(50, 50, 50, 50); 
     Area donut = new Area(circle); 
     donut.subtract(new Area(gap)); 
     Area quarterDonut = new Area(quarter); 
     quarterDonut.subtract(donut); 

     Area bend = new Area(quarter); 
     bend.subtract(quarterDonut); 
     g.setColor(Color.RED); 
     ((Graphics2D) g).fill(bend); 

     Path2D.Double bend2 = new Path2D.Double(); 
     bend2.moveTo(0, 50); 
     bend2.quadTo(0, 0, 50, 0); 
     bend2.lineTo(50, 25); 
     bend2.quadTo(25, 25, 25, 50); 
     bend2.closePath(); 
     g.setColor(Color.GREEN); 
     ((Graphics2D) g).fill(bend2); 

     Arc2D.Double outerArc = new Arc2D.Double(0, 0, 100, 100, 0, 90, Arc2D.PIE); 
     Arc2D.Double innerArc = new Arc2D.Double(25, 25, 50, 50, 0, 90, Arc2D.PIE); 
     Area bend3 = new Area(outerArc); 
     bend3.subtract(new Area(innerArc)); 
     g.setColor(Color.BLUE); 
     ((Graphics2D) g).fill(bend3); 

    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(new TestDonut()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
}