2012-01-21 353 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 

路徑顯然是一個矩形,該點在閉合路徑的內部。請告訴我我在這裏做錯了什麼。

回答

1

CGRectIsPath僅如果路徑是由CGPathCreateWithRect創建(用transform參數不旋轉或傾斜的長方形)返回true,或者如果路徑是由CGPathCreateMutable創建,不得不加入到一個單一的矩形與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); 
+0

非常感謝你來搶! – StoneBreaker