2009-10-14 76 views
2

這段代碼取自用XNA框架構建的遊戲。我想從trig和物理角度解釋它是如何工作的。C# - 三角代碼解釋(物理)

ball.velocity =新 Vector2((浮點)Math.Cos(cannon.rotation) (浮點)Math.Sin(cannon.rotation));

ball.rotation是一個精靈在我應該思考的旋轉,弧度。

爲什麼他們可以使用弧度角僅找到x位置,然後找到斜邊指向的方向的y位置。

我之所以問這個問題的原因。我想了解這個框架是如何計算trig的。我試圖讓一個精靈轉向鼠標所在的方向,那就是:x和y已知,我只需要角度。

所以這裏有2個問題。解釋上面的代碼,並將精靈指向已知點的方向。

更新:

我發現的一個點,其目的在於在不是(0,0),因爲使用XNA逆座標系。所以現在我有的變量是這些:

點的對象。 點的鼠標。

回答

10

每個角度對應於單位圓上的一個點(單位圓是以半徑1爲原點居中的唯一圓;即,單位圓是滿足x^2 + y^2 = 1的點的集合)。對應關係如下:給定角度theta,theta對應點(cos theta, sin theta)。爲什麼(cos theta, sin theta)住在單位圈?因爲大家最喜歡的身份

cos^2 theta + sin^2 theta = 1. 

這是x = cos thetay = sin theta,點(x, y)滿足x^2 + y^2 = 1使(x, y)是在單位圓上。

爲了逆轉此,給定的單位圓上的一個點可以通過使用找到的角度inverse tangent(也許知道你作爲arctanatan有時tan-1)。確切地說,在單位圓上給出(x, y),通過計算theta = arctan(y/x)可以找到對應於(x, y)的角度。

當然,這裏有一些凌亂的細節。函數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是我上面提到的功能arctanMath.Atan2就是我剛纔提到的功能atan2以上。

2

你可以看到cos和sin返回圓上的點。

在這方面看到佳能的中心作爲圓的中心。然後給定一個角度(canon的角度),你可以得到它指向sin和cos的圓上的位置。 如果你認爲大炮居中在0,0位置,那麼這個值也是子彈應該前進的方向。

答案2:如果你知道x和y並且你需要知道角度..你需要atan函數,它返回三角形的傾斜邊形成的角度,其中一個點是0,0,另一點是x,y點和一個點是90度角的點

2

可悲的是,這是一個很好的問題,其中SO不回答的最佳格式。

而是在文本解釋的,我認爲這將有助於瞭解參數方程。您可以先在Google中搜索「circle parametric equation」。

這個概念點擊我的方式是試驗不同的代碼片段,直到我理解了罪,角,圓和角度之間的關係。看到圖片和圖片也有很大幫助。在此之前,我會閱讀描述,但永遠無法牢牢把握解釋。現在

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 

更多信息(&漂亮圖表):Wikipedia: Polar coordinate system

0

什麼你問是難以解釋的如果你不熟悉trig。

有問題的代碼行計算球的方向的單位向量,我猜想會從大炮中發射。 Cos和Sin部分分別提取大炮角度的X和Y分量。所以,大炮指向哪裏,這就是球發射的方向。

這有點誤導,因爲結果很可能只是一個方向,而不是實際的速度。我會假設下面有一條線,將該向量乘以一個常數,以給出球的最終移動速度。