从样条曲线/曲线生成最小顶点集

时间:2014-04-23 10:09:52

标签: algorithm polygon computational-geometry spline

在我的项目中,我使用样条表示几何。对于物理和渲染,我通过定期对样条进行采样来预处理样条并将它们转换为线和后面的多边形。但是,我想通过忽略已经足够用线表示的样本来减少顶点/线的数量。

搜索时出现短缺,我想知道是否有任何传统技术可以将曲线转换为一组顶点,同时减少产生的错误。

编辑:为了澄清,我想要最终得到的结果是一些顶点/线段,它们最能代表具有最少顶点/线段数量的样条曲线。我不确定如何定义什么"最能代表样条曲线"确实意味着,但目标是尽可能地区分样条和近似之间的差异。

2 个答案:

答案 0 :(得分:4)

可以通过递归细化部分末端之间不在段附近的部分来完成。

如果我们有曲线(样条曲线)C:[0,1]->R^n。比第一近似值是曲线终点S之间的段[C(0), C(1)]。取点C(0.5)并检查它与段S的距离。如果它远远超过我们必须在离散化中采用它,如果不是S是很好的近似值。如果C(0.5)距离较远,则下一个近似值为折线[C(0), C(0.5), C(1)],我们对部分[C(0), C(0.5)][C(0.5), C(1)]进行相同的处理。

如果使用的是阶数> = 3的多项式样条(例如,三次样条),则它可能具有拐点。在这种情况下,一半的曲线点可能会下降到#39;在段上,但曲线周围远离段。在这种情况下,最好再检查一个子部分。

答案 1 :(得分:0)

这完全基于我自己的直觉,所以我不确定它是否与最佳实践一致。我有数学学位,所以希望它不是太远了。我要注意,如果需要经常重新计算样条曲线,所涉及的计算可能会超过不使用尽可能多的顶点而获得的性能增益。

假设顶点在[v(0),v(1),v(2),...,v(n)]之类的数组中,其中每个v(i)类似于(x,y)。通过迭代从v(1)开始到v(n-1)结束的顶点,我们可以将一个点与其邻居进行比较,以便判断是否丢弃它。请注意,我们忽略v(0)和v(n)有两个原因:(我假设)我们不想删除我们的端点,并且v(0)和v(n)也缺少我们的邻居需要以便设置我们的计算。我可以想到这里有几种可能值得考察的可能性,但有一种看起来(在我看来)是最好的答案......

考虑我们决定是否从顶点数组中删除v(i)的情况。我们可以检查v(i)与其邻居之间的笛卡尔距离,并且如果两者都低于某个阈值T则移除该点。例如,如果v(i-1)=(x1,y1)和v(i)=( x2,y2)和v(i + 1)=(x3,y3),然后我们评估sqrt((x2-x1)^2 + (y2-y1)^2))<T && sqrt((x3-x2)^2 + (y3-y2)^2))<T,如果评估返回true,则删除v(i)。

在3维以上,这将变得更加复杂 - 计算将类似,但您需要一种确定点邻居的方法,因为它们可能不会直接位于顶点阵列中检查点的旁边