Interesting speed test

BlitzMax Forums/BlitzMax Programming/Interesting speed test

SuperStrict
'graphics 800,600

Global _x1#,_x2#,_x3#,_x4#
Global _y1#,_y2#,_y3#,_y4#

Global time1%,count1%
Global time2%,count2%

SeedRnd (123456)
Delay(2000)
time1=MilliSecs()
For Local i%=1 To 50000
	_x1=Rnd(0,800)
	_x2=Rnd(0,800)
	_x3=Rnd(0,800)
	_x4=Rnd(0,800)
	_y1=Rnd(0,600)
	_y2=Rnd(0,600)
	_y3=Rnd(0,600)
	_y4=Rnd(0,600)
	If LinesCollide(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4) Then count1:+1
Next
time1=MilliSecs()-time1
Print "Method 1: "+count1+" colisions found in "+time1+" ms"

SeedRnd (123456)
time2=MilliSecs()
For Local i%=1 To 50000
	_x1=Rnd(0,800)
	_x2=Rnd(0,800)
	_x3=Rnd(0,800)
	_x4=Rnd(0,800)
	_y1=Rnd(0,600)
	_y2=Rnd(0,600)
	_y3=Rnd(0,600)
	_y4=Rnd(0,600)
	If LinesCollide2(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4) Then count2:+1
Next
time2=MilliSecs()-time2
Print "Method 2: "+count2+" colisions found in "+time2+" ms"
Delay(1000)
End


Function LinesCollide%(x1#,y1#,x2#,y2#,x3#,y3#,x4#,y4#)
	Local dpx#= x3 - x1 + x4 - x2
	Local dpy#= y3 - y1 + y4 - y2
	Local qax#= x2 - x1
	Local qay#= y2 - y1
	Local qbx#= x4 - x3
	Local qby#= y4 - y3
	
	Local d#= qay*qbx - qby*qax
	Local la# = qbx*dpy - qby*dpx
	Local lb# = qax*dpy - qay*dpx
	
	If Abs(la)<=Abs(d)  And Abs(lb) <=Abs(d) Then Return True
	Return False
End Function

Function LinesCollide2%(x1#,y1#,x2#,y2#,x3#,y3#,x4#,y4#)
	Local LowerX#,UpperX#,LowerY#,UpperY#
	Local Ax#,Ay#,Bx#,By#,Cx#,Cy#,d#,e#,f#
  	
	Ax# = x2 - x1
  	Bx# = x3 - x4
	If Ax<0.0
		LowerX = x2
		UpperX = x1
	Else
		UpperX = x2
		LowerX = x1
	End If

	If Bx>0.0
		If UpperX<x4 Or x3<LowerX Then Return False
	ElseIf (UpperX<x3 Or x4<LowerX)
		Return False
	EndIf
  
	Ay = y2 - y1
	By = y3 - y4

	If Ay<0.0
		LowerY = y2
		UpperY = y1
	Else
		UpperY = y2
		LowerY = y1
	End If

	If By>0.0
		If UpperY<y4 Or y3<LowerY Then Return False
	ElseIf UpperY<y3 Or y4<LowerY
		Return False
	EndIf

	Cx = x1 - x3
	Cy = y1 - y3
  	d  = (By * Cx) - (Bx * Cy)
  	f  = (Ay * Bx) - (Ax * By)

	If f>0.0
		If d<0.0 Or d>f Then Return False
	ElseIf d>0.0 Or d<f
		Return False
	EndIf

 	e = (Ax * Cy) - (Ay * Cx)

	If f>0.0 Then
		If e<0.0 Or e>f Then Return False
	ElseIf e>0.0 Or e<f Then
		Return False
	EndIf

  	Return True
End Function


Method 1 is always faster for me, H&K's occasionally is slower, but never faster than method 2