0

CGPointとCGPathRefを作成してから、CGPointがCGPathRef内にあるかどうかを調べようとしています。コードは次のとおりです。

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

パスは明らかに長方形であり、ポイントは閉じたパスの内側にあります。ここで私が間違っていることを教えてください。

4

1 に答える 1

1

CGRectIsPathCGPathCreateWithRectパスがによって作成された場合(transform長方形を回転または傾斜させないパラメータを使用)、またはパスがによって作成されCGPathCreateMutable、に単一の長方形が追加された場合にのみtrueを返しますCGPathAddRect

任意のパスが正確に長方形であるかどうかを判断するのは、はるかに手間がかかります。パスには、実際には直線であるベジェ曲線セグメント、または連続する直線セグメントから構築された辺が含まれる場合があります。

任意のパスが実際に単なる長方形であるかどうかを検出する必要がある場合は、を使用して自分で検出する必要があります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);
于 2012-01-21T05:26:54.073 に答える