Collision course

Blitz3D Forums/Blitz3D Programming/Collision course

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Here you go :)
Uses the function from the above mentioned code archive:
;How to predict if two entities will collide, not taking their speed into consideration
;By Jeppe Nielsen 2004
;Lines_intersect function by sswift

; Values returned by the Lines_Intersect() function.
Global Intersection_X#									
Global Intersection_Y#
Global Intersection_AB#
Global Intersection_CD#

Graphics3D 800,600,16,2

SeedRnd MilliSecs()
cam=CreateCamera()

PositionEntity cam,0,400,0
RotateEntity cam,90,0,0
CameraZoom cam,5

Global ent1=CreateCube() : EntityFX ent1,1
Global ent2=CreateCube() : EntityFX ent2,1

Global intersectsphere=CreateSphere()
EntityColor intersectsphere,255,255,0
EntityFX intersectsphere,1
HideEntity intersectsphere

PositionEntity ent1,20,0,10
RotateEntity ent1,0,45,0
PositionEntity ent2,0,0,-20
RotateEntity ent2,0,0,0

	Repeat
	
	MoveEntity ent1,0,0,0.1
	MoveEntity ent2,0,0,0.1
	
	If KeyHit(57)
	
		resetentities
	
	EndIf
	
	RenderWorld
	
	Text 400,10,"Space to reset entities",1
	Text 400,20,"Flashing yellow sphere indicates intersection point",1
	
	If CollisionCourse(ent1,ent2)
	
		Text 400,300,"ENTITIES ARE ON A COLLISION COURSE!",1,1
		
		If Sin(MilliSecs()*5)>0
			ShowEntity intersectsphere
		Else
			HideEntity intersectsphere
		EndIf
		
		PositionEntity intersectsphere,Intersection_X#,0,Intersection_Y#
		
	Else
	
		HideEntity intersectsphere
	
	EndIf
	
	Flip
	
Until KeyDown(1)
End

Function resetentities()
	
	PositionEntity ent1,Rnd(-20,20),0,Rnd(-20,20)
	RotateEntity ent1,0,Rnd(360),0
	PositionEntity ent2,Rnd(-20,20),0,Rnd(-20,20)
	RotateEntity ent2,0,Rnd(360),0
	
End Function

Function CollisionCourse(e1,e2)
	
	x1#=EntityX(e1,1)
	z1#=EntityZ(e1,1)
	
	TFormVector 0,0,1,e1,0
	
	dx1#=TFormedX()
	dz1#=TFormedZ()
	
	x2#=EntityX(e2,1)
	z2#=EntityZ(e2,1)
	
	TFormVector 0,0,1,e2,0
	
	dx2#=TFormedX()
	dz2#=TFormedZ()
	
	
	;if trajectories are parallel
	If Lines_Intersect(x1,z1,x1+dx1,z1+dz1,x2,z2,x2+dx2,z2+dz2)=False
	
		Return False
	
	Else
	
	Return Intersection_AB#>=0 And Intersection_CD#>=0
	
	EndIf
	
End Function


;function by sswift
Function Lines_Intersect(Ax#, Ay#, Bx#, By#, Cx#, Cy#, Dx#, Dy#)
  

	Rn# = (Ay#-Cy#)*(Dx#-Cx#) - (Ax#-Cx#)*(Dy#-Cy#)
        Rd# = (Bx#-Ax#)*(Dy#-Cy#) - (By#-Ay#)*(Dx#-Cx#)

	If Rd# = 0 
		
		; Lines are parralel.

		; If Rn# is also 0 then lines are coincident.  All points intersect. 
		; Otherwise, there is no intersection point.
	
		Return False
	
	Else
	
		; The lines intersect at some point.  Calculate the intersection point.
	
                Sn# = (Ay#-Cy#)*(Bx#-Ax#) - (Ax#-Cx#)*(By#-Ay#)

		Intersection_AB# = Rn# / Rd#
		Intersection_CD# = Sn# / Rd#

		Intersection_X# = Ax# + Intersection_AB#*(Bx#-Ax#)
         	Intersection_Y# = Ay# + Intersection_AB#*(By#-Ay#)
			
		Return True
		
	EndIf


End Function