【问题标题】:Generating a minimal set of vertices from a spline/curve从样条/曲线生成一组最小顶点
【发布时间】:2014-04-23 10:09:52
【问题描述】:

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

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

编辑:澄清一下,我想最终得到的结果是一些顶点/线段,它们最能代表具有最少顶点/线段的样条线。我不确定如何定义“最能代表样条曲线”的真正含义,但目标是尽可能难以区分样条曲线和近似值之间的差异。

【问题讨论】:

  • 我所知道的“传统”技术是关于最小化最大距离的优化。
  • 是否有任何限制或其他有用的属性可以提供帮助?例如:如果点可以由一些函数 x(t) 和 y(t) 确定,其中 t 是顶点的索引(所以第一个顶点是 (x(0), y(0)) )它会给我们更多的工作。
  • @Nate,我令人尴尬的低数学技能使我避免尝试用这些术语解释问题,因为我希望它会造成混淆而不是帮助。但是,如果样条是 s(0 -> 1) 并且我采样 s(0.01), s(0.02), s(0.03), ..., s(1) 得到 xy[0], xy[1] , xy[2], ..., xy[100]。 (在这种情况下,xy 是一个 2d 顶点,但我不希望问题在 3d 中是不同的)。然后我想找到一组 s(t0), s(t1), s(t2), ..., s(tn) 从其中线性插值将匹配 s(0 -> 1) 直到指定数量“错误”。

标签: algorithm polygon computational-geometry spline


【解决方案1】:

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

如果我们有曲线(样条)C:[0,1]->R^n。比第一个近似值是曲线端点[C(0), C(1)] 之间的段S。取点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 阶的多项式样条(例如三次样条),则它可能具有拐点。在这种情况下,一半的曲线点可能会“落在”段上,但曲线会绕到远离段的位置。在这种情况下,最好再检查一级子部件。

【讨论】:

  • 嗯,真是聪明。这特别好,因为它不需要我在曲线上采样大量无论如何都会被丢弃的点。
  • 简单又漂亮。算法是标准的,但我找不到描述。我知道我在维基百科上读到过它。
  • 如果您可以使用贝塞尔曲线表示您的样条曲线(这可以从三次样条曲线中实现),那么 hull 属性允许您使用递归细分方法,并且绝对保证近似值,即使存在的拐点。
【解决方案2】:

这完全基于我自己的直觉,所以我不确定它是否完全符合最佳实践。我确实有数学学位,所以希望它不会太远。请注意,如果需要频繁重新计算样条线,所涉及的计算可能会超过不使用尽可能多的顶点所带来的性能提升。

假设顶点在像 [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 维以上的情况下,这将变得更加复杂 - 计算将类似,但您需要一种确定点的邻居的方法,因为它们可能不会直接位于顶点数组中检查点的旁边。

【讨论】:

  • 感谢内特的回答。虽然这会减少顶点的数量,但在曲线由线段很好地表示的情况下,它不会更频繁地这样做——它不会在样条曲线更弯曲的部分保存顶点以保持那里的视觉保真度。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多