接続の種類
C0連続:位置ベクトルの0階微分連続
C1連続:位置ベクトルの0,1階微分が連続
C2連続:位置ベクトルの0,1,2階微分が連続
G0連続:C0連続と同じ
G1連続:接ベクトルが同じ方向
G2連続:符号付曲率が連続
G1連続はG0連続であり、G2連続はG0,G1連続でもあるとします。
C0連続とG0連続は同じことだと思うので、以下G0連続という言葉は使わず、C0連続という言葉を使います。
C0連続
の終点と の始点が一致するように 全体を動かします。
※ 全体を動かす必要は無いのですが、全体を動かした方が使いやすいと思うので。
なので、 とし、とすればよいです。
G1連続
まず、C0連続にします。
次に を動かして接ベクトルの方向が一致するようにします。
を中心に を回転させて、 が と同じ方向になるようにします。
とおくと、
が回転角度です。
G2連続
※G2連続では3つのアルゴリズムを紹介します。
「アルゴリズムQ1」は条件付きで のみを動かすアルゴリズムです。
「アルゴリズムQ2」は のみを動かすアルゴリズムです。
「アルゴリズムQ1Q2」は の両方を動かすアルゴリズムです。
まず、C0,G1連続にします。
次に を動かして曲率が一致するようにします。
を原点、 が x+ 上に来るように を座標変換します。
座標変換の平行移動は であり、回転角度 は とおくと、 です。
よって、座標変換を表す行列 は
となります。
下図は座標変換後の曲線 です。
座標変換後の の座標を とおきます。
における符号付曲率半径を とします。
であり、変換後の座標系では、 なので、
となります。
と が同じ符号の時、 を更新します。(アルゴリズムQ1と命名します)
となるので、求める は変換後の座標系で となります。
これをもとの座標系にすると、 となります。
と が異なる符号の時、 を更新します。(アルゴリズムQ2と命名します)
※アルゴリズムQ2は と の符号は関係ないアルゴリズムです。
あなたが を更新したいのであれば、最初からアルゴリズムQ2を採用しましょう。
を動かせないときに、やむを得ず を動かすという風に紹介したかったので、「異なる符号」と書いています。
となるので、求める は変換後の座標系で となります。
これをもとの座標系にすると、 となります。
と の関係性により、 を更新したり、 を更新するというアルゴリズムですが
これだと場合によっては、 または が大きく更新されて曲線の形状が大きく変化する場合があります。
それを避けるために の片方ではなく、両方更新することによって、
曲線の形状をあまり変化させないようにG2連続してみたいと思います。(アルゴリズムQ1Q2と命名します)
とします。
より、 であることに注意しましょう。 は拘束条件はありません。
目的関数 を以下のように定義します。
また、曲率の式より、 を で表せます。
式 を式 に代入します。
式 を で偏微分して とおきます。
式 を満たす実数解の内、式 を最小にするものを採用します。
(式 を解くには、解析的解法と数値的解法(ニュートン法など)がありますが、数値的解法の方がいいんじゃないかって思っています。)
式 を解いて が定まると、式 より も定まります。
そうすると、 が定まります。
これらをもとの座標系にすると、 となります。
最後に
・G2連続のアルゴリズムですが個人的には、3次方程式がうまく解けない場合に、
の片方のみを更新するのが良いのでは思っております。
・G2連続の発展的な話題として、 を動かしてみるのもありかもしれません。
の角度と と の3つ自由度による最適化も面白いかもしれない。
・G2連続の発展的な話題として、 を中心に を同じ角度回転させて
と が同じ符号になるようにして「アルゴリズムQ1」が適用するのはどうかと思いましたが、
これだと接続部周辺の形状が変化しすぎる場合があり得るので、これはよくないなと思いました。(考えたことをメモしておきます。)
・パソコンのモニタなどで見る曲線の接続はG1連続ぐらいで十分だと思います。