ボックスに対してテストする代わりに、もちろん、任意の形状に対してテストできます。
私は最初にNSBezierPathを使用できると投稿しましたが、iPhoneキットでは使用できず、Macでのみ使用できるようです。代わりに、iPhone では CGPath を使用できます。
を使用して新しいパスを作成します。CGPathCreateMutable()
これは、パスを作成する
ためにまたはconst CGPath *
としても知られています。ポイントが形状内にあるかどうかをテストします。CHPathRef
CGPathAddRect
CGPathAddLines
CGPathContainsPoint
または、(三角形を使用しているため)ポイントが三角形の内側にあるかどうかを確認するための簡単な計算を行う顧客関数を作成できます。ちょっとした計算でうまくいくはずです(ただし、形状を回転させると、少し複雑になります。形状の原点に対してタッチポイントを回転させてヒット検出を行うことができるので、少し書きます)
三角形の場合:
C
/\
/__\
A B
point of touch is P
次のアルゴリズムを使用すると、タッチを見つけることができるはずです。
/* first test against a box, for performance */
if( P.y > C.y || P.y < A.y || P.x < A.x || P.X > B.x )
return false; // false if P falls outside "the box"
/* then check if its within the shape */
/* split the triangle into 2 parts, around the axle of point C */
if( P.x < C.x ) // if the x value of point P is on the left of point C
if( P.y > ((C.y -A.y) / (C.x - A.x)) * P.x )
return false; // the point is above the triangle's side AC
else // if the x value of point P is greater than or equal to point C
if( P.y > C.y - ((C.y - B.y) / ( B.x - C.x )) * ( P.x - C.x ) )
return false; // the point is above the triangle's side BC
return true; // the point must be in the triangle, so return true.
上記はドライコーディングですが、正しいはずです。
上記は、私が描いた形状の三角形に対してのみ機能します (ここで、Cx は Ax と Bx の間にあり、A と B は同じ高さですが、C の下にあります)。もちろん、これを変更して任意の形状に対してテストすることはできますが、使用可能なCGPath
.
わからなかったり、間違っていたら教えてください!