4

ユーザーが指で画面にさまざまな色で描画できるアプリを作成しています。描画は UIBezierPaths で描画されますが、消しゴムが必要です。背景画像を色として使用する単なるパスである消しゴムがありましたが、この方法ではメモリの問題が発生します。消しゴムを選択したときに描かれたパスからポイントを削除したいと思います。

Unfortunately UIBezierPath doesn't have a subtraction function so I want to make my own. So if eraser is selected, it will look at all the points that should be erased and see if any of the existing paths contain those points, then subdivide the path leaving a blank spot. But it should be able to see how many points in a row to delete not do it one at a time. In theory it makes sense but I'm having trouble getting started on the implementation.

Anyone have any guidance to set me on the right 'path'?

4

1 に答える 1

3

一見すると、を使用するだけでUIBezierPathでヒット検出を実行できるように見えますcontainsPoint:。これは、ポイントがUIBezierPathの塗りつぶしに含まれているかどうかを判断する場合は正常に機能しますが、UIBezierPathのストロークのみがポイントと交差するかどうかを判断する場合は機能しません。特定のポイントがUIBezierPathのストローク内にあるかどうかの検出は、このページの下部にある「パスでのヒット検出の実行」セクションで説明されているように実行できます。実際、彼らが提供するコードサンプルはどちらの方法でも使用できます。基本的な考え方は、コアグラフィックスメソッドCGContextPathContainsPointを使用する必要があるということです。

消しゴムブラシの大きさにもよりますが、ブラシサークルのエッジにあるいくつかの異なるポイントをチェックして、それらがカーブと交差するかどうかを確認する必要があります。ヒットするまで、UIBezierPathsを反復処理する必要があります。boundsUIBezierPathを使用して、検索を最適化できるはずです。

ポイントがUIBezierPathと交差することを検出したら、パスの実際の分割を行う必要があります。この投稿には、アルゴリズムの概要が記載されているようです。そこにある主なアイデアは、DeCasteljauのアルゴリズムを使用して曲線の細分化を実行することです。C ++の実装を含め、クイック検索で見つけることができるはずのアルゴリズムのさまざまな実装があります。

于 2012-07-27T21:32:06.460 に答える