如何对称地平滑UIBezierPath中的曲线

问题描述 投票:0回答:1

我正在用UIBezierPath在Swift中编写一个自定义组件,而我面临着难以正确找到控制点以在圆周围创建完美路径的困难。请看一下下面的组件:

enter image description here

[请注意,圆圈在蓝色圆圈区域中未完全跟随黄色球,我试图将控制点设置在正确的位置,但它们没有得到很好的结果:

enter image description here

用于描述上述路径的功能部分是这样的:


//private let MAGIC_NUMBER: CGFloat = 0.552284749831
private let MAGIC_NUMBER: CGFloat = 0.5

//...

let secondPointEnd: CGPoint = CGPoint(x: middleLeft.x + ballRadius/2, y: middleLeft.y + ballRadius/2)

path.addCurve(
    to: secondPointEnd,
    controlPoint1: CGPoint(x: firstPointEnd.x, y: secondPointEnd.y - (ballRadius * MAGIC_NUMBER)),
    controlPoint2: CGPoint(x: firstPointEnd.x, y: secondPointEnd.y))

let thirdPointStart: CGPoint = CGPoint(x: secondPointEnd.x + ballRadius/2, y: secondPointEnd.y - ballRadius/2)
path.addCurve(
    to: thirdPointStart,
    controlPoint1: CGPoint(x: thirdPointStart.x, y: secondPointEnd.y),
    controlPoint2: CGPoint(x: thirdPointStart.x, y: secondPointEnd.y - (ballRadius * MAGIC_NUMBER)))

对于完整的源代码(游乐场):https://gist.github.com/ppamorim/feb3318ac30e20a75d9c62e8abdc2efa

我试图用多种配置修复它,但到目前为止我没有成功,我也尝试应用幻数0.552284749831,但它会使情况更糟。我是否缺少一些控制点配置?那里有无效的控制点吗?

你们能帮我找到这个贝塞尔曲线路径的问题吗?

问候,

佩德罗

[@ Bob的帮助下,我得以按照他的描述完成UIBezierPathhttps://gist.github.com/ppamorim/9390708c455a950a65621715ce7b6c82

swift uibezierpath
1个回答
1
投票

我不建议使用贝塞尔曲线渲染圆形钻头。它们距离非常近,但没有发现。矩形(或任何多边形)的圆角近似是很好的近似值,但是对于路径的真实圆形部分,应使用addArc(withCenter:radius:startAngle:endAngle:clockwise:)

如果需要,您可以使用贝塞尔曲线引导进入和退出弧,但是对于圆形部分,请使用弧。例如。参见addArc(withCenter:radius:startAngle:endAngle:clockwise:)

© www.soinside.com 2019 - 2024. All rights reserved.