オブジェクトがあるNSBezierPath
場合、描画されたすべてのポイントの座標 (x、y) を取得する方法はありますか? NSRect
パスに沿って移動したい。
2 に答える
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));
}
}
いいえ、パスはピクセル ベースではなくベクトル ベースであるためです。でパスをレンダリングし、CGContextRef
そこから設定されたピクセルを確認する必要があります。しかし、これには組み込みのメソッドはありません。
ただし、パスに沿って長方形を移動する必要がある場合は、おそらく a を使用CALayer
してこれを行うことができますが、その方法は完全にはわかりません。