2017-01-17 8 views
0

各行方向に伸びる線が線分と交差するかどうかを決定するにはどうすればよいでしょうか?(x1,y1)(x2,y2)そしてもしそうなら、交差点が発生する点は?無限線と線分が交差するかどうかを判断する式は?

私はこれを見つけましたが、ここが役に立つかどうかはわかりません。
誰かが私に "光線"を理解するのを手伝ってほしいと思うなら、それは私にとっては大丈夫です。 http://www.realtimerendering.com/intersections.html

私はばかだと申し訳ありません。

+0

だから、ラインは垂直にすることはできませんか? – Beta

答えて

1

任意の点は、線形システム

x0 + t * dx = x1 + u * dxx (3)  
y0 + t * dy = y1 + u * dyy 

が未知数の解を持っている場合には、第2セグメント

dxx = x2 - x1 
dyy = y2 - y1 
x = x1 + u * dxx (2) 
y = y1 + u * dyy 

交点が存在含むパラメトリック方程式

dx = Cos(slope) 
dy = Sin(Slope) 
x = x0 + t * dx  (1) 
y = y0 + t * dy 

ラインを有しtu
uは私がしました、これが機能しているかを正確に説明するために私に聞かないで下さい(2)

+0

この回答をhttp://gamedev.stackexchange.com/a/44733/60691と組み合わせて私の問題を完全に解決してください。 – bradleygriffith

+0

実際、@Mboは、なぜ勾配上のcosとsinが私にそれらの値を与えるのかについて、dxとdyに関する追加のドキュメントを提供できますか?答えはほとんど正しいと思われますが、私は勾配が完全な垂直性に近づくにつれて奇妙に見えます。 – bradleygriffith

+0

「傾き」はOX軸と線の方向の間の角度であると仮定します。線の単位長さの方向ベクトルを定義したい場合、その要素は余弦と正弦です。(dirx、diry)=(cos(slope)、sin(slope))あなたはどんな奇妙さを見ましたか? – MBo

0

あなたが何を検索するのですかdot productです。線はベクトルとして表現することができます。

2本の線があると、ある点で交差します。それらが平行である場合を除いて。

パラレルベクトルは(両方の正規化された)1の内積有するB(ドット(B)= 1)。

あなたは私がラインの始点と終点を持っている場合は、また、私は簡単にベクトルを構築することができます。最初の行に

1

[0..1]

交点は、式のペアで見つかったuの置換を計算することができた範囲内にありますちょうど私が敷設していたいくつかの古代のコードからそれを外挿/書き換えた。この例では、オブジェクトを構築する(ActionScriptの1)

いくつかの機能:

function point(x, y){ 
    return {x, y} 
} 
function line(x0, y0, x1, y1){ 
    return { 
    start: point(x0, y0), 
    end: point(x1, y1) 
    } 
} 
function ray(x, y, vx, vy){ 
    return { 
    start: point(x, y), 
    vector: point(vx, vy) 
    } 
} 
function ray2(x, y, angle){ 
    var rad = angle * Math.PI/180; 
    return ray(x, y, Math.cos(rad), Math.sin(rad)); 
} 

交差点コード:

//returns the difference vector between two points (pointB - pointA) 
function delta(a, b){ return point(b.x - a.x, b.y - a.y) } 
//kind of a 2D-version of the cross-product 
function cp(a, b){ return a.y * b.x - a.x * b.y } 

function intersection(a, b){ 
    var d21 = a.vector || delta(a.start, a.end), 
     d43 = b.vector || delta(b.start, b.end), 
     d13 = delta(b.start, a.start), 
     d = cp(d43, d21); 

    //rays are paralell, no intersection possible 
    if(!d) return null; 
    //if(!d) return { a, b, position: null, hitsA: false, hitsB: false }; 

    var u = cp(d13, d21)/d, 
     v = cp(d13, d43)/d; 

    return { 
     a, b, 

     //position of the intersection 
     position: point(
      a.start.x + d21.x * v, 
      a.start.y + d21.y * v 
     ), 
     //is position on lineA? 
     hitsA: v >= 0 && v <= 1, 
     //is position on lineB? 
     hitsB: u >= 0 && u <= 1, 

     timeTillIntersection: v, 
    }; 
} 

及び例:

var a = line(0, 0, 50, 50); 

var b = line(0, 50, 50, 0);    //lines are crossing 
console.log(intersection(a, b)); 

var c = line(100, 50, 150, 0);   //lines are not crossing 
console.log(intersection(a, c)); 

var d = line(100, -1000, 100, 1000); //intersection is only on d, not on a 
console.log(intersection(a, d)); 

var e = ray(100, 50, -1, -1);   //paralell to a 
console.log(intersection(a, e)); 

復帰情報交点の周りを通過し、通過した線/光線上にある。線や光線を渡しても気にしません。

についてtimeTillIntersection:最初の引数/線は現在の位置と動きベクトル、第二引数でそう、その後、壁やvを表しどんなボール/弾丸/、別名timeTillIntersectionそれはまでかかる時間を決定を表す場合このボールは、ボールの速度に使用されているのと同じ単位で(現在の状態で)壁と交差/ヒットします。あなたは基本的に無料でいくつかの情報を取得します。

関連する問題