線分交差判定
点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が戻る。
コード
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:当たり判定に使うときは<=のがよさげ?