2011-09-15 7 views
4

私はネイティブのiPadアプリ(私たちは必要に応じてiOS 4.3+を想定することができます)から始まります。ここでは、お互いにぶつかり合う湾曲した領域が必要です。カーブした領域でタッチイベントを検出/処理する方法は?

A series of curved regions stacked on top of each other

私はこれを処理するための最良の方法についていくつかのアドバイスをしてみたいです。

私はWebViewを使用し、JPGとHTMLイメージマップを持っていたと思いましたが、カーブをサポートするいくつかの種類のネイティブUI要素を使用したいと思っています。

推奨事項

+0

ベジェパスを作成し、それらを三角形にして(凹形状として)、タッチポイントがいずれかの三角形にあるかどうかを確認します。 – Eimantas

+0

Eimantas、興味深いと思う。あなたは私のために少しの概念を肉体化できますか? –

+2

ベジエパスを三角測量する必要はありません。 'UIBezierPath'はすでに' containsPoint: 'メソッドを持っています。 – omz

答えて

2

我々はこのような問題の何かを持っていました。それを解決するために、Adobe Illustratorで白黒マスクを作成しました。あなたは、あなたが必要とするそれぞれの異なる地域ごとにこれを行う必要があります。

次に、このファイルをエクスポートしました。私はファイルのエクスポートオプションを覚えていませんが、基本的には、線、ベジエ曲線などを含むパスデータのロードを持つテキストファイルを取得します。

次に、このファイルを取り上げて、 CGPathを作成しました。

最終段階は簡単なビットです。あなたはタッチポイントをUITouchから取得し、CGPathContainsPoint呼び出しを行います。ここで

は、このためのいくつかの擬似コードです:私たちは「1つのXR」と1になるまで

  1. は、行をスキップします。これは、後の行で何か意味のあるものが表示されている です。

  2. ""の区切り文字を使用して、行をコンポーネントの配列に分割します。

  3. 行の最後の部分がアクションです。それが「m」の場合はパスの移動、「C」の場合はベジエ曲線、「L」の場合はラインです。それは、あなたが以下のように前の行のコンポーネントを取得して解析する必要がある「Y」または「V」なら

(a)の部品数は、アクションが含まれて、私たちは削減する必要がありますこの。例えば。 274.5600 463.6800 m (b)この行に4つの座標があり、前の行に2つの座標がある場合、それはベジェ・ノードのポイント・ノードです。次のようにベジェ曲線の点を図:

cp1x = previous line's components object at index 0 
    cp1y = previous line's components object at index 1 
    cp2x = this line's components object at index 0 
    cp2y = this line's components object at index 1 
    x = this line's components object at index 2 
    y = this line's components object at index 3 

(c)はこの行が4点の座標を持ち、次のように前の行は、数字を4点のまたは6つの座標を持ちそうでない場合:

CP」である
cp1x = this line's components object at index 0 
    cp1y = this line's components object at index 1 
    cp2x = this line's components object at index 2 
    cp2y = this line's components object at index 3 
    x = this line's components object at index 2 
    y = this line's components object at index 3 

を制御点 "と呼ぶ。したがって、コントロールポイント1とコントロールポイント2が、それぞれのx座標とy座標を持ちます。

+0

これは私にとって良いアプローチのように聞こえます。私はIllustratorですでに作業している地域があると確信しています。あなたのコードを見たいと思っています。 –

+0

となります。私の古い上司ともう一度チェックしてみてください。私はいくつかの抜粋を投稿しても構いません!... –

+0

あなたが共有できるものはどれも素晴らしいでしょう。ありがとう! –

0

lineToPointまたは同様の機能を実行することによって)それぞれが別々の領域を表すベジェパスを作成します。

UIBezierPath *p1 = [UIBezierPath bezierPath]; 
[path1 lineToPoint:somePoint]; 
[pointArray1 addObject:NSStringFromCGPoint(somePoint)]; 
// create lots of points and close p1 path 

は、代わりにあなたが三角形の座標の配列(配列の配列を格納したい座標ベジェパスポイントの配列を格納する、すなわち(三角形の配列に各ベジェパスを回すでしょう凹面形状のためのいくつかの三角測量アルゴリズムを見つけます点の)。アルゴリズムと説明が任意のゲーム開発フォーラムで、あるいはGameDev of stack exchangeで見つけることができます。

各地域のベジェパスの作成と三角測量を繰り返します。

は、それは単純な反復の問題ですこれらの配列を持ちます特定の興味のある点があるかどうかをチェックするこれらの三角形のne。

更新は、したがって、それはベジエパスを作成し、それらのそれぞれのメソッドを呼び出すだけの問題だ、@omzコメントは私の答えは無用と思われます。)

関連する問題