2点の線分(座標)が交差しているか判定
2点の線分(座標)が交差しているか判定するには、次のような方法で可能です。
関数定義
JavaScript (ES5)
/**
* 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 {boolean} 交差していればtrue、そうでなければfalseを返す
*/
var isTwoLineSegmentsIntersect = 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 = (x0 - x1) * (y2 - y0) + (y0 - y1) * (x0 - x2),
a1 = (x0 - x1) * (y3 - y0) + (y0 - y1) * (x0 - x3),
a2 = (x2 - x3) * (y0 - y2) + (y2 - y3) * (x2 - x0),
a3 = (x2 - x3) * (y1 - y2) + (y2 - y3) * (x2 - x1);
return a0 * a1 < 0 && a2 * a3 < 0;
};
JavaScript (ES6以降)
/**
* 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つ目の直線
* @returns {boolean} 交差していればtrue、そうでなければfalseを返す
*/
const isTwoLineSegmentsIntersect = (line1, line2) => {
const 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;
const a0 = (x0 - x1) * (y2 - y0) + (y0 - y1) * (x0 - x2),
a1 = (x0 - x1) * (y3 - y0) + (y0 - y1) * (x0 - x3),
a2 = (x2 - x3) * (y0 - y2) + (y2 - y3) * (x2 - x0),
a3 = (x2 - x3) * (y1 - y2) + (y2 - y3) * (x2 - x1);
return a0 * a1 < 0 && a2 * a3 < 0;
};
使い方
引数
引数名 | 型 | 説明 | |
---|---|---|---|
第一引数 必須 |
line1 | { start : { x : number, y : number }, end : { x : number, y : number } } |
1つ目の直線の座標 |
第二引数 必須 |
line2 | { start : { x : number, y : number }, end : { x : number, y : number } } |
2つ目の直線の座標 |
戻り値
交差していればtrue、そうでなければfalseを返します。
サンプルコード
JavaScript (ES5)
// 直線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 result = isTwoLineSegmentsIntersect(line1, line2);
alert(result ? '交差している' : '交差していない');
JavaScript (ES6以降)
// 直線1
const line1 = {
start : { x : 165, y : 86 }, // 始点
end : { x : 65, y : 1 } // 終点
};
// 直線2
const line2 = {
start : { x : 180, y : 15 }, // 始点
end : { x : 85, y : 78 } // 終点
};
const result = isTwoLineSegmentsIntersect(line1, line2);
console.log(result ? '交差している' : '交差していない');