2 dimensional bounding boxes
Community Forums/Showcase/2 dimensional bounding boxes
| ||
i dunno if this will be of any use to anyone, just made it for fun in like 30 mins this morning cuz i wanted to use matrices manualy (dunno why :P). But yea here it is 2 dimensional bounding box code, they can be rotated scaled positioned drawn and of course intercected for collisions... ;Matrix Codes Const MATRIX_ALL = 0000 Const MATRIX_TRANSLATION = 0001 Const MATRIX_ROTATION = 0002 Const MATRIX_SCALE = 0003 ;Bounding Box Type Type BBox2D Field x1,y1 Field x2,y2 Field x3,y3 Field x4,y4 Field PosMat.Matrix2D Field RotMat.Matrix2D Field ScaleMat.Matrix2D End Type ;Matrix Type Type Matrix2D Field v00#,v10#,v20#,v01#,v11#,v21#,v02#,v12#,v22# End Type ;function to create a 2d bounding box Function CreateBBox2D(x1,y1,x2,y2) b.BBox2D = New BBox2D b\PosMat = New Matrix2D b\RotMat = New Matrix2D b\ScaleMat = New Matrix2D b\x1 = x1 b\y1 = y1 b\x2 = x2 b\y2 = y1 b\x3 = x2 b\y3 = y2 b\x4 = x1 b\y4 = y2 ResetBBox2DMatrix(Handle(b),0000) Return Handle(b) End Function ;function to position a bounding box Function PositionBBox2D(h,x,y) b.BBox2D = Object.BBox2D(h) SetBBox2DMatrix(b\PosMat,1,0,x,0,1,y,0,0,1) End Function ;function to rotate a bounding box Function RotateBBox2D(h,angle#) b.BBox2D = Object.BBox2D(h) SetBBox2DMatrix(b\RotMat,Cos(angle#),Sin(angle#),0,-Sin(angle#),Cos(angle#),0,0,0,1) End Function ;function to scale a bounding box Function ScaleBBox2D(h,sx,sy) b.BBox2D = Object.BBox2D(h) SetBBox2DMatrix(b\ScaleMat,sx,0,0,0,sy,0,0,0,1) End Function ;funciton to draw bounding boxes Function DrawBBox2D(h) b.BBox2D = Object.BBox2D(h) Matrix.Matrix2D = New Matrix2D SetBBox2DMatrix(Matrix,b\RotMat\v00,b\RotMat\v10,b\PosMat\v20,b\RotMat\v01,b\RotMat\v11,b\PosMat\v21,0,0,1) MultBBox2DMatrix(Matrix,b\ScaleMat\v00,0,0,0,b\ScaleMat\v11,0,0,0,1) vx1 = b\x1*Matrix\v00 + b\y1*Matrix\v10 + Matrix\v20 vy1 = b\x1*Matrix\v01 + b\y1*Matrix\v11 + Matrix\v21 vx2 = b\x2*Matrix\v00 + b\y2*Matrix\v10 + Matrix\v20 vy2 = b\x2*Matrix\v01 + b\y2*Matrix\v11 + Matrix\v21 vx3 = b\x3*Matrix\v00 + b\y3*Matrix\v10 + Matrix\v20 vy3 = b\x3*Matrix\v01 + b\y3*Matrix\v11 + Matrix\v21 vx4 = b\x4*Matrix\v00 + b\y4*Matrix\v10 + Matrix\v20 vy4 = b\x4*Matrix\v01 + b\y4*Matrix\v11 + Matrix\v21 Line vx1,vy1,vx2,vy2 Line vx2,vy2,vx3,vy3 Line vx3,vy3,vx4,vy4 Line vx4,vy4,vx1,vy1 Delete Matrix End Function ;function to test for intercections between bounding boxes Function BBoxesIntersect(hb1,hb2) b1.BBox2D = Object.BBox2D(hb1) Matrix.Matrix2D = New Matrix2D SetBBox2DMatrix(Matrix,b1\RotMat\v00,b1\RotMat\v10,b1\PosMat\v20,b1\RotMat\v01,b1\RotMat\v11,b1\PosMat\v21,0,0,1) MultBBox2DMatrix(Matrix,b1\ScaleMat\v00,0,0,0,b1\ScaleMat\v11,0,0,0,1) vx11 = b1\x1*Matrix\v00 + b1\y1*Matrix\v10 + Matrix\v20 vy11 = b1\x1*Matrix\v01 + b1\y1*Matrix\v11 + Matrix\v21 vx12 = b1\x2*Matrix\v00 + b1\y2*Matrix\v10 + Matrix\v20 vy12 = b1\x2*Matrix\v01 + b1\y2*Matrix\v11 + Matrix\v21 vx13 = b1\x3*Matrix\v00 + b1\y3*Matrix\v10 + Matrix\v20 vy13 = b1\x3*Matrix\v01 + b1\y3*Matrix\v11 + Matrix\v21 vx14 = b1\x4*Matrix\v00 + b1\y4*Matrix\v10 + Matrix\v20 vy14 = b1\x4*Matrix\v01 + b1\y4*Matrix\v11 + Matrix\v21 b2.BBox2D = Object.BBox2D(hb2) SetBBox2DMatrix(Matrix,b2\RotMat\v00,b2\RotMat\v10,b2\PosMat\v20,b2\RotMat\v01,b2\RotMat\v11,b2\PosMat\v21,0,0,1) MultBBox2DMatrix(Matrix,b2\ScaleMat\v00,0,0,0,b2\ScaleMat\v11,0,0,0,1) vx21 = b2\x1*Matrix\v00 + b2\y1*Matrix\v10 + Matrix\v20 vy21 = b2\x1*Matrix\v01 + b2\y1*Matrix\v11 + Matrix\v21 vx22 = b2\x2*Matrix\v00 + b2\y2*Matrix\v10 + Matrix\v20 vy22 = b2\x2*Matrix\v01 + b2\y2*Matrix\v11 + Matrix\v21 vx23 = b2\x3*Matrix\v00 + b2\y3*Matrix\v10 + Matrix\v20 vy23 = b2\x3*Matrix\v01 + b2\y3*Matrix\v11 + Matrix\v21 vx24 = b2\x4*Matrix\v00 + b2\y4*Matrix\v10 + Matrix\v20 vy24 = b2\x4*Matrix\v01 + b2\y4*Matrix\v11 + Matrix\v21 If LinesIntersect(vx11,vy11,vx12,vy12,vx21,vy21,vx22,vy22) Then Return True If LinesIntersect(vx11,vy11,vx12,vy12,vx22,vy22,vx23,vy23) Then Return True If LinesIntersect(vx11,vy11,vx12,vy12,vx23,vy23,vx24,vy24) Then Return True If LinesIntersect(vx11,vy11,vx12,vy12,vx24,vy24,vx21,vy21) Then Return True If LinesIntersect(vx12,vy12,vx13,vy13,vx21,vy21,vx22,vy22) Then Return True If LinesIntersect(vx12,vy12,vx13,vy13,vx22,vy22,vx23,vy23) Then Return True If LinesIntersect(vx12,vy12,vx13,vy13,vx23,vy23,vx24,vy24) Then Return True If LinesIntersect(vx12,vy12,vx13,vy13,vx24,vy24,vx21,vy21) Then Return True If LinesIntersect(vx13,vy13,vx14,vy14,vx21,vy21,vx22,vy22) Then Return True If LinesIntersect(vx13,vy13,vx14,vy14,vx22,vy22,vx23,vy23) Then Return True If LinesIntersect(vx13,vy13,vx14,vy14,vx23,vy23,vx24,vy24) Then Return True If LinesIntersect(vx13,vy13,vx14,vy14,vx24,vy24,vx21,vy21) Then Return True If LinesIntersect(vx14,vy14,vx11,vy11,vx21,vy21,vx22,vy22) Then Return True If LinesIntersect(vx14,vy14,vx11,vy11,vx22,vy22,vx23,vy23) Then Return True If LinesIntersect(vx14,vy14,vx11,vy11,vx23,vy23,vx24,vy24) Then Return True If LinesIntersect(vx14,vy14,vx11,vy11,vx24,vy24,vx21,vy21) Then Return True Return False End Function ;function to check for line to line intersections Function LinesIntersect(x11,y11,x12,y12,x21,y21,x22,y22) If x11=x12 Then x12 = x12+1 If x21=x22 Then x22 = x22+1 If y11=y12 Then y12 = y12+1 If y21=y22 Then y22 = y22+1 m1# = Float#((y12-y11))/Float#((x12-x11)) c1# = Float#(y11)-m1#*Float#(x11) m2# = Float#((y22-y21))/Float#((x22-x21)) c2# = Float#(y21)-m2#*Float#(x21) x# = Float#(c2#-c1#)/Float#(m1#-m2#) y# = m1#*x#+c1# If x11>x12 temp = x11 x11 = x12 x12 = temp EndIf If y11>y12 temp = y11 y11 = y12 y12 = temp EndIf If x21>x22 temp = x21 x21 = x22 x22 = temp EndIf If y21>y22 temp = y21 y21 = y22 y22 = temp EndIf If Int(x#)>=x11 And Int(x#)<=x12 And Int(y#)>=y11 And Int(y#)<=y12 And Int(x#)>=x21 And Int(x#)<=x22 And Int(y#)>=y21 And Int(y#)<=y22 Return True EndIf Return False End Function ;function to reset bounding box matrixes Function ResetBBox2DMatrix(h,matrix) b.BBox2D = Object.BBox2D(h) Select(matrix) Case 0000: SetBBox2DMatrix(b\PosMat,1,0,0,0,1,0,0,0,1) SetBBox2DMatrix(b\RotMat,1,0,0,0,1,0,0,0,1) SetBBox2DMatrix(b\ScaleMat,1,0,0,0,1,0,0,0,1) Case 0001: SetBBox2DMatrix(b\PosMat,1,0,0,0,1,0,0,0,1) Case 0002: SetBBox2DMatrix(b\RotMat,1,0,0,0,1,0,0,0,1) Case 0003: SetBBox2DMatrix(b\ScaleMat,1,0,0,0,1,0,0,0,1) Default: MessageBox("Error","Error: Incorrect Matrix Selection (ResetBBox2DMatrix)") End Select End Function ;function to Set a bounding boxes matrix Function SetBBox2DMatrix(mat.Matrix2D,v00#,v10#,v20#,v01#,v11#,v21#,v02#,v12#,v22#) mat\v00 = v00# mat\v10 = v10# mat\v20 = v20# mat\v01 = v01# mat\v11 = v11# mat\v21 = v21# mat\v02 = v02# mat\v12 = v12# mat\v22 = v22# End Function ;function to multiply matrices Function MultBBox2DMatrix(mat.Matrix2D,v00#,v10#,v20#,v01#,v11#,v21#,v02#,v12#,v22#) mat\v00 = mat\v00*v00# + mat\v10*v01# + mat\v20*v02# mat\v10 = mat\v00*v10# + mat\v10*v11# + mat\v20*v12# mat\v20 = mat\v00*v20# + mat\v10*v21# + mat\v20*v22# mat\v01 = mat\v01*v00# + mat\v11*v01# + mat\v21*v02# mat\v11 = mat\v01*v10# + mat\v11*v11# + mat\v21*v12# mat\v21 = mat\v01*v20# + mat\v11*v21# + mat\v21*v22# mat\v02 = mat\v02*v00# + mat\v12*v01# + mat\v22*v02# mat\v12 = mat\v02*v10# + mat\v12*v11# + mat\v22*v12# mat\v22 = mat\v02*v20# + mat\v12*v21# + mat\v22*v22# End Function ;function to equate two matrices Function EquateBBox2DMatrices(mat1.Matrix2D,mat2.Matrix2D) mat1\v00 =mat2\v00# mat1\v10 =mat2\v10# mat1\v20 =mat2\v20# mat1\v01 =mat2\v01# mat1\v11 =mat2\v11# mat1\v21 =mat2\v21# mat1\v02 =mat2\v02# mat1\v12 =mat2\v12# mat1\v22 =mat2\v22# End Function here's a small example include "BBox2D.bb" Graphics 640,480,32,2 SetBuffer BackBuffer() ;create two Bounding Box with the cordinates -20 to 20 on both the x and y b = CreateBBox2D(-20,-20,20,20) c = CreateBBox2D(-20,-20,20,20) Color 0,255,0 ;enlarge one of the bounding boxes ScaleBBox2D b, 2,2 ;position the bounding boxes PositionBBox2D b, 205,205 PositionBBox2D c, 250,250 angle# = 0 angle2# = 0 While Not KeyDown(1) Cls ;rotate the bounding boxes by the angles RotateBBox2D(b,angle#) RotateBBox2D(c,angle2#) Color 0,255,0 ;Draw The Bounding Boxes DrawBBox2D(b) DrawBBox2D(c) ;Check for an intersection If BBoxesIntersect(b,c) Then Text 10,10,"INTERSECTION" ;Rotate the bounding boxes angle# = angle# + 0.5 angle2# = angle# +0.7 Flip Wend if you have any questions feel free to ask |