I was just wondering if anyone could knowledge me about tangent collisions.
Like, for instance, a collision between a point and a side of a triangle.
I need it for my entry for the 2007 Christmas Compo...
Not trying to give too much away, but a collision between the sides of trees (each with different hypontinu (spell check) values) and a point (chosen by the d-pad... if you get me!?).
The calculation will return true if it hits inside the triangle (in yabasic any specific value, say... 1 or the_is_so_true), or false if it lays outside the triangle.
Thanks! (easy language so I can implement ;D lol)
Do you know how to check if the centre of the circle is inside the triangle?
Jim
take the crossproduct of the point against each edge and if all edges return negative you have a collision
px,py ... your point
x1,y1,x2,y2,x3,y3 ... your triangle
crosspoduct = (x1-px)*(y2-py) - (x2-px)*(y1-py)
if (sig(crossproduct) < 0) then
crosspoduct = (x2-px)*(y3-py) - (x3-px)*(y2-py)
if (sig(crossproduct) < 0) then
crosspoduct = (x3-px)*(y1-py) - (x1-px)*(y3-py)
if (sig(crossproduct) < 0) then
rem collision detected
endif
endif
endif
check out my thread on circle to line collisions I have posted a lot of subroutines there that may interest you
I bet your tree looks like this
/\
in which case, collision with the bottom is easy
if circle.y+radius < bottomoftree.y then
'clunk
fi
Then the other sides have a gradient (rise over run, remember from school?)
x along, y up (x,y).
Then the 'normal' to the side is (-y,x)
You need to normalise that
L = 1/sqr(x*x+y*y)
X = -y*L
Y = x*L
You need to check if
length(radius*X+treex-circlex, radius*Y+treey-circley) < 0
Jim
ahh - Gradient lol.
Yep remember that from year 9 ;)
haha.
I just didn't know how to... normalise and make an equation to make a colision detection out of it :P
Thanks guys!
I'll definately check out the collision post by you rain! Always an interesting read your posts :P
Both methods should work. Rain's is a 2d crossproduct - very, very useful thing. It tells you the area of a 2d triangle.
Jim
Ohk!
Tried your code out rain... and it is peculiar!
Is the naming of x1, y1, etc. important?
I named as:
/\
going clockwise, up, then down...
2
1 3
I also did (since there are multiple trees):
for i = 1 to trees
crosspoduct = ((x(1, i) - px) * (y(2, i) - py)) - ((x(2, i) - px) * (y(1, i) - py))
if sig(crossproduct) < 0 then
crosspoduct = ((x(2, i) - px) * (y(3, i) - py)) - ((x(3, i) - px) * (y(2, i) - py))
if sig(crossproduct) < 0 then
crosspoduct = ((x(3, i) - px) * (y(1, i) - py)) - ((x(1, i) - px) * (y(3, i) - py))
if sig(crossproduct) < 0 then
rem collision detected
fi
fi
fi
next
As I believe you cant achieve all tree collisions without x(n, i) etc.
Have I done this wrong?
I said (when a collisions was detected) to fill the screen with 0,0, 640,512 rectangle... it works... just not in the areas of the triangles.
Thanks!
check your spelling
Oh. Yeah sorry.
Thats not off my code (hopefully) I just wrote it up... as my program is on my non-internet lap top.
Sorry.
I will, however, check the spelling on my lap top :P
Thanks Jim!
@CLANKY that looks alright to me just make sure that the vertices are in clockwise order.
@Jim I gotta try that meathod out it looks like a sweet solution