给定直线和二次贝塞尔曲线的点,如何计算它们的最近点?

在此输入图像描述

===============>>#1 票数:7

INRIA有一篇关于这个问题的科学论文: 计算两条Bézier曲线之间的最小距离PDF

===============>>#2 票数:6

我曾经写过一个工具来完成类似的任务。 贝塞尔样条通常是参数三次多项式。 要计算立方体段和直线之间距离的平方,这只是两个多项式函数之间距离的平方,它本身只是另一个多项式函数! 请注意,我说距离的平方,而不是平方根。

基本上,对于立方体片段上的任何点,可以计算从该点到该线的距离的平方。 这将是一个6阶多项式。 我们可以最小化距离的平方吗? 是。 最小值必须发生在该多项式的导数为零的地方。 因此,区分,得到五阶多项式。 使用您最喜欢的根查找工具,以数字方式生成所有根。 詹金斯和特劳布,无论如何。 从该组根中选择正确的解决方案,排除任何复杂的解决方案,并且只有当它位于相关的立方体段内时才选择解决方案。 确保排除与距离的局部最大值对应的点。

所有这些都可以有效地完成,并且除了多项式根查找器之外不需要使用迭代优化器,因此不需要使用需要起始值的优化工具,仅在该起始值附近找到解决方案。

例如,在3-d图中我显示了由3-d(红色)中的一组点生成的曲线,然后我采取了另一组位于外面的圆,我计算了内部的最近点每条曲线,向下绘制一条直线到该曲线。 这些最小距离点由上面概述的方案产生。

在此输入图像描述

===============>>#3 票数:1

1.简单的坏方法 - 通过迭代从第一条曲线逐点进行,逐点从第二条曲线得到最小值2.确定曲线间距离的数学函数和该函数的计算限值,如:

| Fcur1(t)的-Fcur2(T)| - > 0

Fs是矢量。

我认为我们可以计算出它的导数来确定极值并获得最近和最近点

我想到这一段时间后,并发布完整的回复。

===============>>#4 票数:1

根据标准分析制定您的问题:您有一个最小化(距离)的数量,因此您为此数量制定一个等式并找到一阶导数为零的点。 使用曲线的参数p单个参数进行参数化,该参数为0表示第一个点,1表示最后一个点。

在线的情况下,方程非常简单:从样条方程中获取x / y坐标,并通过矢量方程计算到给定线的距离(标量乘以线的法线)。

在曲线的情况下,分析解决方案可能变得非常复杂。 你可能想要使用数值最小化技术,如Nelder-Mead,或者,因为你有一维连续问题,简单的二分法。

===============>>#5 票数:1 已采纳

我只是想给你一些提示,对于QBCurve //段:为了获得足够快的计算,我认为你应该首先考虑为你的算法使用一种“边界框”。 假设P0是QB曲线的第一个点,P2是第二个点,P1是控制点,P3P4是段然后:

  1. 计算从P0,P1,P2到P3P4的距离
  2. 如果P0或P2是最近点 - >这是P3P4曲线的最近点。 结束:=)。
  3. 如果P1是最近点,而Pi(i = 0或1)是第二个最近点,则PiPC和P3P4之间的距离是您寻找的距离的估计值, 可能足够精确,具体取决于您的需要。
  4. 如果你需要更精确:计算P1',这是QBcurve上离P1最近的点:你发现它应用了B = = 0的BQC公式。 - >从PiP1'到P3P4的距离是更准确的估计 - 但更昂贵 - 。
  5. 注意,如果P1P1'定义的线与P3P4相交,则P1'是距离P3P4最近的QBC点。
  6. 如果P1P1'不与P3P4相交,那么你运气不好,你必须努力...

现在,如果(和何时)你需要精确度:

