首页 文章

找到弧度反射角

提问于
浏览
2

我对Radians非常困惑,因为我有新的东西 .

到目前为止我所做的就是使用你的鼠标(点击和释放)你用弧度向那个方向射球 . 现在我想要发生的是当球击中墙壁时它会以反射角度反弹 . 例如 . 如果球击中以-0.65的弧度行进的右侧墙,它应以约-2.5的弧度反弹回来

有些人可以向我解释我是怎么做的吗?谢谢

3 回答

  • 8

    如果你使用弧度,你应该(总是)在Pi中表达它们,简单地用Pi除 . 让工作和理解更容易 .

    -0.65 rad = -0.207*Pi rad
    -2.5 rad = -0.796*Pi rad
    

    一个完整的圆是2 * Pi . 水平表面的法线是0.5 * Pi(或-0.5 * Pi) .

    normal = 0.5*Pi
    angle of incidence = i + Pi - 0.5*Pi //EDIT: +Pi, need to invert the direction
    angle of reflection = 0.5*Pi - angle of incidence
    

    请参阅维基百科上的Reflection以获取图像和一些解释 . 这为 horizontal 墙提供了这个公式:

    r = 0.5*Pi - (i + Pi - 0.5*Pi)
    r = 2*Pi - i 
    r = -i //subtract 2*Pi
    

    例如

    i = -0.207*Pi //gives
    r = 0.207*Pi //for a horizontal wall
    

    类似于 vertical wall:

    r = 0 - (i + Pi - 0)
    r = -Pi - i
    

    EDIT 我意识到这不正确 . 要使公式起作用, i 必须指向相反的方向 . 修正了它,希望它现在是正确的 . 如果我以后有时间,我会附上解释错误和解决方案的图片 .

  • -1

    使用向量来做这种事情要容易得多(如点向量,而不是向量数组) .

    假设你的圆圈有一个向量v(它正在行进的方向)并且你正在碰撞一条具有标准化法线向量n的线(法线是垂直于该线运行的向量 - 标准化意味着它的长度为1),那么你可以像这样计算反射:

    // gets the dot product between 2 points
    public function dot( a:Point, b:Point ):Number
    {
        return ( a.x * b.x ) + ( a.y * b.y );
    }
    
    // reflects a point
    public function reflect( p:Point, dir:Point ):void
    {
        // using the formula [R = V - (2 * V.N) * N] or [V -= 2 * N * (N.V)]
        var vn2:Number  = 2.0 * MathHelper.dot( p, dir );
        p.x = p.x - ( dir.x * vn2 );
        p.y = p.y - ( dir.y * vn2 );
    }
    

    然后拨打 reflect( v, n );

    根据您正在碰撞的线的哪一侧(左侧或右侧),您可能需要将最终的x和y乘以-1

    有关矢量的一个很好的概述,请查看http://tonypa.pri.ee/vectors/start.html(这是旧的,但概念是合理的)

  • 2

    通过一些简单的数学运算,您可以将弧度转换为度数,反之亦然:

    var radians :Number = 90 * (Math.PI / 180);
    var degrees :Number = radians * (180 / Math.PI);
    trace(radians, degrees)
    

相关问题