You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI生成随机波浪线出现尖锐点问题求助

SwiftUI随机波浪线出现尖锐点的原因及修复

你的代码里出现尖锐点的核心问题是**addCurve方法的参数完全传反了**,导致贝塞尔曲线的控制点和目标点错位,直接破坏了曲线的平滑衔接逻辑。

错误根源

SwiftUI中Path.addCurve(to:control1:control2:)的参数定义很明确:

  • to: 曲线的终点
  • control1: 起点侧的第一个控制点
  • control2: 终点侧的第二个控制点

但你在代码里把这些参数彻底搞混了:

let to = CGPoint(x: cp1x, y: cp1y)
let control1 = CGPoint(x: cp2x, y: cp2y)
let control2 = CGPoint(x: xs[i], y: ys[i])
path.addCurve(to: control1, control1: to, control2: control1)

这里不仅把终点和控制点的顺序弄反,甚至control2还重复使用了control1的值,直接导致曲线的走向完全偏离平滑轨迹,出现尖锐转折。

修复后的代码

把addCurve的参数修正为正确顺序即可,替换循环部分的代码:

path.move(to: CGPoint(x: xs[0], y: ys[0]))

for i in 1...Int(npts) {
    let cp1x = xs[i - 1] + tension * vxs[i - 1]
    let cp1y = ys[i - 1] + tension * vys[i - 1]
    let cp2x = xs[i] - tension * vxs[i]
    let cp2y = ys[i] - tension * vys[i]
    
    // 正确参数:终点是xs[i],control1是前一个点的外推控制点,control2是当前点的内推控制点
    path.addCurve(
        to: CGPoint(x: xs[i], y: ys[i]),
        control1: CGPoint(x: cp1x, y: cp1y),
        control2: CGPoint(x: cp2x, y: cp2y)
    )
}

补充说明

原参考逻辑里,vxs和vys是用来生成平滑过渡的向量,cp1是前一个路径点的外推控制点,cp2是当前路径点的内推控制点,两者配合才能保证曲线在路径点处的连续平滑。参数传反后,曲线的衔接逻辑完全混乱,自然会出现锯齿状的尖锐点。

内容的提问来源于stack exchange,提问作者Jason Cheladyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:33