如何从多边形中选择一组顶点以使失真最小?

时间:2014-02-04 01:07:21

标签: algorithm polygon

我正在使用一个非常慢的渲染器,我需要近似多边形,以便它们在被限制在包含很少像素的屏幕区域时看起来几乎相同。也就是说,我需要一个算法来通过一个多边形并减去/移动一堆顶点,直到最终多边形具有良好的形状保持和顶点使用经济性的组合。

我不知道这些问题是否有正式的名称,但如果有人知道它是什么,它将帮助我开始研究。

我未经测试的计划是删除最少改变多边形区域的顶点,并保护触及边界框的顶点不被移除,直到从原始多边形到建议的近似区域的区域差异超出我指定的容差

这只会做一次,而不是实时。

还有其他想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

你正在略微偏离地思考这个问题。如果您的目标是减少失真最小的顶点数量,则应根据定义形状的相同顶点定义失真。这里有一个非常简单的解决方案,我认为它可以解决您的问题:

  1. 计算相邻顶点之间的距离
  2. 选择顶点之间的公差,在顶点之下将顶点分解为单个顶点
  3. 将距离低于截止距离的所有顶点对替换为两者之间的一个顶点。
  4. 重复直到没有顶点被删除。
  5. 由于您的区域最终由顶点放置决定,因此此方法可保留形状并最大限度地减少形状失真。一个缺点是顶点之间的距离可能比多边形区域稍微不那么直观,但两者是成比例的。如果你真的希望,你可以通过顶点去除所导致的区域变化,但这对于可疑的好处imo来说还有很多工作要做。

    如安格斯所述,如果你想直接解决区域变化问题,那实际上并不是很难。原本打算把它作为练习留给读者,但完全可以解决这个问题,尽管你需要在两边都包含顶点。

    1. 假设您正在查看以该顺序连接的顶点窗口[A,B,C,D]。在此示例中,我们确定了合并BC的“费用”。
    2. 计算从A到C的共线性的角度偏移。基本上你只想看两点的​​共线距离。这是|sin(|arctan(B - A)| - |arctan(C - A)|)|管道是绝对值,而差异是差异的感性概念。
    3. 计算有效施加角度变化的总距离,这就是从A到B的欧氏距离乘以从B到C的欧氏距离。
    4. 将术语从2和3相乘以获得第一个学期
    5. 要获得第二个学期,请重复步骤2 - 4将A替换为D,B替换为C,将C替换为B(仅朝相反方向)
    6. 计算所得两个术语的几何平均值。
    7. 步骤6中产生的数字表示全图减去几个常数。

答案 1 :(得分:1)

我首先尝试了自己的计划:保护触摸边界框的顶点,然后按照更改结果区域的顺序删除其余部分,直到找不到要删除的顶点,使新的多边形区域保持不变原始的X%。这是X = 5%的结果:

enter image description here

当用户缩小到目前为止,这些形状对我来说足够合适。我没有尝试过任何其他建议。节省的费用非常惊人,有时从80-100个顶点下降到4或5个。