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);