ios - 如何快速找到 QuadCurve 和 Line UIBezierPaths 之间的交点(CGPoint)?
问题描述
我在自定义视图类中使用 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
对于任意线,建立线参数表示和曲线的方程组,并求解该系统
推荐阅读
- gnuplot - Gnuplot:增加填充样式图案的线宽
- python - 自写的 os.walk-alike 比 os.walk 本身慢得多 - 为什么?
- android - 使用嵌套滚动视图问题的响应式设计
- python - 如何从 Python 中的给定时间范围计算可用时间的效率?
- angular - 我如何以角度同时发出http请求?
- reactjs - React 路由器总是在嵌套组件中渲染第一个路由
- r - 在ggplot中向条形图添加图例
- c# - 在 wwroot 中上传照片并且不加载它们的 URL
- python-3.x - 仅从 Selenium + Python 中的元素 XPath 获取 href 元素
- python - if 语句运行代码,尽管它是假的