好吧,我想旋轉CGPoint(A)圍繞CGPoint(B)旋轉50度是否有一種很好的方法可以做到這一點?圍繞另一個CGPoint旋轉CGPoint
CGPoint(A)= CGPoint(x: 50, y: 100)
CGPoint(B)= CGPoint(x: 50, y: 0)
這就是我想做的事:
好吧,我想旋轉CGPoint(A)圍繞CGPoint(B)旋轉50度是否有一種很好的方法可以做到這一點?圍繞另一個CGPoint旋轉CGPoint
CGPoint(A)= CGPoint(x: 50, y: 100)
CGPoint(B)= CGPoint(x: 50, y: 0)
這就是我想做的事:
這的確是一個的數學問題。在斯威夫特,你想要的東西,如:
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
一個完美的情況下,但我把它詳細的清晰度。
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)
}
}
使用
var myPoint = CGPoint(x: 40, y: 50).rotate(45)
var myPoint = CGPoint(x: 40, y: 50).rotate(origin: CGPoint(x: 0, y: 0), 45)
謝謝你,這個工作完全 – Benja0906
這個工作完美!我發現的唯一答案是不使用CGAffineTransform – bevbomb