2017-09-26 72 views
2

我想在我的遊戲中出現一種圍繞着屏幕的聲波。我能夠做出正弦的直線,但是我怎樣才能使正弦旋轉20度?例如,從左下角到右上角?如何製作一個在spritekit swift中以角度旋轉的正弦?

 let pi = CGFloat.pi 
     let wave = Waves[0] 
     let x = path.currentPoint.x 
     let c = (2 * pi)/(wave.Wavelength * 30) 
     let a = 30 * wave.Amplitude 

     let y = a * sin(c * x) 

     path.addLine(to: CGPoint(x: x + 2, y: y)) 
+0

您需要包含更多信息,您如何使用路徑?作爲SKShapeNode?只需旋轉節點 – Knight0fDragon

回答

0

您可以將旋轉的仿射變換計算點位置

xnew = xbase + (x - xbase) * Cos(rot_angle) - (y - ybase) * Sin(rot_angle) 
ynew = ybase + (x - xbase) * Sin(rot_angle) + (y - ybase) * Cos(rot_angle) 

這裏(xbase, ybase) - (你的情況可能是0,0)旋轉中心,rot_angle的座標 - 旋轉的角度,你的情況20 * Pi/180

也許你的圖形庫已經包含仿射變換的功能,在這種情況下,只需要形成變換矩陣並應用它。

2

,您可以撥打UIBezierPath與2 Bézier curves相當準確地近似正弦波:

/// Convert degrees to radians 
func degreeToRadian(_ angle: CGFloat) -> CGFloat { 
    return angle * CGFloat.pi/180.0 
} 

let path = sinePath(size: CGSize(width: 200.0, height: 100.0)) 
path.apply(CGAffineTransform(rotationAngle: degreeToRadian(20))) 

我得到了baseX常數:

/// Make a path that approximates a peak-to-peak sine wave 
func sinePath(size: CGSize) -> UIBezierPath { 
    let path = UIBezierPath() 

    // path starts at 0,0 
    path.move(to: CGPoint.zero) 

    let halfWidth = size.width/2.0 

    // base x-values for control points 
    // baseX approximates the best fit Bézier curve for a sine wave 
    let baseX: = CGFloat(0.3642124232) 
    let firstX = halfWidth * baseX 
    let secondX = halfWidth * (1.0 - baseX) 

    // curve from start peak to trough 
    path.addCurve(to: CGPoint(x: halfWidth, y: size.height), 
       controlPoint1: CGPoint(x: firstX , y: 0), 
       controlPoint2: CGPoint(x: secondX, y: size.height)) 

    // curve from trough to end peak 
    path.addCurve(to: CGPoint(x: size.width, y:0), 
       controlPoint1: CGPoint(x: size.width - secondX, y: size.height), 
       controlPoint2: CGPoint(x: size.width - firstX , y: 0)) 
    return path 
} 

然後你可以用一個CGAffineTransform像這樣旋轉它從這個問題:

How to approximate a half-cosine curve with bezier paths in SVG?