【发布时间】:2017-12-12 23:41:28
【问题描述】:
This question 和this question 都展示了如何在特定参数化值 0 ≤ t ≤ 1 处沿曲线分割三次贝塞尔曲线,由两个新段组成原始曲线形状。我需要在我知道 坐标 的曲线上的一点上分割我的贝塞尔曲线,但不是该点的参数化值 t。
以 Adobe Illustrator 为例,用户可以在其中单击曲线将一个点添加到路径中,而不会影响路径的形状。
假设我find the point on the curve 最接近用户点击的位置,我该如何计算控制点?给定曲线上的一个点,是否有分割贝塞尔曲线的公式?
或者(不太理想),给定曲线上的一个点,有没有办法确定对应于该点的参数化值 t(除了在二分搜索中使用 De Casteljau 算法) ?
我的 Bézier 曲线恰好只是二维的,但一个很好的答案将包括应用于任意维度所需的向量数学。
【问题讨论】:
-
IIRC 和 Bezier curve can be represented as a matrix 插入参数值并获取坐标,您可以(理论上)计算逆矩阵并使用它,也许。
-
找到曲线上最近的点假定确定 t 值。
-
准确找到最近的点并不是那么简单,因为它需要求解一个二维的 6 阶多项式。但是您也可以在屏幕空间中执行此操作。绘制曲线时,将相应的 t 值绘制到单独的缓冲区中。然后,您只需要进行屏幕空间最近点搜索,即可立即知道参数。顺便说一句,对参数的二分搜索也不起作用,因为三次曲线中的坐标不是单调的。
-
@NicoSchertler 我怀疑二进制搜索会失败,but I had to try。对。很多地方都不完美。在我的情况下,其他人(网络浏览器 SVG)正在绘制曲线,所以我必须自己绘制它以找到最接近的。麻烦的是,SVG 坐标并不总是像素,所以我必须仔细选择我的行进尺寸以平衡性能和精度。感谢您的输入。好消息:一旦我使用这种方法找到了位置,我也将使用 t 值进行拆分。
-
我建议你阅读 Pomax 关于贝塞尔曲线的综合书籍,可能交叉点和求根会帮助你获得四次曲线:pomax.github.io/bezierinfo/#intersections。但是,我认为使用 de Casteljau 和二分搜索可能会更好,它适用于任何程度的贝塞尔曲线。
标签: math geometry computational-geometry bezier cubic-bezier