2017-12-27 104 views
3

我正在做一些sprite工具包中的代碼,並且想要根據開始位置計算一個精靈的位置並在給定方向和距離上移動它。例如,假設我使用的度數是0,意思是直線上升,我想將精靈從當前位置向45度(向上和向右)方向移動10個點。快速計算y方向上的新點x距離

三角函數不是我的力量,我一直在努力弄清楚如何應用它。沿45度方向移動看起來相當簡單,但我不確定如何計算方向,如110(向右和向右)或225(向左和向下)。

我第一次嘗試是這樣的:

public func offset(byDistance distance:CGFloat, inDirection degrees:CGFloat) { 
    let vertical = sin(degrees) * distance 
    let horizontal = sqrt(pow(distance, 2.0) + pow(vertical, 2.0)) 
    self.position = self.position.applying(CGAffineTransform(translationX:horizontal, y:vertical)) 
} 

但我不認爲這是工作的結果是這樣的:

Direction 45, distance 88.26 -> New location {75.10, 115.88} 
Direction 135, distance 88.26 -> New location {7.79, 88.60} 
Direction 225, distance 88.26 -> New location {-82.09, 120.53} 
Direction 315, distance 88.26 -> New location {65.76, 110.06} 

任何人都可以給我一些線索,在那裏我出錯了?

回答

3

這裏有幾個線索:

  1. sin()採用弧度不度,所以你需要轉換。
  2. 0是正確的,不起來,所以你需要調整。
  3. 水平使用cos()

這是更接近你需要的東西:

public func offset(byDistance distance:CGFloat, inDirection degrees:CGFloat) { 
    let radians = (degrees - 90) * .pi/180 
    let vertical = sin(radians) * distance 
    let horizontal = cos(radians) * distance 
    self.position = self.position.applying(CGAffineTransform(translationX:horizontal, y:vertical)) 
} 
+0

謝謝你的工作完美。 Trig始終是我在學校掙扎的事情,因爲我總是試圖瞭解它是如何工作的。我已經編寫了30多年了,它仍然迫使我嘗試去理解它。我仍然在數學閱讀互聯網網站,所以我會繼續堵塞:-) – drekka

+0

我認爲我錯過的一件大事是功能以弧度工作。我看過的所有數學網站都以度爲單位。我還注意到,如果我使用OS X計算器,默認情況下會使用度數,如果在OS X的Spotlite搜索中輸入'sin(45)'或類似的值,則使用弧度。 – drekka

+0

iOS和Mac OS觸發功能始終使用弧度。大多數描述trig函數的網站都使用度數,因爲它們更直觀。如果你明白一個圓的周長是2Π•半徑,並且你假設半徑是1單位,你可以想象一個螞蟻沿着圓的外側行走。如果它行走Π/ 2個單位,它將沿着該圓周的四分之一行進。一旦它走Π單位,它將在圓周的一半。當它走過2個單位時,它將完成一整圈。這就是弧度的工作原理。 –

1

有2個(實際上是3,但讓我們忽略了第3)像正弦和餘弦三角函數獨立的符號:角度和弧度。兩者都描述角度。度數範圍從0到360,弧度範圍從0到

它們之間的轉換很簡單:

degrees = 180 * radians/π 
radians = degrees/180 * π 

的iOS和Mac OS使用弧度爲他們的三角函數。

您可以使用度數繼續跟蹤角度,然後在將值輸入到trig函數或轉換爲使用弧度之前轉換爲弧度。

如果您瞭解圓的圓周爲2π • radius,並且您假設半徑爲1個單位,則可以通過考慮螞蟻沿着圓的外側行走來了解弧度。沿圓周(外側)的總路徑距離爲單位。如果螞蟻步行π/2單位,它將行進四分之一週圍的方式。一旦它行走了π單位,它將在圓周的一半。當它走過個單位時,它將完成一個完整的循環。這就是弧度的工作原理。

+0

男人,SO字體中的pi符號很醜!小寫的pi看起來像2 Ts,而大寫的PI看起來像是一個顛倒的U.兩者都很難辨認。代碼字體中的小寫字母pi是唯一看起來不錯的字體。 –