AABB to AABB collision time function

BlitzMax Forums/BlitzMax Programming/AABB to AABB collision time function

The Forum Archive is locked. These are the original blitzbasic.com forums, kept so their posts can still be read and searched. No new topics, replies or edits can be made here. To join the conversation, head over to the Blitz3D+ forums.

OK well I've got this function which finds the time of collision between two AABB's (rectangles). It seems to work. I've done my best to convert it to Blitz (I'm no expert). It returns whether a collision has occured and 'tf' contains the time of the first collision, and 'tl' the time of the last collision - the time at which the rectangles no longer collide.
Basically you multiply the x-vector and y-vector of each object with 'tf' to get the position when they first collide.
Here is the Code and functions: Blitz may have Max and Min functions but they weren't documented very well in the help section so I wrote my own.

Type rect
	Field x1#,y1#,x2#,y2#
	Field w#,h#
	Field xv#,yv#
End Type

	 
Function MovingBoxColl(a:rect,b:rect,tf:Float Ptr,tl:Float Ptr)
	If rectsoverlap(a.x1,a.y1,a.w,a.h,b.x1,b.y1,b.w,b.h)
		tf[0]=0;tl[0]=0
		Return True
	EndIf
	'calculate relative velocity
	rvx#=b.xv-a.xv
	rvy#=b.yv-a.yv
	'initialise points of first and last contact
	tf[0]=0; tl[0]=1
	'for X axis determine the times of first and last contact, if any
	If rvx<0
		If b.x2<a.x1 Then Return False ' Non-intersecting and moving apart
		If a.x2<b.x1 Then tf[0]=RMax((a.x2-b.x1)/rvx,tf[0])
		If b.x2>a.x1 Then tl[0]=RMin((a.x1-b.x2)/rvx,tl[0])
	EndIf
	If rvx>0
		If b.x1>a.x2 Then Return False ' Non-intersecting and moving apart
		If b.x2<a.x1 Then tf[0]=RMax((a.x1-b.x2)/rvx,tf[0])
		If a.x2>b.x1 Then tl[0]=RMin((a.x2-b.x1)/rvx,tl[0])
	EndIf
	'No overlap possible if time of first contact occurs after time of last contact
	If tf[0]>tl[0] Then Return False
	 'for Y axis determine the times of first and last contact, if any
	If rvy<0
		If b.y2<a.y1 Then Return False ' Non-intersecting and moving apart
		If a.y2<b.y1 Then tf[0]=RMax((a.y2-b.y1)/rvy,tf[0])
		If b.y2>a.y1 Then tl[0]=RMin((a.y1-b.y2)/rvy,tl[0])
	EndIf
	If rvy>0
		If b.y1>a.y2 Then Return False ' Non-intersecting and moving apart
		If b.y2<a.y1 Then tf[0]=RMax((a.y1-b.y2)/rvy,tf[0])
		If a.y2>b.y1 Then tl[0]=RMin((a.y2-b.y1)/rvy,tl[0])
	EndIf
	'No overlap possible if time of first contact occurs after time of last contact
	If tf[0]>tl[0] Then Return False

	Return True	
End Function

Function RMax:Float(a:Float,b:Float)
	If b>a Then Return b
	Return a
End Function

Function RMin:Float(a:Float,b:Float)
	If b<a Then Return b
	Return a
End Function

Function rectsoverlap:Int(x0:Int,y0:Int,w0:Int,h0:Int,x2:Int,y2:Int,w2:Int,h2:Int)
	If x0>(x2+w2)Or(x0+w0)<x2 Then Return False
	If y0>(y2+h2)Or(y0+h0)<y2 Then Return False
	Return True
End Function