计算反转旋转线的反弹角度

时间:2014-04-10 07:41:49

标签: c++ visual-c++ math normals

我一直在尝试实施The second answer of this question

我的变量主要与链接中的名称相同。

这里他们用法线计算旋转曲面上一个点的反弹角度, 但我似乎无法做到,我做错了什么?

我预期的值输出是在旋转线上弹跳后的新速度,目前我的输出是做所有疯狂的事情,弹跳到高位,反弹另一种方式,有时是正确的方式,但大多数忽略我的线的旋转角度。

这是我目前的代码:

变量:

  • Top是我的第一点
  • 右边是我的第二点
  • n是正常的
  • v是速度
  • dotv是n * v
  • dotn是n * n

旧代码:

sf::Vector2f n(-(top.y - right.y),(top.x - right.x));
sf::Vector2f dotv = sf::Vector2f(ball.getSpeed().x * n.x, ball.getSpeed().y * n.y);
sf::Vector2f dotn = sf::Vector2f(n.x*n.x,n.y*n.y);
sf::Vector2f u = sf::Vector2f(dotv.x/dotn.x,dotv.y/dotn.y);
u = sf::Vector2f(u.x*n.x,u.y*n.y);
sf::Vector2f w = ball.getSpeed() - u;
ball.setSpeed(sf::Vector2f((sf::Vector2f(w.x*0.5,w.y*0.5)-u)));

编辑:

新守则:

sf::Vector2f n(-(top.y - right.y),(top.x - right.x));
double dotv = ball.getSpeed().x*n.x + ball.getSpeed().y*n.y;
double dotn = n.x*n.x + n.y*n.y;
sf::Vector2f u = sf::Vector2f((dotv/dotn)*n.x, (dotv/dotn)*n.y);
sf::Vector2f w = ball.getSpeed() - u;
ball.setSpeed(sf::Vector2f(ball.getSpeed().x,ball.getSpeed().y) - w);

起初我犯了将dotproducts计算为已经解决的向量的错误,现在它仍然给我一个奇怪的输出它直接通过我的对象以反转法线的角度发射我的球

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我看到的一个问题是你有点积作为矢量。点积产生标量(单值)。

此外,为了让您的生活更轻松,您可以为矢量操作创建函数,甚至在适当的时候重载操作符。例如。矢量加法,减法。对于点积和交叉积的常规函数​​来说,它可能是最好的。以下是我的意思的一些例子

class Vector2f
{
    // Member of Vector2f
    X& operator+=(const Vector2f& other)
    {
        x += other.x;
        y += other.y;

        return *this;
    }

};

// Not member of Vector2f
inline Vector2f operator+(Vector2f a, const Vector2f& b)
{
  a += b;
  return a;
}

double dot(const Vector2f& a, const Vector2f& b)
{
    return a.getX()*b.getX() + a.getY()*b.getY();
}
相关问题