我正在使用sprite工具包中的一些代码,并且想要根据起始位置计算精灵的位置并在给定的方向和距离上移动它。例如,假设我使用的度数为0表示直线向上,我想将精灵从它的当前位置向45度(向上和向右)方向移动10点。
三角学不是我的力量,我一直在努力弄清楚如何应用它。向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}
任何人都可以给我一些关于我出错的地方的线索吗?
答案 0 :(得分:4)
以下是一些线索:
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))
}
答案 1 :(得分:1)
有三个(实际上是3个,但我们忽略了第三个)单独的三角函数符号,如正弦和余弦:度和弧度。两者都描述角度。度数范围从0到360,弧度范围从0到2π
。
在它们之间进行转换是微不足道的:
degrees = 180 * radians / π
radians = degrees / 180 * π
iOS和Mac OS使用弧度作为其触发功能。
您可以继续使用度数跟踪角度,然后在将值输入到trig函数之前转换为弧度,或转换为使用弧度。
如果你知道圆的圆周是2π • radius
,并且假设半径是1个单位,你可以通过思考沿着圆的外面行走的蚂蚁来理解弧度。沿圆周(外)的总路径距离为2π
个单位。如果蚂蚁走π/2
个单位,它将绕圆圈移动1/4。一旦它走了π
个单位,就会绕圈子走一半。当它走2π
个单位时,它将完成一个完整的循环。这就是弧度的工作原理。
答案 2 :(得分:1)
如果你更喜欢没有三角学的简单方法 - 你可以使用点距离:
func CGPointDistanceSquared(from: CGPoint, to: CGPoint) -> CGFloat {
return (from.x - to.x) * (from.x - to.x) + (from.y - to.y) * (from.y - to.y)
}
func CGPointDistance(from: CGPoint, to: CGPoint) -> CGFloat {
return sqrt(CGPointDistanceSquared(from: from, to: to))
}