ベジェ曲線について調べているときに偶然見つけた記事。
グラデーションをベジェ曲線に沿って曲げながら描画するにはどうすればいいのかという話だ。図がたくさんあってとてもわかりやすい。
方法は思ったよりシンプルで、要点を抜き出すと、
- ベジェ曲線を直線の集合に分解
- それぞれの直線に沿うように長方形を並べる
- それぞれの長方形にグラデーションを描画
...というだけの話である。(上の図は前述の記事から引用)
これを Cocoa でもできないものか。いや、特に使う予定はないのだけど、楽しそうなので...!
Cocoa でやる
ところが 1 で困った。CGPath
にそういう機能がないのだ。数式から計算しないといけないのかと思いかけたが、実は意外に NSBezierPath
の機能が充実しているらしくこの場合は flattened
を取得すれば変換済みのパスが得られるらしい。汎用性を考えて CGPath
を使いたかったところだが、ただの実験なのでよしとしよう。
flattened
さえ取得してしまえば、これが含むのは直線の集合すなわち moveTo
と lineTo
の要素だけになるのでそれぞれの座標をもとに長方形をちりばめていくだけだ。
単純に点から点まで結ぶだけではカーブの外側が隙間だらけになってしまうので、各直線の中心から次の直線の中心へと結ぶ長方形も配置して無理やり埋めた。だから半透明なグラデーションだとおかしくなるけど気にしない。
参考にした記事と同じやり方ではないかもしれないけど、結果、それっぽいのができた! 使い道はないけど頭の体操としては面白かった。
以下、Playground(macOS)で動く雑なコード。
Share
リンクも共有もお気軽に。記事を書くモチベーションの向上に役立てます。