2012-07-27 115 views
4

我正在製作一個應用程序,允許用戶用不同顏色的手指在屏幕上繪製。圖紙是用UIBezierPaths繪製的,但我需要一個橡皮擦。我確實有一個橡皮擦只是背景圖像作爲顏色的路徑,但是這種方法會導致內存問題。我想刪除選擇橡皮擦時所繪製的任何路徑上的點。UIBezierPath從另一個UIBezierPath減去

不幸的是UIBezierPath沒有減法函數,所以我想自己做。因此,如果選擇了橡皮擦,它將查看應該擦除的所有點,並查看是否有任何現有路徑包含這些點,然後細分留下空白點的路徑。但它應該能夠看到連續刪除多少個點不一次一個。理論上它是有道理的,但我在開始實施時遇到了麻煩。

任何人有任何指導,讓我在正確的'路徑'?

+0

這是不必要的複雜。是否有一個原因,你不能光柵化的路徑(即繪製它們到一個CGBitmapContext,只需在drawRect中繪製上下文)?這將消除你的記憶問題(並且使用kCGBlendModeClear代替與BG擦除相同顏色的筆畫)。你的方法會很快變慢。 – borrrden 2012-07-28 02:12:18

回答

3

乍一看,你可以通過簡單地使用containsPoint:來實現在UIBezier路徑上的點擊檢測。如果您想確定該點是否包含在UIBezierPath的填充中,但它不適用於確定是否僅UIBezierPath的筆劃與該點相交。檢測給定點是否在UIBezierPath的行程中可以按照this page底部的「在路徑上執行點擊檢測」部分所述完成。實際上,他們提供的代碼示例可以以任何方式使用。基本思想是你必須使用核心圖形方法CGContextPathContainsPoint

根據橡皮刷的大小,您可能需要檢查畫筆圓邊上的幾個不同點,看看它們是否與曲線相交,並且您可能必須遍歷UIBezierPaths,直到您得到一擊。您應該能夠使用UIBezierPath的bounds優化搜索。

當您檢測到點與UIBezierPath相交後,您必須執行實際的路徑分割。在this post中似乎有一個很好的算法概要。主要想法是使用De Casteljau's algorithm來執行曲線的細分。您可以通過快速搜索找到該算法的各種實現,包括C++中的一些實現。