【问题标题】:How do I remove redundant vertices from list如何从列表中删除多余的顶点
【发布时间】:2011-06-06 03:30:34
【问题描述】:

我有顶点列表,即List<Point>,其中包含以下正方形点: (0,0), (1,0), (2,0), (3,0), (4,0), (4,1), (4,2), (4,3), (4,4), (3,4), (2,4), (1,4), (0,4), (0,3), (0,2), (0,1), (0,0)

要画一个正方形,我只需要四个点 (0,0), (0,4), (4,4), (4,0),我如何从列表中删除多余的(使直线)点?

它并不总是方形的,如果它们形成直线,基本上我想减少点的数量。例如 (0,0), (0,1), (0,2), (0,3), (0,4) 使直线而不是绘制所有四个点它会很快从点画一条线(0,0), (0,4)。

【问题讨论】:

  • 还有其他限制吗?你总是形成一个正方形吗?它总是长度为 4 吗?等等等等。或者真的,问题是你可以有任意大小的任意形状吗?
  • 正方形是否总是与 X 和 Y 轴对齐?
  • @Yuriy 这不是家庭作业,这是我自己的业余爱好项目
  • @Oli 我已经用其他信息更新了这个问题,它会帮助你回答。它可以是任意点数的任意形状
  • @Prashant:形成的线总是与 x 和 y 轴平行吗?

标签: c# list filter point


【解决方案1】:

一次查看三个连续的点(我们称它们为p0p1p2)。如果p2 = p0 + k(p1 - p0) 其中k 是任意实数,则这三个点是共线的(形成一条线)。我们可以用联立方程来表达上述条件:

(x2 - x0) = k(x1 - x0)
(y2 - y0) = k(y1 - y0)

理论上,你需要做的就是依次取每组三个点。计算x分量和y分量的k的值;如果它们相同,那么这些线是共线的,所以删除p1

实际上,由于定点或浮点的限制,这在一般情况下变得更加棘手。一旦它们的坐标被量化,应该共线的点可能不会完全共线。因此,在进行比较时,您可能需要考虑一些误差范围。

【讨论】:

  • 如果您认为由三个共线点形成的三角形的面积为零,则可能可以避免误差处理。如果列表中有重复的点,您也可能会遇到问题。
  • @James:不幸的是,如果共线点由于量化而变得非共线,它们将形成一个面积非零的三角形......
【解决方案2】:

自动执行此操作的一种方法是获取包含 minX、maxX、minY 和 maxY 组合的点(这是最分散的坐标,并假设数组中的其他点都在矩形范围内)。

如果这不能回答您想到的问题,您可能需要提供更多详细信息和限制条件。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2016-07-23
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2018-10-28
    • 2018-01-02
    相关资源
    最近更新 更多