为什么CGPathIsRect不起作用?为什么CGPathContainsPoint不起作用?

时间:2012-01-21 04:48:41

标签: ios vector-graphics cgpath

我正在创建一个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

路径显然是一个矩形,点在闭合路径内。请告诉我我在这里做错了什么。

1 个答案:

答案 0 :(得分:1)

如果路径是由CGRectIsPath创建的(CGPathCreateWithRect参数不会旋转或倾斜矩形),或者路径是由{创建的话},则

transform仅返回true {1}}并使用CGPathCreateMutable添加了一个矩形。

要弄清楚任意路径是否恰好是一个矩形,还有很多工作要做。路径可能包含实际上是直线的贝塞尔曲线段,或者是从连续直线段构建的边。

如果您需要检测任意路径是否实际上只是一个矩形,则必须使用CGPathAddRect自行完成。这将很复杂。

至于为什么你的内部测试不起作用:你需要使用CGPathApply来创建矩形的边:

CGPathAddLineToPoint