[免責事項:以下は機能するはずですが、実際には自分でコーディングしていません]
「はい」/「いいえ」の答えを生成する「簡単な」方法を考えることはできませんでしたが、次の質問に対する実際的な解決策への合理的なアプローチになります。
曲線がそれぞれA(s)とB(t)であり、制御点がそれぞれ{ A0、A1..An }と{ B0、.. Bm }であるとします。
交差するかしないかを決定する2Dベジエのペアを考えると、考慮すべき6つのケースがあるように思われます。
それらが交差しないと「簡単に」判断できる場合。
それらが有限回数交差し、少なくとも1回確実に交差することを「簡単に」判断できる場合(ただし、実際にはそれらの交差がどこで発生するかは気にしません)
ベジエの1つは縮退、つまりポイントです(すべてのコントロールポイントが同一の場合に発生します)。両方がポイントであるケースをすでに処理したと想定できます。
1つ以上の曲線が閉じています。A0 == An。人生をより簡単にするために、そのような曲線を細分して、もう一度始めます。
それぞれが「親」のベジェのサブセットであり、それらがオーバーラップしているため、交点の数は無限にあります。
上記のケースについては確信が持てず、さらに調査が必要です
とりあえず、3と4は無視しますが、後で戻ってきます。
事例1
質問で示唆しているように、AとBの制御点のそれぞれの境界ボックスが交差しない場合、曲線は交差できません。明らかにこれは簡単な拒否テストですが、非常に保守的です。ご存知のように、ベジェ曲線では、その制御点の凸包は曲線上に(よりタイトな)境界を形成します。したがって、分離軸手法を使用して、AとBのハルが交差しないかどうかを判断できます。(例えば、ウィキペディアに示されているように:)
事例2
ケース1のテストが失敗した場合は、交差の「取るに足らない」存在を確認できます。おそらくこれを行うにはもっと良い方法があるでしょうが、次の比較的安価なアプローチが私に起こりました:
曲線Aだけを考えます。
曲線はで始まり、で終わり、凸包の内側にあることがわかります。簡単にするために、ラインセグメントの方向を計算し、どちらかの側の境界を計算します(つまり、垂線に対する残りの制御点のドット積を)。A N ¯ A 0 A N ¯ A 0 A n個A0AnA0An¯¯¯¯¯¯¯¯¯¯¯¯A0An¯¯¯¯¯¯¯¯¯¯¯¯
曲線Bでも同じことを行うと、次の(可能性のある)ケースが得られます。
私たちが発見した場合はと Bの外側に反対の境界されているとことをと Aの境界の外側にある、そして、ベジエの継続により、少なくとも一つの交差点がなければなりません。A n B 0 B mA0AnB0Bm
事例6
上記のいずれのケースもすぐに表示できない場合は、各ベジェを2つの「半分」、つまり分割します。これは比較的簡単です(読者への課題として残しました)が、2次ベジエの場合は特に簡単です。A1,A2,B1,B2
の4つの組み合わせを再帰的に比較します。明らかにすべてがケース1をパスする場合、交差はありません。1つでも失敗した場合は、そのサブセットを減らして残りのテストを続行します。(A1,B1),(A2,B1)...(A2,B2)
ケース3および5
ここが少し面倒になります。
「ケース3」が「ケース1」のテストを通過した場合、実際の交差点を解決する必要があるようです。ベジェAのN個の制御点A(s)をベジエA '(s)のN-1点にマッピングする単純なプロセスがあるとすると、その1次導関数を表します(ただし、 1次導関数がゼロになる、比較的まれな、いわゆる「縮退」状況)では、ニュートン反復(1次元)を使用して、潜在的なソリューションを見つけることができます。
また、A '(s)の制御点は微分値の境界であるため、一部のケースを早期に排除できる可能性があることにも注意してください。
ケース5は比較的ありそうにないように思われるため、おそらく数回の再帰の後、決定的な証明がない場合にのみ、カーブBに対してAの各エンドポイントを試すことができ、その逆も可能です。これは交差の証明のみを提供し、非交差の証明は提供しません。