私の Cocoa 趣味プロジェクト (OSX 上) では、いくつかの点が特定されたビューがあります。このようなもの:
NSPoint pt1 = NSMakePoint(20,100);
NSPoint pt2 = NSMakePoint(100,30);
この 2 点の間に蛇行する (決して交差しない) 線を作成したいと思います。もちろん、ポイントは異なる場合があります。私はよく知ってNSBezierPath
いますが、グラフィックスの達人ではありません。
これには2つのバリエーションがあります。の与えられNSBezierPath *p ...
た設定[p moveToPoint:pt1]
[p lineToPoint:ptx]
ギザギザの曲がりくねった線を作成する場合に使用します。[p curveToPoint:ptx controlPoint1:cpt1 controlPoint2:cpt2]
なめらかな蛇行ラインでご使用ください。
適切な制御点も計算する必要があるため、2 番目のケースはより困難に思えます。
最後に、線の蛇行量を調整できるようにしたいと思います。変数 like を 1 に設定すると、 と の間にint numOfIntermediatePoints
滑らかな曲線ができます。10に設定すると、線の動きが大きくなります。最後の中間点が最終点から遠く離れないようにしたい (線の最後に大きな変化を残す)。pt1
pt2
numberOfIntermediatePoints
パーリンノイズを使ってみたのですが、線を終点に誘導するのが難しそうです。NSPoint
項目の配列 (ケース 2 では、場合によっては制御点の配列)を計算し、それらをループして線を作成するのが理にかなっているように思えます。
これに対する最善のアプローチは何ですか?
アップデート
Tommy のアドバイスに従い、Raymond Hill の Javascript-Voronoiライブラリを Obj-C に移植することになりました。ここで見つけることができます: https://github.com/cheaton/objcvoronoi
別のアップデート
もう 1 つ更新 - ダイクストラのアルゴリズムを試してみたところ、私が達成しようとしていたことに対してやり過ぎであることがわかりました。最終的に、ランダム ラインのガイド ノードを指定できる単純化されたバリエーションを実装しました。この画像では、線の始点が左中央、線の終点が右中央にあり、(xMax * 0.33, 0) と (xMax * 0.66, yMax) にガイド ポイントがあります。
最終更新
ぎざぎざを少し少なくするために、オプションの緩和アルゴリズムを追加しました。パフォーマンスは今のところ素晴らしいものではありませんが、私が考えている用途には問題ありません。