じゃあ、引っかかっていそうな交点計算。
直線Aを (asx,asy)-(aex,aey)、
直線Bを (bsx,bsy)-(bex,bey)とした時、
このサブルーチンを呼ぶと交点座標(resx,resy)を計算してくれる。
エラー時は(0,0)が入り、reseに1が入る。
もしreseが2になっていたら、交点は存在するけど、指定したA、Bの線の範囲に無い。
分かりやすく書いたので多少長いのは勘弁。
バグがあるかもしれないので内容をよく読んで確認してね(脅しw)。
まともにチェックしてないから。
asx =-100.0 : asy = 0.0
aex = 100.0 : aey = 0.0
bsx = 0.0 : bsy =-100.0
bex = 0.0 : bey = 100.0
gosub *intersection
print resx
print resy
print rese
stop
*intersection
v1=0 : v2=0
if asx = aex : v1=1
if bsx = bex : v2=1
//双方垂直線>エラー
if ( v1 + v2 ) = 2 {
resx = 0.0
resy = 0.0
rese = 1
return
}
//片側が垂直線だった時の処理
if v1 = 1 {
a2 = ( bey - bsy ) / ( bex - bsx)
b2 = bsy - a2 * bsx
resx = asx
resy = a2 * asx + b2
rese = 0
gosub *areacheck
return
}
if v2 = 1 {
a1 = ( aey - asy ) / ( aex - asx)
b1 = asy - a1 * asx
resx = bsx
resy = a1 * bsx + b1
rese = 0
gosub *areacheck
return
}
//両方垂直でなかった時の処理
a1 = ( aey - asy ) / ( aex - asx)
b1 = asy - a1 * asx
a2 = ( bey - bsy ) / ( bex - bsx)
b2 = bsy - a2 * bsx
//平行線 > エラー
if a1 = a2 {
resx = 0.0
resy = 0.0
rese = 1
return
}
resx = ( b2 - b1 ) / ( a1 - a2 )
resy = (( a1 * b2 ) - ( b1 * a2 )) / ( a1 - a2 )
rese = 0
gosub *areacheck
return
*areacheck
//直線Aの範囲内にいるか確認
if asx < aex {
if resx < asx : rese = 2
if resx > aex : rese = 2
else {
if resx < aex : rese = 2
if resx > asx : rese = 2
}
if asy < aey {
if resy < asy : rese = 2
if resy > aey : rese = 2
else {
if resy < aey : rese = 2
if resy > asy : rese = 2
}
//直線Bの範囲内にいるか確認
if bsx < bex {
if resx < bsx : rese = 2
if resx > bex : rese = 2
else {
if resx < bex : rese = 2
if resx > bsx : rese = 2
}
if bsy < bey {
if resy < bsy : rese = 2
if resy > bey : rese = 2
else {
if resy < bey : rese = 2
if resy > bsy : rese = 2
}
return