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 ? '交差している' : '交差していない');

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