2012-03-25 49 views
1

當渲染重疊的CGPath時,Apple使用纏繞規則來決定是否將它們都渲染爲實體,或者使用其中一個切割另一個。我想讓我的所有CGPath都是穩定的,但我不能告訴用戶「用這種方式把它們畫到或者其他地方」,所以我需要檢測繞組方向是否與正常相反,然後將其反轉。尋找CGPath的方向/纏繞方向

我知道如何使用CGPathApply來反轉路徑的所有元素(雖然它有很多樣板代碼) - 但是如何訪問CGPath的卷繞方向?蘋果公司是否已經計算過它(因爲它們在內部使用它)?

最壞的情況,我也重新實現了車輪,並進行其他CGPathApply計算繞組 - 但似乎過於樣板/容易出錯,所以如果有一個蘋果源出於此信息...

回答

0

爲什麼不使用even-odd fill rule代替?然後每個子路徑的方向不會影響結果。用戶至少會看到一致的奇怪結果,並能夠找出不這樣做。

無論如何,沒有一個真正的根本「路徑方向」的路徑。填充規則總是在點評估繞線

想象一下一個八字形的路徑,其中一個葉片順時針旋轉,另一個逆時針旋轉。一個葉片內的一個點的繞組不同於另一個葉片的繞組。

我想如果你想強制你的對象是「堅實」的,你將不得不對用戶輸入的路徑做一些手術。同樣,給出一致的結果可能會更容易,並讓用戶自己弄清楚如何做到這一點。

+0

EO是我在問這個問題的相反,所以我不明白這會有什麼幫助。 C.F. 「我希望我所有的CGPath都是穩定的」。 – Adam 2012-03-29 12:52:35

+0

re:八位數字 - ouch。碰巧,由於應用程序的本質,繪製起來非常不方便,但我明白了你的觀點。我可以在繪圖階段添加一些東西來防止自相交,儘管它可能只是作爲用戶方面的事故發生。 – Adam 2012-03-29 12:54:44

0

最後,我寫了我自己的。僞代碼:

  1. 使用CGPathApplier運行自定義功能
  2. 每個節點轉換爲自定義對象(因爲蘋果的API是不OOP)
  3. 迭代所有節點,如果你發現一個CLOSE這是而不是最後一個節點,分割(你有多個子路徑),然後重新啓動每個子路徑的算法,遍歷所有節點,沿着每個線段中途選取一個點,然後向左步進1個像素,向右一個像素(其中「左/右」表示「垂直於線的方向」
  4. 詢問Ap PLE「是內部路徑(像素向左)?」
  5. 同上像素向右
  6. 如果所有都向左=繞組
  7. 如果都是向右=如果左混合/右繞組b
  8. =警告用戶,他們的形狀越過自己,一切都會變得奇怪和錯誤