私はずっと前にこれを行うためのコードを書きました。私が取り組んでいたプロジェクトでは、PostScipt パスとして生成された区分的なベジエ境界を使用して定義された 2D オブジェクトが使用されていました。
私が使用したアプローチは次のとおりです。
曲線 p、q をベジエ制御点で定義します。それらは交差しますか?
コントロール ポイントの境界ボックスを計算します。オーバーラップしない場合、2 つの曲線は交差しません。それ以外の場合:
px(t)、py(t)、qx(u)、qy(u) は 0 <= t,u <= 1.0 の 3 次多項式です。距離の二乗 (px - qx) ** 2 + (py - qy) ** 2 は (t,u) 上の多項式です。Newton-Raphson を使用して、それをゼロで解決してみてください。0 <= t,u <= 1.0 以外の解は破棄します
NR は収束する場合と収束しない場合があります。曲線が交差しないか、2 つの曲線がほぼ平行になると NR が爆発する可能性があります。したがって、任意の回数の反復後に収束しない場合は、NR を切り捨てます。これはかなり小さい数になる可能性があります。
NR が解に収束しない場合は、t = 0.5 で 1 つの曲線 (たとえば、p) を 2 つの曲線 pa、pb に分割します。これは簡単です。リンクされた記事が示すように、中点を計算するだけです。次に、(q, pa) と (q, pb) の交点を再帰的にテストします。(再帰の次の層では、q が p になっているので、再帰の各層で p と q が交互に分割されることに注意してください。)
境界ボックスが重複していないため、ほとんどの再帰呼び出しはすぐに返されます。
2 つの曲線が平行で、まったく接触していない奇妙なケースを処理するために、任意の深さで再帰を切断する必要がありますが、それらの間の距離は任意に小さく、おそらく 1 ULP しか違いません。
交点が見つかっても、それで終わりではありません。3 次曲線には複数の交点がある可能性があるからです。したがって、交点で各曲線を分割し、(pa、qa)、(pa、qb)、(pb、qa)、(pb、qb) の間の交差を再帰的にチェックする必要があります。