【问题标题】:Swift calculating a new point x distance in y direction快速计算 y 方向上的新点 x 距离
【发布时间】:2017-12-27 13:08:10
【问题描述】:

我正在 sprite kit 中编写一些代码,并希望根据起始位置计算 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}

谁能给我一些关于我哪里出错的线索?

【问题讨论】:

    标签: swift


    【解决方案1】:

    这里有一些线索:

    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))
    }
    

    【讨论】:

    • 谢谢你完美的工作。 Trig 一直是我在学校里苦苦挣扎的东西,因为我总是很难理解它是如何工作的。我已经编码 30 多年了,它仍然让我疯狂地试图理解它。我还在阅读有关数学的互联网网站,所以我会继续努力:-)
    • 我认为我错过的一件大事是函数以弧度工作。我看过的所有数学网站都以学位为单位。我还注意到,如果我使用 OS X 计算器,它默认使用度数,就像我在 OS X 的 Spotlite 搜索中输入“sin(45)”或类似内容一样,它使用弧度。
    • iOS 和 Mac OS 三角函数总是使用弧度。大多数描述三角函数的网站都使用度数,因为它们更直观。如果你知道圆的周长是 2∏ • 半径,并且假设半径是 1 个单位,你可以想象一只蚂蚁沿着圆的外侧行走。如果它走 ∏/2 个单位,它将绕圆周行进 1/4。一旦它走了 ∏ 个单位,它就会绕着圆圈走了一半。当它走了 2∏ 个单位时,它将完成一个完整的循环。这就是弧度的工作原理。
    【解决方案2】:

    正弦和余弦等三角函数有 2 个(实际上是 3 个,但我们忽略第 3 个)单独的符号:度数和弧度。两者都描述了角度。度数范围从 0 到 360,弧度范围从 0 到

    它们之间的转换很简单:

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

    iOS 和 Mac OS 使用弧度作为三角函数。

    您可以继续使用度数跟踪角度,然后在将值输入三角函数之前转换为弧度,或者转换为使用弧度。

    如果你知道圆的周长是2π • radius,并且假设半径是 1 个单位,那么你可以想象一只蚂蚁沿着圆的外侧行走来理解弧度。沿着圆的圆周(外部)的总路径是 距离单位。如果蚂蚁走π/2 个单位,它将绕圈行进1/4。一旦它走过π 个单位,它就会绕着圆圈走了一半。当它走 个单位时,它将完成一个完整的循环。这就是弧度的工作原理。

    【讨论】:

    • 伙计,SO 字体中的 pi 符号很难看!小写的 pi 看起来像 2 个 T,大写的 PI 看起来像一个倒置的 U。两者都几乎无法辨认。代码字体中的小写 pi 是唯一一个看起来不错的字体。
    【解决方案3】:

    如果您更喜欢没有三角的更简单的方法 - 您可以使用点距离:

    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))
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 2012-05-03
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多