2点の線分(座標)から交点を求める

2点の線分(座標)から交点を求めるには、次のような方法で可能です。

関数定義

JavaScript

/**
 * 2点の線分(座標)から交点を求める
 * @param {{start:{x:number,y:number},end:{x:number,y:number}}} line1 1つ目の直線
 * @param {{start:{x:number,y:number},end:{x:number,y:number}}} line2 2つ目の直線
 * @return {{x:number,y:number}|false} 交点する座標を返し、平行の場合はfalseを返す
 */
var getIntersectionLineSegments = function(line1, line2) {
	var x0 = line1.start.x,
	    y0 = line1.start.y,
	    x1 = line1.end.x,
	    y1 = line1.end.y,
	    x2 = line2.start.x,
	    y2 = line2.start.y,
	    x3 = line2.end.x,
	    y3 = line2.end.y;

	var a0 = (y1 - y0) / (x1 - x0),
	    a1 = (y3 - y2) / (x3 - x2);

	var x = (a0 * x0 - y0 - a1 * x2 + y2) / (a0 - a1),
	    y = (y1 - y0) / (x1 - x0) * (x - x0) + y0;

	if (Math.abs(a0) === Math.abs(a1)) return false;

	if (x > Math.max(x0, x1) || x > Math.max(x2, x3) ||
		y > Math.max(y0, y1) || y > Math.max(y2, y3) ||
		x < Math.min(x0, x1) || x < Math.min(x2, x3) ||
		x < Math.min(x0, x1) || y < Math.min(y2, y3) ) return false;

	return { x : x, y : y };
};

使い方

引数

引数名 説明
第一引数
必須
line1 {
    start : {
        x : number,
        y : number
    },
    end : {
        x : number,
        y : number
    }
}
1つ目の直線
第二引数
必須
line2 {
    start : {
        x : number,
        y : number
    },
    end : {
        x : number,
        y : number
    }
}
2つ目の直線

戻り値

交点の座標(x軸、y軸)を返し、平行の場合はfalseを返します。

JavaScript

// 直線1
var line1 = {
	start : { x : 165, y : 86 }, // 始点
	end   : { x : 65, y : 1 }    // 終点
};

// 直線2
var line2 = {
	start : { x : 180, y : 15 }, // 始点
	end   : { x : 85, y : 78 }   // 終点
};

var point = getIntersectionLineSegments(line1, line2);

alert('X : ' + point.x + ', Y : ' + point.y);

JavaScript逆引きリファレンス一覧へ戻る