作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 UIBezierPath
创建折线图。我的目标是为这张图表制作动画,让它看起来像是“波浪状的”。但我似乎无法获得镜像数据的路径。
编辑:添加数据点
let dataPoints: [Double]
func wave(at elapsed: Double) -> UIBezierPath {
let amplitude = CGFloat(50) - abs(fmod(CGFloat(elapsed/2), 3) - 1.5) * 100
func f(_ x: Int) -> CGFloat {
return sin(((CGFloat(dataPoints[x]*100) / bounds.width) + CGFloat(elapsed/2)) * 4 * .pi) * amplitude + bounds.midY
}
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: f(0)))
for x in 1..<dataPoints.count {
path.addLine(to: CGPoint(x: CGFloat(x), y: f(x)))
}
return path
}
最佳答案
几个问题:
f(_:)
, 但没有使用它,而是使用 dataPoints
(我没有看到你在任何地方填充)。使用您的 f
可能是最简单的。直接发挥作用。x
之前和之后的点。值,沿着与相关曲线相切的线(例如,沿着由数据点和斜率定义的线,即曲线的一阶导数)。addLine
.如果你使用足够多的数据点,它会显得很平滑。x
CGPoint
中的值值小于您可能预期的值。如果您只从 0..<12 开始,则生成的路径将只有 12 点宽;哈哈。使用x
值一直贯穿相关 View 。func wave(at elapsed: Double) -> UIBezierPath {
let amplitude = CGFloat(50) - abs(fmod(CGFloat(elapsed/2), 3) - 1.5) * 40
func f(_ x: Int) -> CGFloat {
return sin(((CGFloat(x) / bounds.width) + CGFloat(elapsed/2)) * 4 * .pi) * amplitude + bounds.midY
}
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: f(0)))
for x in 1...Int(bounds.width) {
path.addLine(to: CGPoint(x: CGFloat(x), y: f(x)))
}
return path
}
嫁给
CADisplayLink
更新曲线,这会产生:
关于ios - 如何使用 UIBezierPath 创建带有数据点的曲线图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743134/
我是一名优秀的程序员,十分优秀!