ヘルミート曲線どうしの交差判定:FatLine + ベジエクリッピング法

赤系=曲線A、青系=曲線B。各曲線は3次ヘルミート曲線で、 アンカー点 P0・P1(大きい丸)接線ハンドル T0・T1(ひし形)をドラッグして形を変えられます。 アンカー点をドラッグすると接線ベクトルを保ったまま平行移動し、ハンドルをドラッグすると接線ベクトル(速度)の向きと大きさが変わります。
ヘルミート曲線 H(t) = h00(t)P0 + h10(t)T0 + h01(t)P1 + h11(t)T1 は、 3次ベジエ曲線と数学的に等価(B1=P0+T0/3, B2=P1−T1/3)なので、内部では等価なベジエ制御点に変換したうえで FatLine(相手曲線の制御点を包む2本の平行線, d∈[dmin,dmax])による反復クリッピングで交点を求めています。
サブパネルで「次のステップ」を押すと、その回に使われているFatLineの2平行線(紫破線)と、 処理中の各曲線の区間(太線ハイライト)がこのメインキャンバス上にも表示されます。

曲線A アンカー(P0,P1) 曲線A 接線ハンドル(T0,T1) 曲線B アンカー(P0,P1) 曲線B 接線ハンドル(T0,T1) 交点 A側最近点 B側最近点 ステップ中のFatLine

距離関数 D(t) と FatLine(2本の境界線)

各ヘルミート曲線 P0,T0,P1,T1 は、内部でまず等価な3次ベジエ制御点 [P0, P0+T0/3, P1−T1/3, P1] に変換されます。 その回にクリップされる側の曲線のベジエ制御点を、もう一方の曲線が作る基線からの符号付き距離に変換した関数 D(t)(青線)と、 その制御多角形(橙)・凸包(緑破線)を表示します。紫破線の2本が相手曲線のFatLineの上限 d=dmax・下限 d=dmin。 「次のステップ」を押すたびに、凸包がこの帯(2本の線の間)と重なる範囲だけにパラメータ区間をクリップし、 次は相手側の番に交代しながら収束するまで反復します。

D(t) 制御多角形 凸包 FatLine上限/下限 ■ 橙帯=クリップ結果 収束点