iOSでSiriの波効果を描く方法を理解しようとしていて、this素晴らしいリポジトリを見つけました。 最終的な結果は次のようになります。SiriのWaveFormエフェクトを描画する
私は、単一の静的な正弦波を生成することができますwaves.Iを生成するコードで何が起こっているか理解する難しさを持っていますしかしこれ、私はしないでくださいかなり理解しているようです。私たちは、yの値を計算する際
特に、なぜそれがあることを持っています:
let y = scaling * maxAmplitude * normedAmplitude * sin(CGFloat(2 * M_PI) * self.frequency * (x/self.bounds.width) + self.phase) + self.bounds.height/2.0
ソースコード:
//MARK : Properties
let density : CGFloat = 1
let frequency : CGFloat = 1.5
var phase :CGFloat = 0
var phaseShift:CGFloat = -0.15
var numberOfWaves:Int = 6
var primaryLineWidth:CGFloat = 1.5
var idleAmplitude:CGFloat = 0.01
var waveColor:UIColor = UIColor.white
var amplitude:CGFloat = 1.0 {
didSet {
amplitude = max(amplitude, self.idleAmplitude)
self.setNeedsDisplay()
}
}
方法
override open func draw(_ rect: CGRect) {
// Convenience function to draw the wave
func drawWave(_ index:Int, maxAmplitude:CGFloat, normedAmplitude:CGFloat) {
let path = UIBezierPath()
let mid = self.bounds.width/2.0
path.lineWidth = index == 0 ? self.primaryLineWidth : self.secondaryLineWidth
for x in Swift.stride(from:0, to:self.bounds.width + self.density, by:self.density) {
// Parabolic scaling
let scaling = -pow(1/mid * (x - mid), 2) + 1
// The confusing part /////////////////////////////////////////
let y = scaling * maxAmplitude * normedAmplitude *
sin(CGFloat(2 * M_PI) * self.frequency * (x/self.bounds.width) + self.phase)
+ self.bounds.height/2.0
//////////////////////////////////////////////////////////////////
if x == 0 {
path.move(to: CGPoint(x:x, y:y))
} else {
path.addLine(to: CGPoint(x:x, y:y))
}
}
path.stroke()
}
let context = UIGraphicsGetCurrentContext()
context?.setAllowsAntialiasing(true)
self.backgroundColor?.set()
context?.fill(rect)
let halfHeight = self.bounds.height/2.0
let maxAmplitude = halfHeight - self.primaryLineWidth
for i in 0 ..< self.numberOfWaves {
let progress = 1.0 - CGFloat(i)/CGFloat(self.numberOfWaves)
let normedAmplitude = (1.5 * progress - 0.8) * self.amplitude
let multiplier = min(1.0, (progress/3.0*2.0) + (1.0/3.0))
self.waveColor.withAlphaComponent(multiplier * self.waveColor.cgColor.alpha).set()
drawWave(i, maxAmplitude: maxAmplitude, normedAmplitude: normedAmplitude)
}
self.phase += self.phaseShift
}
の両方をループは非常に数学的に見えますが、私は何が起こっているのか手がかりがありませんe。 ありがとうございます。
私はここに何があるのかよく分かりません... – Abizern
私は 'draw(rect)'メソッドの中でコードの簡単な説明をしたかったのですが、質問はあいまいです。だから、私はこれを尋ねる。なぜ、 'let y = scaling * maxAmplitude * normedAmplitude * sin(CGFloat(2 * M_PI)* self.frequency *(x/self.bounds.width)+ self.phase)+ self.bounds。高さ/ 2.0' –