ios - 如何在 swift 中找到 QuadCurve 和 Line UIBezierPaths 之间的交点(CGPoint)?

标签 ios swift intersection uibezierpath bezier

我在自定义 View 类中使用 UIBezierPath 绘制了 QuadCurve 和 Line。我怎样才能得到它们的交点作为CGPoint?

Bezier Paths

对于四曲线:

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/

相关文章:

ios - 从 NSDate 中减去分钟数

ios - Swift:URLSession.shared.downloadTask 仅在模拟器中工作

ios - Swift:无法使用类型为 'init' 的参数列表调用 '($t3, NSString)'

ios - Swift - 如何在表格 View 单元格中显示视频的缩略图捕获?

python - 初学者python设置交集错误

ios - 当我拖动 UIImageView 时,在拖动过程中想要与同一 View 上显示的其他 imageView 进行比较

ios - 将数据从一个 TableView 传递到另一个 TableView

ios - 如何显示过滤后的对象数组的计数

java - 两个单链表的非破坏性递归相交

Python-matplotlib : find intersection of lineplots