考虑对曲线参数使用分而治之算法:哪个离P3P4最近? P0P1'或P1'P2 ??? 如果它是P0P1' - > t介于0和0.5之间,那么计算Pm为t = 0.25。 现在哪个离P3P4最近? P0Pm或PmP1'?? 如果它是PmP1' - >计算Pm2为t = 0.25 + 0.125 = 0.375那么哪个最近? PmPm2或Pm2P1'??? 您将立即获得准确的解决方案,例如6次迭代,您的t精度为0.004! 当两点之间的距离变得低于给定值时,您可能会停止搜索。 (并且两个参数没有区别,因为对于参数的一点变化,点可能很远)实际上该算法的原理是每次越来越精确地近似曲线。

对于曲线/曲线情况,我首先将它们“装箱”以避免无用的计算,因此首先使用分段/分段计算,然后(可能)分段/曲线计算,并且仅在需要的曲线/曲线计算时使用。

对于曲线/曲线,划分和征服也很有效,但你可能会弄清楚。 :=)

希望你能找到你的速度/准确性的良好平衡:=)

编辑:想想我发现一般情况下一个很好的解决方案:-)你应该迭代每个BQC的(内部)边界三角形所以我们有三角形T1,点A,B,C有't'参数tA,tB,tC 。 和三角形T2,点D,E,F,具有t参数tD,tE,tF。 最初我们有tA = 0 tB = 0.5 tC = 1.0和T2 tD = 0相同,tE = 0.5,tF = 1.0想法是递归调用一个过程,将T1和/或T2分成更小的矩形直到我们没问题精度达到了。 第一步是计算T1与T2之间的距离,跟踪每个三角形上最近的段。 第一个“技巧”:如果在T1上该段是AC,则在T1上停止递归,曲线1上的最近点是A或C.如果在T2上最近的段是DF,则在T2上停止递归,最近的点在曲线2是D或F.如果我们停止 - >返回距离= min(AD,AF,CD,CF)的递归。 然后,如果我们在T1上具有递归性,并且段AB最接近,则新的T1变为:A'= AB =曲线的点,其中tB =(tA + tC)/ 2 = 0.25,C =旧B.同样适用于T2:应用所需的递归,并在新T1和新T2上调用相同的算法。 当在T1和T2之间找到距离减去在先前T1和T2之间找到的距离时停止算法低于阈值。 该函数可能看起来像ComputeDistance(curveParam1,A,C,shouldSplitCurve1,curveParam2,D,F,shouldSplitCurve2,previousDistance),其中points也存储它们的t参数。

请注意,距离(曲线,线段)只是此算法的一个特例,您应该实现距离(三角形,三角形)和距离(线段,三角形)以使其工作。 玩得开心。

===============>>#6 票数:1

在Bézier曲线和直线的情况下

最接近该线的三个候选者:

  1. Bézier曲线段上与该线平行的位置(如果存在这样的位置),
  2. 曲线段的一端,
  3. 曲线段的另一端。

测试所有三个; 最短距离获胜。

在两条Bézier曲线的情况下

取决于您是否需要精确的分析结果,或者优化的数值结果是否足够好。

分析结果

给定两条Bézier曲线At )和Bs ),您可以推导出它们的局部方向A 't )和B 's )的方程。 A 't )= B 's )的候选点对,即曲线局部平行的( ts )。 我没有检查,但我认为A 't ) - B 's )= 0可以通过分析解决。 如果您的曲线与您在示例中显示的曲线类似,那么应该只有一个解决方案或没有该方程的解决方案,但可能有两个(或者在曲线相同但翻译的情况下无限多个 - 在这种情况下您可以忽略这一点,因为获胜者将始终是曲线段端点之一)。

在类似于上面的曲线情况轮廓的方法中,测试这些点对中的每一个以及曲线段端点。 最短距离获胜。

数值结果

假设两条贝塞尔曲线上的点被定义为At )和Bs )。 你想最小化距离dts )= | At ) - Bs )|。 这是一个简单的双参数的优化问题:找到约束0≤:T≤1和0≤ 小号 ≤1,最大限度地减少d(T,S)st。

由于d = SQRT((xA - xB)²+(yA - yB)²),您也可以最小化函数fts )= [ dts )]²以保存平方根计算。

存在许多用于这种优化问题的现成方法 挑选。


