2017-09-26 10 views
-1

と交差するかどうかの確認:How do you detect where two line segments intersect?2つの線分が、私はこの質問への答えとして投稿されました。このコードは使用してい寛容

をそれは2つの線分場合、この関数は唯一の交点を返すことに私の理解であります正確に交差する。この関数を修正して公差を含める必要があるので、線分がほぼと交差する(つまり0.01の範囲内にある)場合に交点を返します。私はこの機能を支える数学を本当に理解していないので、誰かが助けてくれることを望んでいました。

おかげ

// Returns 1 if the lines intersect, otherwise 0. In addition, if the lines 
// intersect the intersection point may be stored in the floats i_x and i_y. 
char get_line_intersection(float p0_x, float p0_y, float p1_x, float p1_y, 
    float p2_x, float p2_y, float p3_x, float p3_y, float *i_x, float *i_y) 
{ 
    float s1_x, s1_y, s2_x, s2_y; 
    s1_x = p1_x - p0_x;  s1_y = p1_y - p0_y; 
    s2_x = p3_x - p2_x;  s2_y = p3_y - p2_y; 

    float s, t; 
    s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y))/(-s2_x * s1_y + s1_x * s2_y); 
    t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x))/(-s2_x * s1_y + s1_x * s2_y); 

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1) 
    { 
     // Collision detected 
     if (i_x != NULL) 
      *i_x = p0_x + (t * s1_x); 
     if (i_y != NULL) 
      *i_y = p0_y + (t * s1_y); 
     return 1; 
    } 

    return 0; // No collision 
} 

EDIT:、画像は以下のシナリオの種類を示す明確化のためれるだろうほぼ交差する2つの線分。

Nearly intersecting lines - image

+0

ほぼ交差していることをご指定ください。二次元の飛行機では、どのように見えるかわかりません。 – schorsch312

+0

多分これはinterrestのです:https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect – 4386427

+0

リンクされたQ&Aの参照は答えを持っているべきです/あなたです必要。 –

答えて

0

それはまだ正確にあなたが「近くの交差点」としてカウントしたいのかはっきりしません。あなたのイメージ例では、選択された許容量で各行を(両方向に)延長し、次に延長された線の間の(厳密な)交差をチェックすることによって交差を見つけることができます。

より鋭角な線の交点を検出したい場合は、各線を矩形領域(許容値で決まる幅)に展開し、矩形領域の重なりを確認することができます。

どちらの場合でも許容量は多少異なることを意味します。あなたはあなたの質問にそれを定義しませんでした。許容値は正確にはどういう意味ですか?それは、一方の線がもう一方の線との交点を形成するために延長される必要がある量ですか?それは交差点と見なすことができる各ライン上の任意の点の間の最大距離ですか?など

1

私は、グラフィックスの専門家ではないですが、これは私がどうなるのかです:

を各エンドポイントについて:thresholdの半径と終点を中心とする円が他の線分と交差するかどうかを確認してください。その後、線はほぼ交差する。

+1

これはとても良いアイデアです。 2つの直線セグメントが交差しない場合、4つの端点のうちの1つでそれらの間の最小距離に到達します。セグメントが交差する可能性をチェックすることはまだ必要です。 また、セグメントが円と交差するかどうかを確認するための些細な方法もありません。 – Nevado

+0

@Nevadoは円と線の交点を決定します。次に、それらの点(もしあれば)が線分上にあるかどうかを確認します。 – bolov

+0

私は、線(2つの点を持つ)と円(点と半径を持つ)が与えられれば、それらが交差するかどうかを見つけることは簡単なことではないと思います。確かに可能ですが、その難しさは元の問題とほぼ同じですので、解説する価値はあります。 – Nevado

関連する問題