2011-04-18 114 views
1

我已經編寫了自己的多行類,基本上保留了可以使用矩陣修改的點的列表。多邊形線可以添加到其他多邊形線並加入到公共端點。當端點等於起點時,多邊形線將代表多邊形。剪切路徑問題

然後我有一個方法通過迭代包含一系列lineTo()調用的點列表來將我的多邊形變成一個Path對象。然後,此路徑將應用於作爲我的View的onDraw方法中的剪輯路徑的畫布。

它適用於複雜的多邊形,我可以繪製該路徑來驗證它的準確性。

到目前爲止,除了當我在中間有一個不規則孔的複合多邊形時我注意到問題。因爲這是另一個多邊形內的多邊形,所以我應該停止將它稱爲多邊形。

例如,考慮下圖,其中中間的外框和「城堡」形狀都是用作剪輯路徑的相同Path對象的組成部分。 #表示彩繪區域。

+---------+ 
|#########| 
|#+-+#+-+#| 
|#| |#| |#| 
|#| +-+ |#| 
|#|  |#| 
|#+-----+#| 
|#########| 
+---------+ 

我期望在外框和內部「城堡」形狀內部的所有東西都被裁剪掉。我看到的問題是內部形狀沒有被正確裁剪。似乎是射線追蹤算法的一個問題。

任何想法都會有所幫助。

編輯:此外,我試圖測試每個Region.Op模式,並沒有解決這個問題。我懷疑我需要採取措施來檢測是否有「漏洞」並做一些有創意的事情。

回答

2

花了幾天的時間玩這個我已經解決了我的問題。

我需要設置與Path.FillType:

path.setFillType(Path.FillType.EVEN_ODD) 

但後來我有一個實例,其中恰恰相反,只有被漆成中心路徑。多一個小調查,我能修復與補充說:

canvas.clipPath(path, Region.Op.DIFFERENCE); 

但隨後多邊形在外面的單一路徑有自己的剪輯反轉。雖然我很滿意,我找到了正確的書呆子旋鈕以獲得正確的剪輯行爲,但我還沒有找到確定需要哪種剪輯方法的方法。

如果有人有任何想法可以分享,我會很高興。我懷疑它與線路添加到路徑的順序有關,例如內層是否定義在外層等。