または の上に透明な点または線を追加する方法を知りたいCGPath
ですNSBezierPath
。問題の詳細は次のとおりです。NSBezierPath
width = 30( orを使用して描画) という実線がありましたが、そのCGPath
上に透明なドットまたは透明な線 (厚さ = 2 または 30 より小さいもの) を描画したいと考えました。
2 に答える
を使用し-bezierPathByFlatteningPath
ます。
レシーバーのコピーを平坦化したら、その長さを計算します。
次に、基本的にポイントの配列であるフラット化されたコピーを反復処理します。カーブ上の正確な位置を確認できるように、連続するポイント間の距離を追跡します。
たとえば、オブジェクトの複数のコピーを描画する場合、フラット化されたコピーのどのセグメントにオブジェクトが存在するかを見つける必要があります。セグメントを見つけたら、そのセグメントの両端の間を線形補間して正確なスポットを見つけます。
これが達成したいことである場合は、少し詳しく説明して、これを行うために書いたカテゴリを投稿できます.
NSBezierPath または CGPath の要素を列挙し、それぞれに対して何かを行うことができます。
NSBezierPath には、、、およびループを使用elementCount
しelementAtIndex:associatedPoints:
ますfor
。にはelementAtIndex:associatedPoints:
、最大 3 つの の C 配列が必要NSPoint
です。
CGPath の場合は、 を使用しますCGPathApply
。これは、作成した C 関数へのポインターを取ります。関数の 2 つの引数の 1 つは、 によって返される情報と同じ情報を含む構造体elementAtIndex:associatedPoints:
です。ただし、ポイントの配列が作成されます。
要素のタイプは、それらの間でほとんど同じです。
A
moveto
orlineto
は1点を運ぶ。lineto
なぜ aに 2 つの点がないのか不思議に思うかもしれません。要素に関連付けられたポイントは、目的のポイント ( to in ) でlineto
あり、直後の新しい現在のポイントです。もう 1 つのポイント、つまりあなたが由来するポイントは暗黙的です。使用したい場合は、最後の現在のポイントを覚えておく必要があります。A (立方体)
curveto
は 3 つの点すべてを使用します。と同様に
lineto
、ソース ポイントは暗黙的であり、単に最後の現在のポイントです。配列の最後のポイントは、宛先アンカー ポイントです。他の 2 つのポイントはコントロール ポイントです。Core Graphics には
curveto
、2 つの点しかない 2 次要素があります。立方体
curveto
には 2 つのコントロール ポイントと 1 つのアンカー ポイントがあります。二次曲線には、制御点が 1 つとアンカー ポイントが 1 つしかありません。curveto
NSBezierPath には 2 次要素がありません。NSBezierPath のすべてのcurveto
要素は立方体です。- A
closepath
にはポイントがありません。前回のポイントに戻りますmoveto
。
いずれにせよ、要素ごとに、必要なアンカー ポイント インジケーターを描画します。たとえば、目的のポイントに青い円を描画し、 a には何も描画しないことがclosepath
できます (一致する に遭遇したときに既に描画しているためmoveto
)。要素の場合curveto
、2 つの制御点のそれぞれにインジケーターを描画することもできます。