2つのベジェ曲線の交差の信頼できるテスト


9

2つの平面ベジェ曲線が交差するかどうかを確実に見つける方法は?「確実に」とは、曲線が交差する場合にのみ「はい」と答え、交差しない場合のみ「いいえ」と答えることを意味します。交差点が見つかったパラメータを知る必要はありません。また、実装で浮動小数点数を使用したいと思います。

StackOverflowで、曲線の境界ボックスをテストに使用するいくつかの回答を見つけました。曲線が交差していなくても、そのようなテストが交差を報告する可能性があるため、これは私が求めているものではありません。

私がこれまでに見つけた最も近いものは、SederbergとMeyersによる「境界のくさび」ですが、最大で1つと2つ以上の交差を「唯一」区別しますが、最大で0があるかどうかを知りたいです。 1つ以上の交差点。


それがそのように存在するかどうかはわかりませんが、1か2またはそれ以上の可能性があるかどうかを判断することは非常に簡単ですが、実際に確認せずに0または1を確認するのは簡単ではありません。
joojaa

ランタイム要件は何ですか?かなり正確な結果を生成できるはずの解決策は、両方の曲線を多数の短い直線セグメントで近似し、次にそれらをペアで交差させることです。しかし、それは多くの時間とメモリを消費します。
Dragonseel

@Dragonseelまあ、私は本当にどんな解決策でも喜んでいますが、あなたがO(1)を求めたのでいいでしょう。しかし、曲線を線分で近似すると、境界ボックスのオーバーラップのテストと同じ問題が発生します...
Ecir Hana

興味深い問題。簡単な答えはないと思いますが、間違っています。Sederberg and Meyersの論文へのリンクはありますか?
Daniel M Gessel

@DanielMGesselはい、上記の編集を参照してください。
Ecir Hana 2016

回答:


6

問題を定式化する別の方法は、曲線のパラメーターの関数として、2つの曲線上の点間の距離を与える関数を定義することです。次に、この関数のグローバルな最小値を見つけようとします。曲線が交差する場合、最小値はゼロになります。それ以外の場合、最小値は正の距離になります。

明確にするために、定義された2D曲線のペアが与えられた場合、距離の2乗を次のように定義しますc1,c2:[0,1]R2

f(u,v):[0,1]2R0|c2(v)c1(u)|2

3次曲線の場合、関数は2つの変数の6次多項式になります。その後、シンプレックス法共役勾配降下などの数値最適化手法を適用できます。残念ながら、関数にはいくつかの極小値(凸ではない)が含まれる可能性があるため、最適化は容易ではありません。多項式に利用できるより専門的な最適化手法があるかもしれませんが、これは私にとって専門分野ではありません。f


3次ベジエについて話しているのに、なぜそれが3次ではなく6次多項式であるのですか?また、リンクした2つの方法は、全体ではなく、でのみ解を見つけるのに適していますか?[0,1]2R2
Ecir Hana 2016

1
@EcirHana二乗距離なので6度です。(平方根にすることもできますが、多項式ではなくなり、ゼロでは滑らかではなくなります。)はパラメーター空間であり、スプラインが存在する空間ではないことに注意してください。つまり、これらは端点を持つスプライン。いずれの場合でも、これらのメソッドはで正常に機能しますが、最初の推測から「下り坂」に移動して、極小値を見つけるだけです。パラメータ領域全体を調べてグローバルな最小値を見つけるには、さらに何かが必要です。パラメータ空間を制限することは、おそらく役に立ちます。[0,1]R2
Nathan Reed、

1
ネイサン-素晴らしい処方!私は錆びていますが、各ベジェカーブを最大5つのセグメントに分割でき、またはがカーブの方向を変える場所によって分割できると思います。、関数が方向を最大で2回(導関数の根)変更するため、曲線を3つのセグメントに分割し、そのうちの2つは方向の変更によって再度分割される場合があります。これで直線セグメントではなく、「曲がりすぎない」セグメントができました。セグメントペアによって選択された25ポイントから検索を開始すると、常にグローバルミニマムを見つけることができると思いますが、それを証明(または反証)する方法がよくわかりません。xyxciy
Daniel M Gessel 2016

@ネイサン:私はそれを考えていましたが、テクスチャ圧縮フォーマットの最小値を見つけるためにコードを書くのに多くの時間を費やしていたため、すべてが少し恐ろしいように見えました。
Simon F

5

[免責事項:以下は機能するはずですが、実際には自分でコーディングしていません]

「はい」/「いいえ」の答えを生成する「簡単な」方法を考えることはできませんでしたが、次の質問に対する実際的な解決策への合理的なアプローチになります。

曲線がそれぞれA(s)B(t)であり、制御点がそれぞれ{ A0、A1..An }と{ B0、.. Bm }であるとします。

交差するかしないかを決定する2Dベジエのペアを考えると、考慮すべき6つのケースがあるように思われます。

  1. それらが交差しないと「簡単に」判断できる場合。

  2. それらが有限回数交差し、少なくとも1回確実に交差することを「簡単に」判断できる場合(ただし、実際にはそれらの交差がどこで発生するかは気にしません)

  3. ベジエの1つは縮退、つまりポイントです(すべてのコントロールポイントが同一の場合に発生します)。両方がポイントであるケースをすでに処理したと想定できます。

  4. 1つ以上の曲線が閉じています。A0 == An。人生をより簡単にするために、そのような曲線を細分して、もう一度始めます。

  5. それぞれが「親」のベジェのサブセットであり、それらがオーバーラップしているため、交点の数は無限にあります。

  6. 上記のケースについては確信が持てず、さらに調査が必要です

とりあえず、3と4は無視しますが、後で戻ってきます。

事例1

質問で示唆しているように、ABの制御点のそれぞれの境界ボックスが交差しない場合、曲線は交差できません。明らかにこれは簡単な拒否テストですが、非常に保守的です。ご存知のように、ベジェ曲線では、その制御点の凸包は曲線上に(よりタイトな)境界を形成します。したがって、分離軸手法を使用して、ABのハルが交差しないかどうかを判断できます。(例えば、ウィキペディアに示されているように:)

ここに画像の説明を入力してください

事例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の各エンドポイントを試すことができ、その逆も可能です。これは交差の証明のみを提供し、非交差の証明は提供しません。


はい、ただし個人的には、BmとB0のどちらかまたは両方がAの最大および最小の範囲内にあるが貫通していない場合に興味があります。細分化し、最悪の場合は交差を計算する必要があります。ポイント。より良い方法は、太線近似とも呼ばれる最小の境界ボックスを使用することです。
joojaa

すべてのバイナリサブディビジョンで、カーブとエンドポイントを接続するセグメントとの差は妥当な係数で減少します(そして、頭頂部からは、2次式の場合は4倍だったと思います)。 「薄い」リボンにかなり速く収束します。
Simon F

はい。ただし、最悪のシナリオは、もう一方のベジェがもう一方から始まるというものです。
joojaa

たとえば、An == B0です。それを交差点と定義していますか?
Simon F

B0のようなものは曲線のどこかにありません。または、ごくわずかな交差点
joojaa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.