My 2d coordinate system is standard 0,0 at the top left to screen-width, screen-height on the bottom right. I have a test right angle triangle represented by 3 line segments and a single point which I am testing the collision with for now before I expand to a box. Here's a little diagram of what happens on screen.
S is the start position, O is the collision etc.
x x x x x x x x
x x x x x x x
x x x x x O o o o o o o <-S
x x x x x-o
x x x x....o
x x x.......o
x x..........o
x.............o
So I thought this is fine BUT all is not fine, because the incoming vector was say (3,0) and the new outgoing vector is (2.38419e-07, 3) hmmm. So if I carry on and hit another right angle this time its way off.
My code for getting the reflection is here:
void get_reflection_vector(float &_vx, float &_vy)
{
Vector2<float> in(_vx, _vy);
Vector2<float> surface(ls[closest_line].p1.x - ls[closest_line].p2.x,
ls[closest_line].p1.y - ls[closest_line].p2.y); //ls is a std::vector of line segments
Vector2<float> n = surface.norm();
float n_dot_in = -n.dot(in) ;
Vector2<float> out = in.add(n.mul(n_dot_in * 2.0f ));
_vx = out.x;
_vy = out.y;
}
I know its a bit messy and should return a vector and stuff but this is just me starting out and trying to get it working quick and dirty.
Relevant Vector2 members are:
Vector2<T> norm()
{
float len = this->getlen();
Vector2<T> res(x/len, y/len);
return res;
}
Vector2<T> mul(T scale)
{
Vector2<T> res(x*scale, y*scale);
return res;
}
Vector2<T> add(Vector2<T> v)
{
Vector2<T> res( x + v.getx(), y + v.gety() );
return res;
}
T dot(Vector2<T> v)
{
T res = x * v.getx() + y * v.gety();
return res;
}
float getlen() { return sqrt( (x*x) + (y*y) ); }
I'm probably going to feel a bit stupid as I expect its something really simple but I cant see what's wrong. Can anyone help?