2012-01-21 16 views
0

CGPointとCGPathRefを作成して、CGPointがCGPathRefの内側にあるかどうかを調べようとしています。ここでは、コードは:CGPathIsRectが動作しないのはなぜですか?なぜCGPathContainsPointは機能しませんか?

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, 0, 0); 
CGPathMoveToPoint(path, NULL, 200, 0); 
CGPathMoveToPoint(path, NULL, 200, 200); 
CGPathMoveToPoint(path, NULL, 0, 200); 
CGPathCloseSubpath(path); 

CGPoint hitPoint = CGPointMake(77, 77); 

if (CGPathIsEmpty(path)) 
    NSLog(@"Path Is Empty!"); 
else 
{ 
    if (CGPathIsRect(path, NULL)) 
     NSLog(@"Path is a Rectangle!"); 
    else 
    { 
     NSLog(@"Path is NOT a Rectangle!"); 
     if (CGPathContainsPoint(path, NULL, hitPoint, FALSE)) // FALSE or TRUE - same result 
      NSLog(@"Hit Point Inside: x=%f, y=%f", hitPoint.x, hitPoint.y); 
     else 
      NSLog(@"Hit Point Outside: x=%f, y=%f", hitPoint.x, hitPoint.y); 
    } 
}  

出力を読み取り:

Path is NOT a Rectangle! 
Hit Point Outside: x=77.000000, y=77.000000 

経路が明らかに長方形であり、点は閉じた経路内にあります。私がここで間違っていることを私に手がかりにしてください。パスはCGPathCreateMutableによって作成された単一の矩形がCGPathAddRectでそれに加えた場合にパスが(矩形を回転又はスキューないtransformパラメータで)CGPathCreateWithRectによって作成された、またはされた場合

答えて

1

CGRectIsPathのみtrueを返します。

任意のパスがまさに矩形であるかどうかを調べることはずっと多くの作業になります。パスには、実際には直線であるベジェ曲線セグメント、または連続した直線セグメントで構築された辺が含まれる場合があります。

任意のパスが実際に矩形であるかどうかを検出する必要がある場合は、CGPathApplyを使用して自分で行う必要があります。それは複雑になります。あなたは、長方形の側面を作成するためにCGPathAddLineToPointを使用する必要があります:

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, 0, 0); 
CGPathAddLineToPoint(path, NULL, 200, 0); 
CGPathAddLineToPoint(path, NULL, 200, 200); 
CGPathAddLineToPoint(path, NULL, 0, 200); 
CGPathCloseSubpath(path); 
+0

は非常にロブをありがとう!あなたのポイント-内部のテストが機能しない理由については

StoneBreaker

関連する問題