線分の交差判定のサンプルです。
;===========================================================
; 2007/8/14
; 線分交差判定モジュール ver.0.1.0
; GAM-22
;===========================================================
if 0 {
#defcfunc chk_line double ax1, double ay1, double ax2, double ay2, double bx1, double by1, double bx2, double by2
;-------------------------------------------------------
; 線分同士の交差判定
;-------------------------------------------------------
;
; p1,p2 : x1,y1(A)
; p3,p4 : x2,y2(A)
; p5,p6 : x1,y1(B)
; p7,p8 : x2,y2(B)
;-------------------------------------------------------
; ax2-ax1, ay2-ay1 の法線
m1 = -(ay2-ay1) : m2 = ax2-ax1
; 正規化(長さを1.0にする)
m3 = sqrt(m1*m1 + m2*m2)
if m3>0 : m3 = 1.0/m3
m1 *= m3
m2 *= m3
; var d = -(ax * nx + ay * ny);
; var t = -(nx * x + ny * y + d) / (nx * dx + ny * dy);
if (m1*(bx2-bx1) + m2*(by2-by1))!0{
m4 = -(m1*bx1 + m2*by1 - (ax1*m1 + ay1*m2)) / (m1*(bx2-bx1) + m2*(by2-by1))
}else{
return 0
}
; cx = x + dx * t;
; cy = y + dy * t;
if m4>0 & m4<=1{
stat1@ = bx1+(bx2-bx1)*m4
stat2@ = by1+(by2-by1)*m4
return (ax1-stat1@)*(ax2-stat1@)+(ay1-stat2@)*(ay2-stat2@) < 0;inner(ax1-stat1@, ay1-stat2@, ax2-stat1@, ay2-stat2@) < 0
}else{
return 0
}
}
repeat
redraw 0
; 背景
color 255,255,255 : boxf
; 線分A
color ,,255
line mousex, mousey, 100, 100
; 線分B
v1 = 0.05*cnt
line 340+cos(v1)*200,240+sin(v1)*200, 340-cos(v1)*200,240-sin(v1)*200
; 判定
if chk_line(mousex,mousey, 100,100, 340+cos(v1)*200,240+sin(v1)*200, 340-cos(v1)*200,240-sin(v1)*200) {
color 255
circle stat1-5,stat2-5, stat1+5,stat2+5
}
redraw
await 50
loop
仕組みとかは、
ここのを参考にしました。
PR