如何从列表中删除冗余顶点

时间:2011-01-09 17:15:41

标签: c# list filter point

我有顶点列表,即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)

enter image description here

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

答案 2 :(得分:0)

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

如果这不能回答您的问题,您可能想要提供更多细节和约束。