我正在编写一个简单的Flash游戏,只是为了学习flash并改进我的数学,但是我对Radians非常困惑,因为我有新的东西。
到目前为止我所做的就是使用你的鼠标(点击并释放)你用弧度向那个方向射球。现在我想要发生的是当球击中墙壁时它会以反射角度反弹。例如。如果球击中以-0.65的弧度行进的右侧墙,它应以约-2.5的弧度反弹回来
有些人可以向我解释一下我是怎么做的吗? 感谢
答案 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)