首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >围绕另一个CGPoint旋转CGPoint

围绕另一个CGPoint旋转CGPoint
EN

Stack Overflow用户
提问于 2016-02-28 13:55:03
回答 2查看 2.3K关注 0票数 5

好的,我想把CGPoint(A)旋转50度,绕CGPoint(B)旋转,有好的方法吗?

CGPoint(A) = CGPoint(x: 50, y: 100)

CGPoint(B) = CGPoint(x: 50, y: 0)

我想做的是:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-28 14:09:48

这真是一道数学题。在Swift中,你想要的东西是:

代码语言:javascript
复制
func rotatePoint(target: CGPoint, aroundOrigin origin: CGPoint, byDegrees: CGFloat) -> CGPoint {
    let dx = target.x - origin.x
    let dy = target.y - origin.y
    let radius = sqrt(dx * dx + dy * dy)
    let azimuth = atan2(dy, dx) // in radians
    let newAzimuth = azimuth + byDegrees * CGFloat(M_PI / 180.0) // convert it to radians
    let x = origin.x + radius * cos(newAzimuth)
    let y = origin.y + radius * sin(newAzimuth)
    return CGPoint(x: x, y: y)
}

有很多方法可以简化这一点,对于CGPoint的扩展来说,这是一个很好的例子,但是为了清晰起见,我已经把它留了很长的篇幅。

票数 14
EN

Stack Overflow用户

发布于 2017-11-26 01:56:21

代码语言:javascript
复制
public extension CGFloat {
    ///Returns radians if given degrees
    var radians: CGFloat{return self * .pi / 180}
}    

public extension CGPoint {
    ///Rotates point by given degrees
    func rotate(origin: CGPoint? = CGPoint(x: 0.5, y: 0.5), _ byDegrees: CGFloat) -> CGPoint {
        guard let origin = origin else {return self}

        let rotationSin = sin(byDegrees.radians)
        let rotationCos = cos(byDegrees.radians)

        let x = (self.x * rotationCos - self.y * rotationSin) + origin.x
        let y = (self.x * rotationSin + self.y * rotationCos) + origin.y

        return CGPoint(x: x, y: y)
    }
}

使用

代码语言:javascript
复制
var myPoint = CGPoint(x: 40, y: 50).rotate(45)
var myPoint = CGPoint(x: 40, y: 50).rotate(origin: CGPoint(x: 0, y: 0), 45)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35683376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档