2012-09-14 46 views
0

在JPanel上繪製Path2D時,我有一個奇怪的行爲。


一些形狀得到怎樣的一個尾巴,你可以在這個截圖中看到:JPanel上的Java Path2D.Double用'尾部'繪製

enter image description here

當我改變類型Line2D.Double,這是我希望它:

enter image description here

下面是繪製路徑/線路代碼:

Path2D.Double path = new Path2D.Double(); 
Graphics2D g = (Graphics2D)this.getGraphics(); 
for(int i=0; i<geom.size(); i++) 
{ 
    double x = ddGeom.getX(geom.get(i)); 
    double y = ddGeom.getY(geom.get(i)); 
    if(i==0) 
     path.moveTo(x-draw_center.x, y-draw_center.y); 
    path.lineTo(x-draw_center.x, y-draw_center.y); 
} 
g.draw(path); 


你有一個想法,其中的「尾巴」在Screenshot1從何而來?我使用的SDK版本6

非常感謝您的幫助




編輯:當改變代碼段

if(i==0) 
    path.moveTo(x-draw_center.x, y-draw_center.y); 
else 
    path.lineTo(x-draw_center.x, y-draw_center.y); 

最多(也許75%)的尾巴消失。任何想法爲什麼發生這種情況

+0

當我用Path2D,我已經沒有這個問題,並根據您的代碼,我不能看到你的問題。考慮創建併發布[sscce](http://sscce.org)。有一件事讓我覺得奇怪,就是你在繪圖方法中創建了Path2D,而不是一次創建它,然後在繪圖方法中繪製它。爲什麼這樣做? –

+0

這些可能是由於anti-alias的影響,請嘗試:g2d。setRenderingHints(Graphics2D.ANTIALIASING,Graphics2D.ANTIALIAS_ON); – whatnick

+0

@whatnick:我不是說你錯了,但我從來沒見過抗鋸齒做到這一點。也許是一個奇怪的筆畫,但不是反鋸齒。 –

回答

1

我終於明白了。感謝HovercraftFullOfEels提示「奇怪的筆畫」,我用筆畫玩弄了一下。 原行程:

​​

更改爲:

BasicStroke stroke = new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); 

有了新的行程所有的 '尾巴' 消失了。我仍然不明白爲什麼會發生這種情況,但如果有人遇到同樣的問題,此解決方法可能會有所幫助。

我仍然對這種行爲的解釋很感興趣。

謝謝您的幫助很大

2

你們看到在你的第一個圖像看起來幾乎像'斜角'。定位符是一種在連接線的兩個外邊界被延伸直到它們相交併且封閉區域也被填充的路徑中繪製線連接的方式。

有沒有可能您的幾何圖形包含幾乎相同座標的連續點?下面的例子表現出相同的問題,因爲最後兩點具有幾乎相同的座標。

JFrame frame = new JFrame(); 

frame.setSize(300, 300); 
frame.setContentPane(new Container() { 
    @Override 
    public void paint(Graphics graphics) { 
     Graphics2D g2 = (Graphics2D) graphics; 
     g2.setStroke(new BasicStroke(5)); 
     g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON); 
     g2.setRenderingHint(KEY_STROKE_CONTROL, VALUE_STROKE_PURE); 

     Path2D.Double path = new Path2D.Double(); 
     path.moveTo(200, 100); 
     path.lineTo(100, 100); 
     path.lineTo(101, 100.3); 

     g2.draw(path); 
    } 
}); 

frame.setVisible(true);