0

LineSegmentという関数を持つクラスがありますbool LineSegment::intersect(LineSegment &otherLineSegment, Point &intersectionPoint, bool continuous=false)。クラスから継承してクラスを作成するのcontinuousが面倒だったので(またはその逆) 、パラメーターを追加しました。この引数が行うことは、基本的に、2 つの線分の交差を線分としてだけでなく、線であるかのように (つまり、両方向に無限に広がる) チェックできるようにすることです。を返す場合、2 つのオブジェクト間の交点を保持します。LineSegmentLineintersectionPointintersect(...)true

  • 最初のケースは、2 つの線分が実際に交差するかどうかを知る必要がある状況をカバーしています。
  • 2 番目のケースは、2 つの線分が交差していなくても、これら 2 つの線分を 2 つの線の一部と見なした場合に、交差がどこかで発生するかどうかを知る必要がある状況をカバーしています。

このチェックを行う目的で、ここ (線の交差) とここ (線分の交差) で提供されているアルゴリズムを使用ます

私が抱えている問題は、2 つの一致する線分がある場合です。これは、2 つの線分の間に無限の数の交点があることを意味します。たとえば、線分l1(Point(0, 1), Point(1, 1))とを見てみましょうl2(Point(-1, 1), Point(2, 1))。両方を視覚化すると、

[Point(-1, 1)------[(0, 1)------(1, 1)]------Point(2, 1)]

継続的なチェック (つまり、線が交差しているかどうか) が返されますtrue(交点Point(2, 1)は一部でもなくl2、線/線分のいずれかの方程式を使用して計算できる交点のプロパティと直接矛盾します) ) この場合、線分の交点は を返しますfalse

この状況をどのように処理しますか? もちろん、両方をチェックすることもできますが、そのような不一致が発生した場合は、「一致する行があります」と言うことができます。ただし、次の理由から、これはそれ以上役に立ちません。

  • ダブルチェックはコストがかかり、必要な線分のペアごとに実行する必要があります
  • オーバーラップとは、交点が無限にあることを意味します (もちろん、マシンの浮動小数点数を扱う場合はそうではありません。これは、(ストレージと精度のために) その間隔内の数のセットが限られている (ただし、それでも十分大きい) ためです)。これは明らかに処理できないため、例外を作成する必要があります

一方で、これをそのままにして、コードに未定義または不適切な動作を作成することもできません。考えられる解決策は、2 つのベクトル (それぞれの線/線分の各部分) の間の角度を確認し、角度が 0 またはそれに非常に近い場合 (丸め誤差を処理す​​るため)、線が一致することです。これは、この情報をどうするかを決定するのにまだ役に立ちませんか?

4

0 に答える 0