找到弧度反射角

时间:2011-04-29 10:18:41

标签: flash actionscript-3 math


我正在编写一个简单的Flash游戏,只是为了学习flash并改进我的数学,但是我对Radians非常困惑,因为我有新的东西。

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

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

3 个答案:

答案 0 :(得分: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以获取图片和一些说明。这为水平墙提供了这个公式:

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

类似于垂直墙:

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

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

答案 1 :(得分:2)

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

假设你的圆圈有一个向量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 :(得分:-1)

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

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