太さの変わるBezier曲線の生成 - その22 [考え中 - 太さの変わるBezier曲線]
離散的な点の連続を内挿する方式としてのAGG方式の検討のおさらい中。ちょっとだけ実装につっこんでNSBezierPathの復習の2回目、NSBezierPathの「エレメント」について。
NSBezierPathElement
NSBezierPathのオブジェクトがどのようなサブパスに分かれているかを含めて制御点の位置を知るメソッドとして
- (NSInteger)elementCount; - (NSBezierPathElement)elementAtIndex:(NSInteger)index; - (NSBezierPathElement)elementAtIndex:(NSInteger)index associatedPoints:(NSPointArray)points; - (void)setAssociatedPoints:(NSPointArray)points atIndex:(NSInteger)index;がある。
ここで言っている「エレメント(element)」というのは、Bezier曲線のなかのひとつの多項式で表される部分のことである。
NSBezierPathElementとは
typedef enum { NSMoveToBezierPathElement, NSLineToBezierPathElement, NSCurveToBezierPathElement, NSClosePathBezierPathElement } NSBezierPathElement;と定義された定数で、そのエレメントのタイプを表し、それぞれがどのメソッドで描かれたかと直接対応する。
elementCountメソッドはエレメントがいくつあるか、elementAtIndex:はある位置のエレメントがどのタイプかを返す。
エレメントごとの制御点座標を得るメソッド
elementAtIndex:associatedPoints:メソッドではある位置の制御点の座標を得ることができる。引数のNSPointArrayは
typedef NSPoint *NSPointArray;と定義されていて、少なくともNSPoint3つ分の領域を確保してelementAtIndex:associatedPoints:を呼ぶと、制御点の座標がNSPointで返される。いくつ意味があるNSPointが返るかはエレメントのタイプによって違う。
NSBezierPathElement | points[0] | points[1] | points[2] |
---|---|---|---|
NSMoveToBezierPathElement | 端点 | × | × |
NSLineToBezierPathElement | 端点 | × | × |
NSCurveToBezierPathElement | 制御点1 | 制御点2 | 端点 |
NSClosePathBezierPathElement | (現在の位置) | × | × |
NSCurveToBezierPathElementでは配列に格納される順番は、描くときのcurveToPoint:controlPoint1:controlPoint2:の制御点の順番とは違うので、これも注意が必要である。
NSClosePathBezierPathElementは、本当はここに閉じるべき描きはじめの座標が入ると便利なんだけど、残念ながらそうなっていはいない。
2009-05-20 22:17
nice!(0)
コメント(0)
トラックバック(0)
コメント 0