2010-07-30 47 views
1

我正在繪製基於給定行的多邊形。除了看起來多邊形相交的情況之外,我的邏輯運行良好。然而,它似乎不是100%一致的,根據我正在閱讀的內容也沒有意義。以下是使用相同代碼創建的兩張圖片。黃色的多邊形是我所關心的。幫我理解Java多邊形填充奇數

圖片:http://i31.tinypic.com/24cxxlf.png

我想每種情況下都像第一種情況(其中空區「包裹」由多邊形沒有填寫)工作。

BufferedImage drawingImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
Graphics2D g = drawingImage.createGraphics(); 
Polygon polygon = new Polygon(parsedPoints[0], parsedPoints[1], parsedPoints[0].length); 
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
g.setColor(drawingColor); 
g.fillPolygon(polygon); 
float[] scales = {1f, 1f, 1f, 0.7f}; 
float[] offsets = new float[4]; 
RescaleOp rop = new RescaleOp(scales, offsets, null); 
graphics.drawImage(drawingImage, rop, 0, 0); 
graphics.setStroke(new BasicStroke(2)); 
graphics.setColor(drawingColor); 
graphics.drawPolygon(polygon); 

(我填充多邊形應用的重新調整,以獲得一些透明度填充,然後繪製邊框不透明度)

這些圖像由這個代碼生成根據用於Graphics.fillPolygon方法的Java文檔:

在多邊形內部的區域被定義 使用奇偶填充規則,也 被稱爲交替規則。

如果我理解正確,那麼在兩種情況下,包含在由粗多邊形「包裹」的區域內的像素將恰好交叉兩條路徑,因此它將被視爲多邊形「外部」。所以我的問題是:(a)我是否理解偶數填充規則和(b)在Java中有沒有辦法讓第二個圖像更像第一個圖像?

對此的任何想法將不勝感激。

謝謝。

回答

2
  1. 該規則適用於每個多邊形。 Java並不關心你在前面提到的多邊形。
  2. 你似乎有點誤解偶數規則。規則的實際版本有點像這樣...對於每個'y'座標多邊形的十字架,有一個有序列表中的所有x座標的交叉點。多邊形的「內部」是從每個偶數索引(0,2,4 ...)到下一個奇數索引的部分。
+0

@cHao - 好的,但似乎並沒有解決爲什麼第一個多邊形填充正確,第二個沒有。 如果我理解你在說什麼,我們正在看這樣的事情。對於給定的行(y座標),我們應該有以下幾點(請原諒我可憐的ascii藝術): ------ | | ----------- | | ------- 不是我不想填滿的區域仍然在一個甚至會被索引的區域? – MikeTheReader 2010-07-30 17:11:31

+0

@ Dante617:不,它不是。就像我所提到的,規則是每個多邊形。 – cHao 2010-07-30 17:21:22

+0

@cHao - 好吧,我想我明白你在說什麼。從本質上講,一旦它真的相交,我最終有兩個多邊形(在兩個「正方形」,一個在另一箇中)。當它填滿時,它最終填充兩次。內部廣場和外部廣場。這解釋了爲什麼內部比其他部分稍暗,因爲它被填充了兩次,而不僅僅是一次。當然,現在的問題是,我怎麼才能讓它按照我想要的方式行事。 – MikeTheReader 2010-07-30 17:33:00