请注意,在上述两种情况下,高于二次贝塞尔曲线的任何高阶数都可以为您提供多个局部最小值,因此需要注意这一点。 从您给出的示例来看,您的曲线看起来没有拐点,因此这种担忧可能不适用于您的情况。

===============>>#7 票数:0

法线匹配的点是它们最近的点。 我的意思是你绘制一条与线正交的线。 如果该线与曲线正交,则交点是最近的点

  ask by Robinicks translate from so

未解决问题?本站智能推荐:

1回复

如何删除Bezier曲线的节点,以便曲线的形状不会改变?

我需要帮助写入算法删除节点Bezier曲线。 使用三次贝塞尔曲线,有两条曲线(P0,P1,P2,P3和Q0,Q1,Q2,Q3),它们有一个公共点(P3 = Q0)。 需要得到单曲线(P0,R1,R2,Q3),重复两个形状。 如何找到控制点R1,R2的坐标? 谢谢!
1回复

你如何计算2条线是朝向还是远离?

鉴于描述2条线的4个点,如何快速计算线A是朝向还是远离线B? 类似地,如何检查线A是朝向还是远离二次贝塞尔曲线B?
4回复

三次贝塞尔曲线上的最近点?

如何沿着最接近平面中任意点P的三次贝塞尔曲线找到点B(t)?
2回复

计算曲线上均匀分布的点

我正在使用此方程式来计算沿二次曲线的一系列点: 可悲的是,这些点分布不均,如下面的虚线所示。 这些点在曲线的中间更密集,并且在边缘附近进一步隔开。 如何计算沿二次贝塞尔曲线的均匀分布的点集? 请注意,我正在使用它来渲染虚线,因此在MATLAB中缓慢的解决方案或其他解决方案将无法
1回复

关于给定点的三次贝塞尔曲线的最近点

我有一个三次贝塞尔曲线定义为A,B,C,D。其中A是起点,B和C是控制点,D是结束。 我理解如何在任何值t找到位置,其中0 <= t <= 1,并且一般来说这个概念,因为它只使用少量调用导致曲线的线性插值函数。 (可以在标题高阶曲线下方的维基百科上轻松显示) 我现在希望在曲
3回复

贝塞尔曲线与曲线内的控制点

请参见下图。 使用每侧的4个贝塞尔曲线创建此路径对象。 当前,当我尝试获取使用三次盆状曲线创建的此路径对象的边界时,我遇到了一个问题。 如您所见,顶部和底部具有远离曲线的控制点,这使边界完全不准确。 所以我的问题是,是否有可能像图像中那样将曲线上或曲线上的所有控制点都制作成拼图玩具
2回复

n阶Bezier曲线?

我已经设法实现了二次和三次Bezier曲线。因为我们有一个公式,所以非常简单。 现在我想用泛化表示一个n阶贝塞尔曲线: 哪里 和 我正在使用位图库来渲染输出,所以这是我的代码: 这是要渲染的点集: 这是输出: 红色曲线是立方贝塞尔曲线。 蓝色的
2回复

在多个点处拆分三次贝塞尔曲线

我正在编写一种算法,将三次贝塞尔曲线分成多条曲线(最多4条)。 对于我想从头开始分割的每个点,我都有t值。 我也有一个算法用于分割曲线一次: 我的问题是,是否有一种简单的方法来扩展它以进行多次拆分? 我想在每次分裂之后我想重新计算t值; 我想知道的一件事是简单的算法是否适用于此。
3回复

计算三次贝塞尔曲线的边界框

我试图找到一个算法来计算给定的三次贝塞尔曲线的边界框。 曲线在3D空间中。 除了曲线上的采样点和计算这些点的边界框之外,是否有一种数学方法可以做到这一点?
1回复

如何链接曲线

首先,让我明确地说,我对编程了解不多。 所以在我解决了这个问题之后,感谢您阅读我的问题。 因此,我目前想要放入我的小C#程序中的内容如下: 从pA到pX画一条线 从pX到pY绘制曲线 从pY到pZ绘制曲线 从pZ到pD画一条线 我的问题是以下几点