So-net無料ブログ作成

太さの変わる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が返るかはエレメントのタイプによって違う。
NSBezierPathElementpoints[0]points[1]points[2]
NSMoveToBezierPathElement端点××
NSLineToBezierPathElement端点××
NSCurveToBezierPathElement制御点1制御点2端点
NSClosePathBezierPathElement(現在の位置)××
ここで×はメソッド呼び出しでは変更されないということである。NSPointArrayを確保した直後だとゴミが入ったままになるので注意が必要である。NSClosePathBezierPathElementでは現在の位置が返るが、これはあまり意味がなく、閉じているという情報だけがあると考えたほうがいい。

NSCurveToBezierPathElementでは配列に格納される順番は、描くときのcurveToPoint:controlPoint1:controlPoint2:の制御点の順番とは違うので、これも注意が必要である。

NSClosePathBezierPathElementは、本当はここに閉じるべき描きはじめの座標が入ると便利なんだけど、残念ながらそうなっていはいない。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0