我在自定义 View 类中使用 UIBezierPath 绘制了 QuadCurve 和 Line。我怎样才能得到它们的交点作为CGPoint?
对于四曲线:
let path = UIBezierPath()
path.lineWidth = 3.0
path.move(to: CGPoint(x: 0, y: self.frame.size.height))
path.addQuadCurve(to: CGPoint(x: self.frame.size.width, y: 0), controlPoint: CGPoint(x: self.frame.size.width-self.frame.size.width/3, y: self.frame.size.height))
对于线路:
let path2 = UIBezierPath()
path2.lineWidth = 3.0
path2.move(to: CGPoint(x: 250, y: 0))
path2.addLine(to: CGPoint(x: 250, y: self.frame.size.height))
最佳答案
如果您的线始终是垂直的,则计算非常简单:x 坐标已知,因此您的任务是找到 y 坐标。二次贝塞尔曲线有参数表示:
P(t) = P0*(1-t)^2 + 2*P1*(1-t)*t + P2*t^2 =
t^2 * (P0 - 2*P1 + P2) + t * (-2*P0 + 2*P1) + P0
其中P0、P1、P2
是起点、控制点和终点。
所以你必须解二次方程
t^2 * (P0.X - 2*P1.X + P2.X) + t * (-2*P0.X + 2*P1.X) + (P0.X - LineX) = 0
对于未知的t
,在0..1
范围内获取根,并将t
值应用于Y坐标的类似表达式
Y = P0.Y*(1-t)^2 + 2*P1.Y*(1-t)*t + P2.Y*t^2
对于任意直线,建立直线参数表示和曲线的方程组,并求解该方程组
关于ios - 如何在 swift 中找到 QuadCurve 和 Line UIBezierPaths 之间的交点(CGPoint)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53889467/