Line interesecting oval

BlitzMax Forums/BlitzMax Beginners Area/Line interesecting oval

Hi all

How can i detect if a line I am drawing intersects an oval ?

you must search for a line-circle-collision-routine

and only what you should do is to strech a line and a oval (oval->circle) with a factor....

for example:
your oval is 100x50 px (at 70,70 coordinate) and your line is from 0,0 to 100,100

your stretch factor is 2.0 (=100:50)

after stretching:
100,100 oval (at 70,140) and line 0,0-100,200

can a math guru please help me out with this one ? I got this routine off the net, but cant get it to work, an have no idea why.

Strict

Type vector2d
	Field x:Int
	Field y:Int

End Type

Const R:Int = 15

Global p1:vector2d = New vector2d
Global p2:vector2d = New vector2d
Global p3:vector2d = New vector2d
Global p:vector2d = New vector2d
Global m:Float

p1.x = 250;p1.y=250
p2.x = 400;p2.y=300

Graphics 800,600,32

Function pointincircle:Int(p:vector2d,c:vector2d)
	Return r*r >= getlength(c,p) 
End Function 

Function getlength:Int(v1:vector2d,v2:vector2d)
 Return	(v2.x-v1.x) * (v2.x-v1.x) + (v2.y-v1.y) * (v2.y-v1.y) 
End Function

While Not KeyDown(key_escape)

	p3.x = MouseX()
	p3.y = MouseY()
	
	DrawOval(p3.x,p3.y,R*2,R*2)
	DrawLine p1.x,p1.y,p2.x,p2.y

	
	
	
	m=(p2.y-p1.y)/(p2.x-p1.x)
	p.y = (m*(m*p3.y+p3.x-p2.x)+p2.y)/(1+m*m)
	p.x = p3.x + m*(p3.y-p.y)
	
	If(p.x >= p1.x And p.x <= p2.x) Or (p.x < p1.x And p.x > p2.x) Then 	DrawText "On Line Collision",100,100
	If(r*r >= getlength(p3,p)) Then DrawText "end point collision",100,100
	ElseIf (pointincircle(p1,p3)) Then DrawText "end point collision",100,100
	ElseIf (pointincircle(p2,p3)) Then DrawText "end point collision",100,100
		
	
	DrawOval p.x,p.y,5,5
	DrawLine p3.x,p3.y,p.x,p.y

	Flip
	Cls
Wend


this seems to work

Strict

Function intersection:Float(x1:Float,y1:Float,x2:Float,y2:Float,x3:Float,y3:Float,r:Float)


Rem 
	x1,y1,z1 p1 coords (point of line)
	x2,y2,z2 p2 coords (point of line)
	x3,y3,z3 p3 coords and radius (sphere)
	x,y,z intersection

End Rem

Local x:Float
Local y:Float
Local a:Float
Local b:Float
Local c:Float
Local mu:Float
Local i:Float
Local p:Float[7]

a = (x2-x1)^2 + (y2-y1)^2 
b = 2*((x2-x1)*(x1-x3)+(y2-y1)*(y1-y3))
c = x3^2 + y3^2 + x1^2 + y1^2 - 2*(x3*x1+y3*y1) - r^2

i = b*b - 4*a*c

If ( i < 0) Then
 p[0] = 0
 Return 0
End If

If(i=0) Then
 p[0] = 1
 Return 1 
End If

If(i > 2) Then
 Return 2
End If


Return 0
End Function


Graphics 800,600,32

While Not KeyDown(key_escape)

	DrawLine 10,10,100,100
	
	DrawOval MouseX(),MouseY(),30,30

	Local g:Float=0
	
	Local dx:Float = MouseX() - 10
	Local dy:Float = MouseY() - 10
	
	Local mag:Float = Sqr(dx^2 + dy^2)
	
	Local dlx:Float = 100-10
	Local dly:Float = 100-10
	
	Local linemag:Float = Sqr(dlx^2+dly^2)
	
	If mag <= linemag Then
		g = intersection(10,10,100,100,MouseX(),MouseY(),15)

		If g > 0 Then DrawText "Collision!",100,100
	End If
	
	
	
	DrawText mag, 200,200
	
	Flip
	Cls
Wend