線分交差判定

点ab,cdの座標を元に線分ABと線分CDの交差判定をする。
詳しい解説は‚à‚Á‚ÆŠÈ’P‚Ɂ|ü•ªŒð·”»’è|に書かれています。

方法

線分ABをline1、線分CDをline2とする。
ta=(line2_ax - line2_bx) * (line1_ay - line2_ay) + (line2_ay - line2_by) * (line2_ax - line1_ax)
tb=(line2_ax - line2_bx) * (line1_by - line2_ay) + (line2_ay - line2_by) * (line2_ax - line1_bx)
tc=(line1_ax - line1_bx) * (line2_ay - line1_ay) + (line1_ay - line1_by) * (line1_ax - line2_ax)
td=(line1_ax - line1_bx) * (line2_by - line1_ay) + (line1_ay - line1_by) * (line1_ax - line2_bx)
「ta * tb < 0」が真、かつ「tc * td < 0」が真のときに交差する。*1

結果

この方法で交差判定のコードを書いてみた。line1とline2の始点、終点座標を設定し、それを元にOpenGLでラインを描画している。
交差するときtrueが戻る。

交差しないときfalseが戻る。

コード

ここにあったものをRubyで書いただけ。

def InterSectionEx(line1_ax, line1_ay, line1_bx, line1_by, line2_ax, line2_ay, line2_bx, line2_by)
	if (
		((line1_ax - line1_bx) * (line2_ay - line1_ay) + (line1_ay - line1_by) * (line1_ax - line2_ax)) * ((line1_ax - line1_bx) * (line2_by - line1_ay) + (line1_ay - line1_by) * (line1_ax - line2_bx)) < 0
		) then
		if (
			((line2_ax - line2_bx) * (line1_ay - line2_ay) + (line2_ay - line2_by) * (line2_ax - line1_ax)) * ((line2_ax - line2_bx) * (line1_by - line2_ay) + (line2_ay - line2_by) * (line2_ax - line1_bx)) < 0
			) then
			return true
		end
	else
		return false
	end
end

*1:当たり判定に使うときは<=のがよさげ?