2012-06-30 75 views

回答

5

NSBezierPath沒有精確定義它繪製哪些點,但它確實包含了定義它的片段所需的點。您可以使用elementAtIndex:associatedPoints:方法獲取路徑中每個向量元素的點。要獲取路徑中的每個點,您必須迭代所有元素並獲取關聯的點。對於直線,此方法將爲您提供端點,但如果您記錄了前一點,則可以根據需要使用任意數量的點。

對於曲線,您需要實現代碼來確定曲線沿曲線找到點的路徑。使用bezierPathByFlatteningPath來平坦化路徑會簡單得多,該路徑返回一條將所有曲線轉換成直線的新路徑。

下面是一個將路徑弄平並在結果中打印所有行的端點的示例。如果您的路徑包含長直線,您將需要根據長度添加沿線的點。

NSBezierPath *originalPath; 
NSBezierPath *flatPath = [originalPath bezierPathByFlatteningPath]; 
NSInteger count = [flatPath elementCount]; 
NSPoint prev, curr; 
NSInteger i; 
for(i = 0; i < count; ++i) { 
    // Since we are using a flattened path, no element will contain more than one point 
    NSBezierPathElement type = [flatPath elementAtIndex:i associatedPoints:&curr]; 
    if(type == NSLineToBezierPathElement) { 
     NSLog(@"Line from %@ to %@",NSStringFromPoint(prev),NSStringFromPoint(curr)); 
    } else if(type == NSClosePathBezierPathElement) { 
     // Get the first point in the path as the line's end. The first element in a path is a move to operation 
     [flatPath elementAtIndex:0 associatedPoints:&curr]; 
     NSLog(@"Close line from %@ to %@",NSStringFromPoint(prev),NSStringFromPoint(curr)); 
    } 
} 
+0

謝謝。沒有意識到elementAtIndex:associatedPoints:方法。但我有一個疑問。當我在bezierpathWithOvalInRect創建的bezierpath上展平路徑之後嘗試了元素數。我得到了一個數字17.如果每個元素只能包含一個點,我可以用17點創建一個完整的橢圓形,這怎麼可能? – Rakesh

+0

這取決於使用的橢圓形和平面的大小。如果減小平坦度值,線條將創建更精確的表示,這意味着它需要更多點。 – ughoavgfhw

0

不,因爲路徑是基於矢量的,而不是基於像素的。您必須在CGContextRef中呈現路徑,然後檢查從中設置了哪些像素。但是沒有內置的方法。

但是,如果您需要沿着路徑移動一個矩形,您可能可以使用CALayer來完成此操作,但我並不完全知道如何操作。

相關問題