这段代码取自使用XNA框架构建的游戏。我想要解释它在三角和物理方面是如何工作的。
ball.velocity = new Vector2((浮点)Math.Cos(cannon.rotation), (浮点)Math.Sin(cannon.rotation));
ball.rotation是一个精灵的旋转,我应该想到的是弧度。
为什么他们只能在弧度上使用角度来找到x位置然后找到斜边指向的方向的y位置同样的东西。
我问这个的原因。我想了解这个框架如何计算trig。我试图让一个精灵转向鼠标所在的方向,即:x和y已知,我只需要角度。
所以这里有两个问题。解释上面的代码并将sprite指向已知点的方向。
更新
我发现对象所在的点a不是(0,0),因为xna使用逆坐标系。所以我现在的变量是:
对象点。 鼠标点。
答案 0 :(得分:10)
每个角度对应于单位圆上的一个点(单位圆是以半径为中心的原点的唯一圆;也就是说,单位圆是满足x^2 + y^2 = 1
的点的集合)。对应关系如下:给定角度theta
,theta
对应于点(cos theta, sin theta)
。为什么(cos theta, sin theta)
住在单位圈?因为每个人都喜欢的身份
cos^2 theta + sin^2 theta = 1.
与x = cos theta
和y = sin theta
一样,点(x, y)
满足x^2 + y^2 = 1
,因此(x, y)
位于单位圆上。
要反转这一点,给定单位圆上的一个点,您可以使用inverse tangent(可能已知为arctan
或atan
,有时tan
找到角度} -1
)。确切地说,在单位圆上给定(x, y)
,您可以通过计算(x, y)
找到与theta = arctan(y / x)
对应的角度。
当然,这里有一些凌乱的细节。函数arctan
无法区分输入(x, y)
和(-x, -y)
,因为y / x
和(-y / -x)
具有相同的符号。此外,arctan
无法处理x = 0
的输入。因此,我们通常通过定义将为我们处理这些混乱细节的函数atan2
来处理这些问题
atan2(y, x) = arctan(y / x) if x > 0
= pi + arctan(y / x) if y >= 0, x < 0
= -pi + arctan(y / x) if y < 0, x < 0
= pi / 2 if y > 0, x = 0
= -pi / 2 if y < 0, x = 0
= NaN if y = 0, x = 0
在C#中,Math.Atan
是我上面提到的函数arctan
,Math.Atan2
是我上面提到的函数atan2
。
答案 1 :(得分:4)
|
y.-----* P
| /|
| / |
| r/ |
| / a |
|/)___.__
O x
we have:
a = angle in radians
O: origin
P: known point
r: distince between O & P
to calculate x, y:
x = r*cos(a)
y = r*sin(a)
(in your example : r = 1, a = cannon.rotation)
现在,如果你有x,y,你想要一个:
if x!= 0 a = atan(y/x)
otherwise a = sign(y)*Pi/2
了解更多信息(&amp;更漂亮的图表):Wikipedia: Polar coordinate system
答案 2 :(得分:2)
你可以看到cos和sin在圆上返回点。
在这方面,看到正典的中间是圆圈的中心。然后给出一个角度(正典的角度),你可以得到它所指向的圆与sin和cos的位置。 如果你认为大炮以0,0位置为中心,那么这个值也是子弹应该前往的方向。
回答2:如果你知道x和y,你需要知道角度..你需要atan函数,它返回三角形的倾斜边形成的角度,其中一个点是0,0,另一个点是x,y点和一个点是90度角
的点答案 3 :(得分:2)
可悲的是,这是一个很好的问题,其中SO不是最好的答案。
我认为学习参数方程会有所帮助,而不是在文本中解释。您可以先在Google中搜索“圈参数方程”。
这个概念点击给我的方式是试验不同的代码片段,直到我理解了罪,cos,圆和角度之间的关系。看图片和图片也有很多帮助。在此之前,我会阅读描述,但永远无法牢牢掌握解释。
答案 4 :(得分:0)
如果你不熟悉trig,你要问的是很难解释的。
有问题的代码行计算球的方向的单位矢量,我认为它将从大炮中射出。事物的Cos和Sin部分分别提取了大炮角度的X和Y分量。所以,在大炮指向的地方,那就是球射向的方向。
这有点误导,因为结果很可能只是一个方向,而不是一个实际的速度。我假设在那个下方有一条线将该矢量乘以一个常数,以使球具有最终的移动速度。