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。我刚才研究过这样做: 一些建议: 迭代移除结 通过删除,您可以
- 折叠线段以在线段上的某个位置形成新结
- 拆下绳结,然后测量因拆下而引起的误差
因为您可以使用现有的曲线拟合库,()。我刚才研究过这样做: 一些建议: 迭代移除结 通过删除,您可以
- 折叠线段以在线段上的某个位置形成新结
- 拆下绳结,然后测量因拆下而引起的误差