不具合の原因がちゃんと分かった方はぜひご連絡ください。それでも飛び出ることはある具体的には、極薄極小のセグメントの存在が問題のようです。これはもう何というか、曲線ツールで鋭角を描こうとしているのが悪いです。超鋭角の部分を検知して、その点で切断して2つのκ-Curvesに分けるといいかもしれません。おわりにκ-Curvesは、一昨年に大学で出た発展課題の一つでした。そこで存在を知ったわけですが、非常に便利なので普段のゲーム開発にも流用しています。ゲームのランタイムで動かすにはちょっと重いかもですが、イテレーションを抑えれば使えないほどでもなく、またエディタ拡張でパスを生成するときとかには大活躍です。取り入れてみてください。ちなみに課題で提出したのはこれです:https://k-curves.glitch.me/project/kadai/main.htmlJavaScript実装、ループ非対応。LU分解まずLU分解とは、正方行列を下三角行列$L$と上三角行列$U$の積に分解する操作です。$Ax=b$という連立方程式があるとき、$A=LU$とLU分解することで、$Ly=b$と$Ux=y$という2つの連立方程式に分離することができます。)ので、$A$がLU分解されていれば、ガウスの消去法を使った$O(n^3)$の解法より速くなります。一般のLU分解は$O(n^3)$かかってしまうので、これは同じAを何度も利用する際にのみ有効な手段ですが、$A$が三重対角行列の場合、LU分解もその後の計算も全て$O(n)$になります。$L$の対角成分を1に固定しましょう。このとき、三重対角行列のLU分解$A=LU$の最初の様子は以下のように表せます。\left(\begin{matrix}a_{11}&a_{12}&&O\\a_{21}&&&\\&&A'&\\O&&&\end{matrix}\right)=\left(\begin{matrix}1&&&O\\l_{21}&&&\\&&L'&\\O&&&\end{matrix}\right)\left(\begin{matrix}u_{11}&u_{12}&&O\\&&&\\&&U'&\\O&&&\end{matrix}\right)成分を比較すると、\begin{align}a_{11}&=u_{11}\\a_{12}&=u_{12}\\a_{21}&=u_{11}l_{21}\\A'&=L'U'+\left(\begin{matrix}l_{21}u_{12}&\\&O\end{matrix}\right)\end{align}なので、\begin{align}u_{11}&=a_{11}\\u_{12}&=a_{12}\\l_{21}&=\frac{a_{21}}{a_{11}}\\\end{align}としてA'-\left(\begin{matrix}l_{21}u_{12}&\\&O\end{matrix}\right)=L'U'を再帰的にLU分解していけばよいことが分かります。$O(1)$の$n$回ループなので$O(n)$です。この計算では分解し終わった部分が後で必要になることはなく、さらに$L$の対角成分は全て1なので、$L$と$U$を重ね合わせることで$A$のメモリのみを使って分解できます。\left(\begin{matrix}a_{11}&a_{12}&&O\\a_{21}&a_{22}&a_{23}&\\&a_{32}&\ddots&\\O&&&\end{matrix}\right)\rightarrow\left(\begin{matrix}u_{11}&u_{12}&&O\\l_{21}&u_{22}&u_{23}&\\&l_{32}&\ddots&\\O&&&\end{matrix}\right)元が三重対角行列なので、$L,U$は共に各行2つ以下の要素しか持ちません。計算量も$O(n)$となります。右上と左下に角がついている場合(行列サイズを拡張しない場合)も、少し複雑にはなりますが$O(n)$で分解できます。\left(\begin{matrix}a_{11}&a_{12}&O&a_{1n}\\a_{21}&&&\\O&&A'&\\a_{n1}&&&\end{matrix}\right)=\left(\begin{matrix}1&&&O\\l_{21}&&&\\O&&L'&\\l_{n1}&&&\end{matrix}\right)\left(\begin{matrix}u_{11}&u_{12}&O&u_{1n}\\&&&\\&&U'&\\O&&&\end{matrix}\right)成分を比較すると、\begin{align}u_{11}&=a_{11}\\u_{12}&=a_{12}\\l_{21}&=\frac{a_{21}}{a_{11}}\\u_{1n}&=a_{1n}\\l_{n1}&=\frac{a_{n1}}{a_{11}}\\\end{align}なので、A'-\left(\begin{matrix}\displaystyle\frac{a_{21}a_{12}}{a_{11}}&O&\displaystyle\frac{a_{21}a_{1n}}{a_{11}}\\O&O&O\\\displaystyle\frac{a_{n1}a_{12}}{a_{11}}&O&\displaystyle\frac{a_{n1}a_{1n}}{a_{11}}\\\end{matrix}\right)=L'U'となり、再帰的に分解できます。$A'$のサイズが1のときはこの四隅は同じ位置を指すので、重複して引いてしまわないよう注意が必要です。変わらず$O(n)$ではありますが、$L$は最下一行、$U$は最右一列が追加で埋まっています。$L$も$U$も左からかけるので、この追加行・列の扱いは非対称的です。4$行列くらいの具体例で実際に手を動かしてみると実感できると思います。私の環境でのパフォーマンス計測結果です。時間は10000回の平均値(四捨五入)で、CalcBezierControls()の時間のみを計測しています。\rm{iteration})$です。イテレーションは実用上は5~10回くらいで充分なので、C#実装でこれならそこそこ実用的な速度が出るかなと。loop);}複素数構造体カルダノの公式でちょっと使ってたの忘れてました。何の変哲もない複素数structですが、一応載せておきます。requestStockLike245りじちょー@Rijicho_nl東大の同人ゲーム制作サークル「ノンリニア」のプログラマ、絵師、シナリオライター。upLoginユーザーは見つかりませんでした。