見出し画像

数学@ゲーム 線分と線分の交点を求める

ゲームの判定でよく使用される線分と線分の交点を求めるプログラムです。
数学的?(連立方程式)ではなく、プログラムにとってシンプルになるように作りました。シンプル⇒計算速度と保守性

計算式

テキストだと説明し難いので画像で

線分の交点

小さいかもしれないので

線分の交点
線分の交点 計算式

ソースコード

TypeScript(JavaScript)
自作のベクトル演算使ってます。

export function IntersectionLineLine(
  p0 : Vector, p1 : Vector, q0 : Vector, q1 : Vector
) : Vector | undefined
{
    let p1_p0 = Vector.sub2(p1, p0);
    let q1_q0 = Vector.sub2(q1, q0);
    let len_p1_p0 = Vector.length2(p1_p0);
    let np1_p0 = Vector.normalize2(p1_p0);
    let q0_p0 = Vector.sub2(q0, p0);
    let q1_p0 = Vector.sub2(q1, p0);
    let qc0 = Vector.cross2(np1_p0, q0_p0);
    let qc1 = Vector.cross2(np1_p0, q1_p0);

    let d = qc0 - qc1;
    if(d*d < 0.000001)return;
   
    let t = qc0/d;
    let ipq = Vector.add2(q0, Vector.scale2(q1_q0, t));

    let ipq_p0 = Vector.sub2(ipq,p0);
    let s = Vector.dot2(ipq_p0,np1_p0)/len_p1_p0;
    
    // ipq = (p1 - p0)*s + p0;
    //     = (q1 - q0)*t + q0;
    ipq.z = s;
    ipq.w = t;

    return ipq;
}

デモプログラム

JavaScriptです。ソースコードはひどいので公開しません。

この記事が役に立ったという方は、サポートお願いします。今後の製作の励みになります。