Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何简化三次贝塞尔曲线?_C++_Graphics_Bezier - Fatal编程技术网

C++ 如何简化三次贝塞尔曲线?

C++ 如何简化三次贝塞尔曲线?,c++,graphics,bezier,C++,Graphics,Bezier,我有一个三次贝塞尔曲线由许多段组成(左图)。它有一些粗糙的曲率,我需要使它像正确的图像一样平滑。这个问题有点像“降噪”,我如何做到这一点 也有类似的线程,但输入是一组点,并使用最小二乘法在其上拟合贝塞尔曲线,但在我的问题中,输入已经是立方贝塞尔 在上图中,我没有画线段和控制点,但我希望您能理解。您想保持相同数量的线段吗?是否需要保持贝塞尔线段之间的连续性?您是在尝试达到一定数量的分段,还是只是将对象保持在原始曲线的某个公差范围内 现在,我假设您想要减少贝塞尔分段的数量,您需要在分段之间保持G1

我有一个三次贝塞尔曲线由许多段组成(左图)。它有一些粗糙的曲率,我需要使它像正确的图像一样平滑。这个问题有点像“降噪”,我如何做到这一点

也有类似的线程,但输入是一组点,并使用最小二乘法在其上拟合贝塞尔曲线,但在我的问题中,输入已经是立方贝塞尔


在上图中,我没有画线段和控制点,但我希望您能理解。

您想保持相同数量的线段吗?是否需要保持贝塞尔线段之间的连续性?您是在尝试达到一定数量的分段,还是只是将对象保持在原始曲线的某个公差范围内

现在,我假设您想要减少贝塞尔分段的数量,您需要在分段之间保持G1连续性,并且您正在尝试在公差范围内平滑(仅从图像中猜测)

对于顶级算法,您将遍历每一对相邻的曲线,并尝试组合它们。重复此操作,直到两条相邻曲线的组合超出公差范围

如何组合两条相邻的贝塞尔曲线?假设它们是曲线P和Q,因为它们都是立方的,所以它们各有4个CV,P0,P1,P2,P3和Q0,Q1,Q2,Q3。我们还假设P3==Q0。同样,我们会说输出曲线是R,由R0,R1,R2,R3组成

另一个非常重要的步骤是,需要为要简化的较大曲线中的每个贝塞尔曲线段指定t值。所以,段0从0..1开始,段1从1..2开始,段2从2..3开始,以此类推

如果要保持p与其邻居的连续性,以及Q与其邻居的连续性,则不能移动P0或Q3,并且(P1-P0)和(Q2-Q3)形成的切向量必须保持在同一方向。。它们只能按比例缩放

因为R中只有4个CV,所以这两个比例因子是唯一的自由度。我们称之为kp和kq

R0=P0
R1=P0+kp*(P1-P0)
R2=Q3+kq*(Q2-Q3)
R3=Q3

如果两条曲线的节点长度相等,则kp=2和kq=2。

是否要保持相同的分段数?是否需要保持贝塞尔线段之间的连续性?您是在尝试达到一定数量的分段,还是只是将对象保持在原始曲线的某个公差范围内

现在,我假设您想要减少贝塞尔分段的数量,您需要在分段之间保持G1连续性,并且您正在尝试在公差范围内平滑(仅从图像中猜测)

对于顶级算法,您将遍历每一对相邻的曲线,并尝试组合它们。重复此操作,直到两条相邻曲线的组合超出公差范围

如何组合两条相邻的贝塞尔曲线?假设它们是曲线P和Q,因为它们都是立方的,所以它们各有4个CV,P0,P1,P2,P3和Q0,Q1,Q2,Q3。我们还假设P3==Q0。同样,我们会说输出曲线是R,由R0,R1,R2,R3组成

另一个非常重要的步骤是,需要为要简化的较大曲线中的每个贝塞尔曲线段指定t值。所以,段0从0..1开始,段1从1..2开始,段2从2..3开始,以此类推

如果要保持p与其邻居的连续性,以及Q与其邻居的连续性,则不能移动P0或Q3,并且(P1-P0)和(Q2-Q3)形成的切向量必须保持在同一方向。。它们只能按比例缩放

因为R中只有4个CV,所以这两个比例因子是唯一的自由度。我们称之为kp和kq

R0=P0
R1=P0+kp*(P1-P0)
R2=Q3+kq*(Q2-Q3)
R3=Q3

如果两条曲线的结长度相等,则kp=2和kq=2。

我刚才研究过这样做:

一些建议:

迭代移除结 通过删除,您可以

  • 折叠线段以在线段上的某个位置形成新结
  • 拆下绳结,然后测量因拆下而引起的误差
移除后,需要重新计算两侧剩余结的手柄长度,然后测量移除导致的误差(移除成本)。 有关最小二乘切线长度计算的示例,请参见

每次移除的“成本”可以放入最小堆中, 然后,您可以从堆的顶部弹出成本最低的元素(在删除相邻节点后重新评估相邻节点的成本)

这是一些

重新评估曲线 您可以将曲线计算为一个简单的多边形,然后以较低的错误阈值对结果点运行曲线拟合算法

添加此选项,因为一旦您已经具有曲线拟合功能,它的麻烦就会大大减少

这可能不会给出很好的结果,但是对于您的目的来说,它可能已经足够好了


因为您可以使用现有的曲线拟合库,()。

我刚才研究过这样做:

一些建议:

迭代移除结 通过删除,您可以

  • 折叠线段以在线段上的某个位置形成新结
  • 拆下绳结,然后测量因拆下而引起的误差
移除后,需要重新计算两侧剩余结的手柄长度,然后测量移除导致的误差(移除成本)。 有关最小二乘切线长度计算的示例,请参见

每次移除的“成本”可以放入最小堆中, 然后,您可以从堆的顶部弹出成本最低的元素(在删除相邻节点后重新评估相邻节点的成本)

这是一些

重新评估曲线 您可以将曲线计算为一个简单的多边形,然后以较低的错误阈值对结果点运行曲线拟合算法

添加此选项,因为一旦您