我对Radians非常困惑,因为我有新的东西 .
到目前为止我所做的就是使用你的鼠标(点击和释放)你用弧度向那个方向射球 . 现在我想要发生的是当球击中墙壁时它会以反射角度反弹 . 例如 . 如果球击中以-0.65的弧度行进的右侧墙,它应以约-2.5的弧度反弹回来
有些人可以向我解释我是怎么做的吗?谢谢
如果你使用弧度,你应该(总是)在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 必须指向相反的方向 . 修正了它,希望它现在是正确的 . 如果我以后有时间,我会附上解释错误和解决方案的图片 .
i
使用向量来做这种事情要容易得多(如点向量,而不是向量数组) .
假设你的圆圈有一个向量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 );
reflect( v, n );
根据您正在碰撞的线的哪一侧(左侧或右侧),您可能需要将最终的x和y乘以-1
有关矢量的一个很好的概述,请查看http://tonypa.pri.ee/vectors/start.html(这是旧的,但概念是合理的)
通过一些简单的数学运算,您可以将弧度转换为度数,反之亦然:
var radians :Number = 90 * (Math.PI / 180); var degrees :Number = radians * (180 / Math.PI); trace(radians, degrees)
3 回答
如果你使用弧度,你应该(总是)在Pi中表达它们,简单地用Pi除 . 让工作和理解更容易 .
一个完整的圆是2 * Pi . 水平表面的法线是0.5 * Pi(或-0.5 * Pi) .
请参阅维基百科上的Reflection以获取图像和一些解释 . 这为 horizontal 墙提供了这个公式:
例如
类似于 vertical wall:
EDIT 我意识到这不正确 . 要使公式起作用,
i
必须指向相反的方向 . 修正了它,希望它现在是正确的 . 如果我以后有时间,我会附上解释错误和解决方案的图片 .使用向量来做这种事情要容易得多(如点向量,而不是向量数组) .
假设你的圆圈有一个向量v(它正在行进的方向)并且你正在碰撞一条具有标准化法线向量n的线(法线是垂直于该线运行的向量 - 标准化意味着它的长度为1),那么你可以像这样计算反射:
然后拨打
reflect( v, n );
根据您正在碰撞的线的哪一侧(左侧或右侧),您可能需要将最终的x和y乘以-1
有关矢量的一个很好的概述,请查看http://tonypa.pri.ee/vectors/start.html(这是旧的,但概念是合理的)
通过一些简单的数学运算,您可以将弧度转换为度数,反之亦然: