三角形同士の判定
基本的にマルペケつくろーの通りです。(
http://marupeke296.com/COL_2D_TriTri.html )
ただし、2の一次判定は既にSPHITSPや四分木によって行われている前提なので省略します。
また、3の投影はわざわざ垂直なベクトルを求めずとも行列式(二次元外積)で求まります。(ただし、2D空間限定)
衝突した点ですが、「ある辺から見て内側にあって、最も辺との距離が近い相手の頂点」を衝突した点と見なすとそれらしくなります。
また、相手の重心が外側にある辺を優先的に衝突された辺と見なすことでよりそれらしくなると思います。
def trihittri cx1,cy1,x10,y10,x11,y11,x12,y12,cx2,cy2,x20,y20,x21,y21,x22,y22 out hit,nr,nj,cx,cy
x10=x10+cx1:x11=x11+cx1:x12=x12+cx1
y10=y10+cy1:y11=y11+cy1:y12=y12+cy1
x20=x20+cx2:x21=x21+cx2:x22=x22+cx2
y20=y20+cy2:y21=y21+cy2:y22=y22+cy2
var mmin#=1e6,mcx#,mcy#,mr#,mj# '重心が外側にある中で辺に最も近い頂点とその辺
var minx#,maxx#
var cmin#=1e6
var cross#,crsc#
var tr#,tj#
' 辺10,11
tr#=x11-x10:tj#=y11-y10
minx#=1e5:maxx#=0
'頂点20
cross#=tr#*(y20-y10)-tj#*(x20-x10)
crsc#=tr#*(cy2-y10)-tj#*(cx2-x10)
if cross#>maxx# then maxx#=cross#
if cross#<minx# then minx#=cross#
if cross#>=0&& cross#<cmin# then
cx=x20:cy=y20
nr=tj#:nj=-tr#
cmin#=cross#
endif
if crsc#<0&&cross#>0&&cross#<mmin# then
mcx#=x20:mcy#=y20
mr#=tj#:mj#=-tr#
mmin#=cross#
endif
'頂点21
cross#=tr#*(y21-y10)-tj#*(x21-x10)
if cross#>maxx# then maxx#=cross#
if cross#<minx# then minx#=cross#
if cross#>=0&& cross#<cmin# then
cx=x21:cy=y21
nr=tj#:nj=-tr#
cmin#=cross#
endif
if crsc#<0&&cross#>0&&cross#<mmin# then
mcx#=x21:mcy#=y21
mr#=tj#:mj#=-tr#
mmin#=cross#
endif
'頂点22
cross#=tr#*(y22-y10)-tj#*(x22-x10)
if cross#>maxx# then maxx#=cross#
if cross#<minx# then minx#=cross#