全ての曲率極大点がユーザ制御点上にあるそんな超便利なのにあまり知られていないパラメトリック曲線こと「κ-Curves」。Illustratorに実装されています。新しめなせいか、検索しても情報があまり出てきません。この論文と同じ流れを、前提知識や行間を補いつつ日本語で追っていきます。C#で実際に実装もしていきます。論文に忠実に実装するとちょっとバグるので、その修正も。※本記事では、上記論文から一部画像や式を引用しています。これは論文から引用した図で、他の様々なパラメトリック曲線とκ-Curvesの比較。B-スプライン、κ-Curvesです。これは私が実装したκ-Curvesで描いたどう見ても鳥。※2020/2/7追記これまで掲載していた実装には二分探索を含んでいましたが、重かったのでカルダノの公式による実装に変更しました。行列計算のメモリ管理を見直しました。記事公開当初の掲載内容と比べて5倍近く速くなっています。簡単のため、本記事ではxy平面上の曲線のみを考えます。高校レベルの数学+行列の基礎知識で理解できる内容のはずです。パラメトリック曲線パラメトリック曲線とは、X座標、Y座標がそれぞれパラメータ$t$によって決まる曲線です。\begin{align}&f:\mathbb{R}\rightarrow\mathbb{R}^2\\&f(t)=\left(\begin{matrix}x(t)\\y(t)\end{matrix}\right)\end{align}世の中には様々なパラメトリック曲線があります。f'(0),f'(1)$の値が制約として与えられ、それを満たすような$t$の3次式。c_{i,n}$が与えられる。c_{i,n}$を結ぶ線をそれ以外の制御点がそれぞれ引っ張ったような曲線になる。c_{i,n}$以外の制御点の上を通らない。スプライン曲線3次曲線などをいくつも繋げたり重ねたりして一本の曲線を作るもの。Catmull-Romスプライン、B-スプライン、NURBSなど。接続点を制御点として動かすタイプの場合、曲線は制御点上を通る。通るだけで、期待した形になるとは限らない。なんかひん曲がってしまう例(Excelの曲線ツール):と、他にもいろいろありますが、とにかくどれもこれも融通が効きません。イラストソフトなどでポチポチクリックした場所をいい感じになめらかに繋いで曲線を作ってほしい場合、どれも力不足。κ-Curvesは、曲率を制御することでこれを実現します。※ベースはベジェ曲線なので、ベジェ曲線以外のことは忘れて大丈夫です。κ-Curvesは、「ユーザー制御点の曲率の絶対値が極大になる」という特徴を持つ曲線です。曲率とは、曲線上のある点の周りの微小区間を円弧に近似したときの円の半径の逆数(符号付き)です。要は、曲線上のある点の周囲がいかに急カーブかを示す値ですね。絶対値が大きいほど急になります。軽く導出しておきましょう。s=r\Delta\theta$が成り立ちます。s}=\frac{d\theta}{ds}と表されます。\dot{y}^2}\end{align}が得られます。ドット2つは$t$での二階微分です。f''(t)}{\|f'(t)\|^3}\end{align}が導かれます。κ-Curvesは、ユーザ制御点上でこの値(の絶対値)が極大値を取るような曲線である、ということです。先程少し触れましたが、κ-Curvesはベジェ曲線がベースになっています。いうか、曲線の式自体はベジェ曲線そのものなのです。いうわけで、まずはベジェ曲線について。一般の$d$次ベジェ曲線の$i$番目のセグメントは、$c_{i,j}$をそのセグメントのベジェ制御点とするとc_i^d(t)=\sum_{j=0}^d\frac{d!}{(d-j)!j!}(1-t)^{d-j}t^jc_{i,j}で表されますが、κ-Curvesにおいては次に示す2次ベジェ曲線を前提とします。$d$のことは忘れてください。c_{i,1}))\end{align}となります。c_i''(t)}{\|c_i'(t)\|^3}\\&=\frac{\triangle(c_{i,0},c_{i,1},c_{i,2})}{\|(1-t)(c_{i,1}-c_{i,0})+t(c_{i,2}-c_{i,1})\|^3}\\\end{align}\\となります。ここで$\triangle(c_{i,0},c_{i,1},c_{i,2})$は3つの制御点を結んだ三角形の符号付き面積で、つまり定数です。......どこから出てきたんやお前、と言いたくなる式変形。元論文にはこれが何の説明もなく出てきました。