Tähän on varmaan joku simppelimpikin ratkaisu, mutta teinpä tälläisen joka katsoo onko nelikulmiot niin lähellä toisiaan että voivat ylipäänsä törmätä, sitten testaa onko nelikulmion keskipiste toisen nelikulmion sisällä ja sitten vielä tarkistaa leikkaako nelikulmioiden sivut toisiaan.
Code: Select all
DrawToWorld ON
Repeat
t#=Timer()/15.0
t1#=t1#+MouseMoveZ()*10
If BoxOverlap2(MouseWX(),MouseWY(),100,50,t1#,0,0,40,200,-t#/1.5) Then
Color cbred
Else
Color cbwhite
EndIf
Lock
Box2(MouseWX(),MouseWY(),100,50,t1#)
Box2(0,0,40,200,-t#/1.5)
Unlock
DrawScreen
Forever
Function BoxOverlap2(x#,y#,w#,h#,a#,xx#,yy#,ww#,hh#,aa#)
w2#=w#/2.0
h2#=h#/2.0
cx# = Cos(a#)
cy# = Cos(a#+90.0)
sx# = Sin(a#)
sy# = Sin(a#+90.0)
//ensimmäisen laatikon kärjet
x1# = x# + cx#*w2# + cy#*h2#
y1# = y# + sx#*w2# + sy#*h2#
x2# = x# - cx#*w2# + cy#*h2#
y2# = y# - sx#*w2# + sy#*h2#
x3# = x# - cx#*w2# - cy#*h2#
y3# = y# - sx#*w2# - sy#*h2#
x4# = x# + cx#*w2# - cy#*h2#
y4# = y# + sx#*w2# - sy#*h2#
w1# = Abs(cx#*w2#) + Abs(cy#*h2#)
h1# = Abs(sx#*w2#) + Abs(sy#*h2#)
w2#=ww#/2.0
h2#=hh#/2.0
cx# = Cos(aa#)
cy# = Cos(aa#+90.0)
sx# = Sin(aa#)
sy# = Sin(aa#+90.0)
//toisen laatikon kärjet
xx1# = xx# + cx#*w2# + cy#*h2#
yy1# = yy# + sx#*w2# + sy#*h2#
xx2# = xx# - cx#*w2# + cy#*h2#
yy2# = yy# - sx#*w2# + sy#*h2#
xx3# = xx# - cx#*w2# - cy#*h2#
yy3# = yy# - sx#*w2# - sy#*h2#
xx4# = xx# + cx#*w2# - cy#*h2#
yy4# = yy# + sx#*w2# - sy#*h2#
w3# = Abs(cx#*w2#) + Abs(cy#*h2#)
h3# = Abs(sx#*w2#) + Abs(sy#*h2#)
//onko niin kaukana toisistaan ettei edes voi törmätä?
If Abs(x#-xx#)>(w1#+w3) Or Abs(y#-yy#)>(h1#+h3) Then Return False
//onko toinen laatikko ensimmäisen sisällä?
If PointInTriangle(xx#, yy#, x1#, y1#, x2#, y2#, x3#, y3#) Then Return True
If PointInTriangle(xx#, yy#, x1#, y1#, x4#, y4#, x3#, y3#) Then Return True
//leikkaako sivut
If LineSegIsect1(x1#, y1#, x2#, y2#, xx1#, yy1#, xx2#, yy2#) Then Return True
If LineSegIsect1(x1#, y1#, x2#, y2#, xx3#, yy3#, xx2#, yy2#) Then Return True
If LineSegIsect1(x1#, y1#, x2#, y2#, xx3#, yy3#, xx4#, yy4#) Then Return True
If LineSegIsect1(x1#, y1#, x2#, y2#, xx1#, yy1#, xx4#, yy4#) Then Return True
If LineSegIsect1(x3#, y3#, x2#, y2#, xx1#, yy1#, xx2#, yy2#) Then Return True
If LineSegIsect1(x3#, y3#, x2#, y2#, xx3#, yy3#, xx2#, yy2#) Then Return True
If LineSegIsect1(x3#, y3#, x2#, y2#, xx3#, yy3#, xx4#, yy4#) Then Return True
If LineSegIsect1(x3#, y3#, x2#, y2#, xx1#, yy1#, xx4#, yy4#) Then Return True
If LineSegIsect1(x3#, y3#, x4#, y4#, xx1#, yy1#, xx2#, yy2#) Then Return True
If LineSegIsect1(x3#, y3#, x4#, y4#, xx3#, yy3#, xx2#, yy2#) Then Return True
If LineSegIsect1(x3#, y3#, x4#, y4#, xx3#, yy3#, xx4#, yy4#) Then Return True
If LineSegIsect1(x3#, y3#, x4#, y4#, xx1#, yy1#, xx4#, yy4#) Then Return True
If LineSegIsect1(x1#, y1#, x4#, y4#, xx1#, yy1#, xx2#, yy2#) Then Return True
If LineSegIsect1(x1#, y1#, x4#, y4#, xx3#, yy3#, xx2#, yy2#) Then Return True
If LineSegIsect1(x1#, y1#, x4#, y4#, xx3#, yy3#, xx4#, yy4#) Then Return True
If LineSegIsect1(x1#, y1#, x4#, y4#, xx1#, yy1#, xx4#, yy4#) Then Return True
Return False
End Function
Function Box2(x#,y#,w#,h#,a#)
w2#=w#/2.0
h2#=h#/2.0
cx# = Cos(a#)
cy# = Cos(a#+90.0)
sx# = Sin(a#)
sy# = Sin(a#+90.0)
//laatikon kärjet
x1# = x# + cx#*w2# + cy#*h2#
y1# = y# + sx#*w2# + sy#*h2#
x2# = x# - cx#*w2# + cy#*h2#
y2# = y# - sx#*w2# + sy#*h2#
x3# = x# - cx#*w2# - cy#*h2#
y3# = y# - sx#*w2# - sy#*h2#
x4# = x# + cx#*w2# - cy#*h2#
y4# = y# + sx#*w2# - sy#*h2#
Line x1#, y1#, x2#, y2#
Line x3#, y3#, x2#, y2#
Line x4#, y4#, x3#, y3#
Line x1#, y1#, x4#, y4#
End Function
Function PointInTriangle(x#, y#, x1#, y1#, x2#, y2#, x3#, y3#)
ab# = ((y - y1) * (x2 - x1) - (x - x1) * (y2 - y1)) / 1000.0
bc# = ((y - y2) * (x3 - x2) - (x - x2) * (y3 - y2)) / 1000.0
ca# = ((y - y3) * (x1 - x3) - (x - x3) * (y1 - y3)) / 1000.0
If (ab * bc) > 0 And (bc * ca) > 0 Then Return True
Return False
EndFunction
Function LineSegIsect1(ax#, ay#, bx#, by#, cx#, cy#, dx#, dy#)
Return (((bx-ax)*(cy-ay)-(by-ay)*(cx-ax))*((bx-ax)*(dy-ay)-(by-ay)*(dx-ax)) < 0)(((dy-cy)*(cx-ax)-(dx-cx)*(cy-ay))*((dx-cx)*(by-cy)-(dy-cy)*(bx-cx)) < 0)
EndFunction
EDIT: Oletan että tarkoitit nelikulmiolla suorakulmiota, vaikka eipä tuon yleistäminen kaikille nelikulmioille ole vaikeaa.