快速计算y方向上的新点x距离
我正在做一些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}
任何人都可以给我一些线索,在那里我出错了?
这里有几个线索:
-
sin()
采用弧度不度,所以你需要转换。 -
0
是正确的,不起来,所以你需要调整。 - 水平使用
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))
}
有2个(实际上是3,但让我们忽略了第3)像正弦和余弦三角函数独立的符号:角度和弧度。两者都描述角度。度数范围从0到360,弧度范围从0到2π
。
它们之间的转换很简单:
degrees = 180 * radians/π
radians = degrees/180 * π
的iOS和Mac OS使用弧度为他们的三角函数。
您可以使用度数继续跟踪角度,然后在将值输入到trig函数或转换为使用弧度之前转换为弧度。
如果您了解圆的圆周为2π • radius
,并且您假设半径为1个单位,则可以通过考虑蚂蚁沿着圆的外侧行走来了解弧度。沿圆周(外侧)的总路径距离为2π
单位。如果蚂蚁步行π/2
单位,它将行进四分之一周围的方式。一旦它行走了π
单位,它将在圆周的一半。当它走过2π
个单位时,它将完成一个完整的循环。这就是弧度的工作原理。
男人,SO字体中的pi符号很丑!小写的pi看起来像2 Ts,而大写的PI看起来像是一个颠倒的U.两者都很难辨认。代码字体中的小写字母pi是唯一看起来不错的字体。 –
谢谢你的工作完美。 Trig始终是我在学校挣扎的事情,因为我总是试图了解它是如何工作的。我已经编写了30多年了,它仍然迫使我尝试去理解它。我仍然在数学阅读互联网网站,所以我会继续堵塞:-) – drekka
我认为我错过的一件大事是功能以弧度工作。我看过的所有数学网站都以度为单位。我还注意到,如果我使用OS X计算器,默认情况下会使用度数,如果在OS X的Spotlite搜索中输入'sin(45)'或类似的值,则使用弧度。 – drekka
iOS和Mac OS触发功能始终使用弧度。大多数描述trig函数的网站都使用度数,因为它们更直观。如果你明白一个圆的周长是2Π•半径,并且你假设半径是1单位,你可以想象一个蚂蚁沿着圆的外侧行走。如果它行走Π/ 2个单位,它将沿着该圆周的四分之一行进。一旦它走Π单位,它将在圆周的一半。当它走过2个单位时,它将完成一整圈。这就是弧度的工作原理。 –