Got some BMax code for you:
The code is a quick ripp from This Good Chap
Edit: It dosent always work the way you might want it to but i'll leave you to experiment. The above link has got a link to download a .zip with some code in it. (cpp source)
SuperStrict ' Vector type ( A VERY SIMPLE VECTOR TYPE ) Type TVector Field x#, y# Function Create:TVector(_x#, _y#) Local v:TVector = New TVector v.x = _x v.y = _y Return v End Function Method DivEq(_scale#) x:/ _scale y:/ _scale End Method Method MulEq(_scale#) x:* _scale y:* _scale End Method Method AddEq(v:TVector) x:+ v.x y:+ v.y End Method Method MinEq(v:TVector) x:- v.x y:- v.y End Method Method CrossProduct#(v:TVector) Return x * v.y - y * v.x End Method Method Dot#(v:TVector) Return x * v.x + y * v.y End Method Method Mul:TVector(_scale#) Return TVector.Create(x * _scale, y * _scale) End Method Method Div:TVector(_scale#) Return TVector.Create(x / _scale, y / _scale) End Method Method Add:TVector(v:TVector) Return TVector.Create(x + v.x, y + v.y) End Method Method Sub:TVector(v:TVector) Return TVector.Create(x - v.x, y - v.y) End Method Method Leng#() Return Sqr(x * x + y * y) End Method rem Do two vectors intersect along a given axis endrem Function Intersect@(a:TVector[], b:TVector[], xa:TVector, _offset:TVector) Local min0#, max0# Local min1#, max1# min0 = IntervalMin(a, xa) max0 = IntervalMax(a, xa) min1 = IntervalMin(b, xa) max1 = IntervalMax(b, xa) Local h# = _offset.Dot(xa) min0:+ h max0:+ h Local d0# = min0 - max1 Local d1# = min1 - max0 If d0 > 0.0 or d1 > 0.0 Then Return False Else Return True End If End Function rem Min / Max functions nothing sepcial endrem Function IntervalMin#(verts:TVector[], xa:TVector) Local m# = verts[0].Dot(xa) For Local i% = 0 To verts.length - 1 Local d# = verts[i].Dot(xa) If d < m Then m = d Next Return m End Function Function IntervalMax#(verts:TVector[], xa:TVector) Local m# = verts[0].Dot(xa) For Local i% = 0 To verts.length - 1 Local d# = verts[i].Dot(xa) If d > m Then m = d Next Return m End Function End Type ' A simple polygon type Type TPolygon Field x#, y# ' Draw offset Field vx#[] ' Zero Based Field vy#[] ' Zero based Field vc# ' Vertex Count ' Just to help Function CreateByVectorList:TPolygon(_v:TList) Local p:TPolygon = New TPolygon p.vx = New Float[_v.count()] p.vy = New Float[_v.count()] p.vc = _v.count() Local i% = 0 For Local v:TVector = EachIn _v p.vx[i] = v.x p.vy[i] = v.y i:+ 1 Next Return p End Function ' Draw it Method Render() SetColor 255, 0, 0 Local _vx#[2], _vy#[2] For Local i% = 0 To vc - 2 _vx[0] = vx[i] + x _vy[0] = vy[i] + y _vx[1] = vx[i + 1] + x _vy[1] = vy[i + 1] + y DrawLine _vx[0], _vy[0], _vx[1], _vy[1] Next _vx[0] = vx[vc - 1] + x _vy[0] = vy[vc - 1] + y _vx[1] = vx[0] + x _vy[1] = vy[0] + y DrawLine _vx[0], _vy[0], _vx[1], _vy[1] SetColor 0, 0, 0 End Method ' Set position Method SetPos(_x%, _y%) x = _x y = _y End Method ' Test Collide _offset you shouldnt need to worry about but just incase... Method Collide@(p:TPolygon, _offset:TVector = Null) SetColor 0, 255, 0 If _offset = Null Then _offset = TVector.Create(x, y).Sub(TVector.Create(p.x, p.y)) End If Local a:TVector[], b:TVector[] Local i% a = New TVector[vc] For i = 0 To vc - 1 a[i] = New TVector a[i].x = vx[i] a[i].y = vy[i] Next b = New TVector[p.vc] For i = 0 To p.vc - 1 b[i] = New TVector b[i].x = p.vx[i] b[i].y = p.vy[i] Next Local xv:TVector[64] Local ai% = 0 Local j% = vc - 1 For Local i% = 0 To vc - 1 Local e0:TVector = a[j] Local e1:TVector = a[i] Local e:TVector = e1.Sub(e0) xv[ai] = TVector.Create(-e.y, e.x) If not TVector.Intersect(a, b, xv[ai], _offset) Return False EndIf j = i ai:+ 1 Next j% = p.vc - 1 For Local i% = 0 To p.vc - 1 Local e0:TVector = b[j] Local e1:TVector = b[i] Local e:TVector = e1.Sub(e0) xv[ai] = TVector.Create(-e.y, e.x) If not TVector.Intersect(a, b, xv[ai], _offset) Return False EndIf j = i ai:+ 1 Next Return True End Method End Type Local Box:TList = CreateList() Box.AddLast(TVector.Create(0, 0)) Box.AddLast(TVector.Create(100, 0)) Box.AddLast(TVector.Create(100, 100)) Box.AddLast(TVector.Create(0, 100)) Local Shape:TList = CreateList() Shape.AddLast(TVector.Create(25, 0)) Shape.AddLast(TVector.Create(50, 0)) Shape.AddLast(TVector.Create(75, 25)) Shape.AddLast(TVector.Create(50, 50)) Shape.AddLast(TVector.Create(25, 50)) Shape.AddLast(TVector.Create(0, 25)) Global ap1:TPolygon = TPolygon.CreateByVectorList(Box) ap1.SetPos(200, 200) Global ap2:TPolygon = TPolygon.CreateByVectorList(Shape) ap2.SetPos(100, 100) Graphics 800, 600 While not KeyHit(KEY_ESCAPE) Cls ap2.SetPos(MouseX(), MouseY()) ap1.Render() ap2.Render() SetColor 255, 255, 255 If ap2.Collide(ap1) Then DrawText "COLLIDED!!!", 10, 10 Flip 0 Wend
The code is a quick ripp from This Good Chap
Edit: It dosent always work the way you might want it to but i'll leave you to experiment. The above link has got a link to download a .zip with some code in it. (cpp source)