2017-12-24 14 views
-3

この質問にはすでに多くの回答がありますが、私の特定の問題を見つけることができませんでした。私はいつも常に同じx値または同じy値を持つ正の整数だけの非常に特殊なケースを持っています。私はこのような2つの行を持っていて、どこに交差しているのか知る必要があるだけです。私は普通のアルゴリズムを使うことができると知っていますが、それはそれを完全に過ぎてしまうと思います。もし私に言わないならば。私がすでに持っているコードは私の3度目の試行であり、それは完全な混乱であり、私はそれが正しいアプローチを持っているとは思わない。テストは2本の線が交差しています

+1

あなたのコードを意味する「行が常に同じx値または同じy値のいずれかを持って、常に正の整数」を何 – Turo

+0

を表示してください?あなたのラインは常に垂直か、それとも常に水平ですか? – elsyr

+0

@elsyrこれは変​​更される可能性があります。しかし、それらは常にx軸またはy軸に平行です。 – MegaIng

答えて

1

開始点と終了点によって決まる2つの行があります。

{ (x1,y1), (x2,y2) }, { (x3,y3), (x4,y4) } 

2つの範囲が重なっているかどうかを確認する機能を作成します。

function rangeOverlaps(a1, a2, b1, b2) { 
    let x1 = Math.min(a1, a2), 
    x2 = Math.max(a1, a2), 
    y1 = Math.min(b1, b2), 
    y2 = Math.min(b1, b2); 

    return x1 <= y2 && y1 <= x2; 
} 

xとyの両方の範囲が重なっているかどうかを確認する機能。

function linesIntersect(x1, x2, x3, x4, y1, y2, y3, y4) { 
    return (rangeOverlaps(x1, x2, x3, x4) && rangeOverlaps(y1, y2, y3, y4)); 
} 

function rangeOverlaps(a1, a2, b1, b2) { 
 
    let x1 = Math.min(a1, a2), 
 
    x2 = Math.max(a1, a2), 
 
    y1 = Math.min(b1, b2), 
 
    y2 = Math.min(b1, b2); 
 
    
 
    return x1 <= y2 && y1 <= x2; 
 
} 
 

 
function linesIntersect(x1, x2, x3, x4, y1, y2, y3, y4) { 
 
    return (rangeOverlaps(x1, x2, x3, x4) && rangeOverlaps(y1, y2, y3, y4)); 
 
} 
 

 
let x1 = 0, 
 
    y1 = 2, 
 
    x2 = 2, 
 
    y2 = 2, 
 
    x3 = 0, 
 
    y3 = 2, 
 
    x4 = 1, 
 
    y4 = 2; 
 

 
let intersects = linesIntersect(x1, x2, x3, x4, y1, y2, y3, y4); 
 

 
console.log(intersects);

+0

良い答えですが、1つの行が別の行の内部にある場合は、このケースを処理していないようです。 '{(0,2)、(2,2)}、{(0,2)、(1,2)}'は真を返す必要がある場合でもfalseを返します。私は追加のケースに追加するが、私はtherwが良い方法だと思う。あなたはそれを見せてもらえますか? – MegaIng

+0

^rangeOverlaps関数を修正しました。データが常にx1 <= x2などで整形されていることが分かっている場合は、rangeOverlaps関数を少し短くすることができます。 – JasonB

+0

非常に良い、ほぼ完璧です。最後の1つ:{(1,0)、(1,2)}、{(0,2)、(2,2)}は、{(1,0)、(1,2)}、{ 0,2)、(1,2)}はしないでください。これは可能ですか?現在は両方とも交差点を返さない。 – MegaIng

関連する問題