【问题标题】:How to remove colinear points from a list of points?如何从点列表中删除共线点?
【发布时间】:2010-08-19 04:34:23
【问题描述】:

给定一个点列表(A1, A2, A3, ...., AN),每个点Ai都有Ai_x, Ai_y, Ai_z分别表示x, y, z坐标。

假设给定三个点 AONE、ATWO、ATHREE,存在名为 checkColinear 的函数,即如果点 AONE、ATWO 和 ATHREE 共线,​​则 checkColinear(AONE, ATWO, ATHREE) 返回 TRUE。

我正在寻找一种快速的方法来删除列表中包含一些关键点的共线点。

谢谢

【问题讨论】:

  • 没有。它们是不同的。在我提交这个问题之前,我已经先阅读了那篇文章。在这里,我必须删除共线点,而不是简单地向点添加噪声以避免删除共线点。主要原因是我必须获得平滑的轮廓。第一步是去除共线点然后下一步我可以采用贝塞尔平滑方法。谢谢
  • @Anders,请不要尝试 mathoverlow.net。它仅适用于专业数学家。你可以试试 math.stackexchange.com,它适合所有人。 (哎呀,应该改名为professionalmathonly.net...)
  • 在 Tom 的链接中查看 Strilanc 的答案。它也适用于您的用例。

标签: math


【解决方案1】:

天真的方法是检查每组 3 个点,即 O(N^3)。我假设你想要更快的东西。

通过创建斜率数组,您可以做得更好(对于非退化情况,O(N^2*log N))。循环遍历每对点并将斜率存储在数组中(连同 2 个点的数组索引)。按斜率对数组进行排序。然后查看数组 - 例如您可能会从对 (2,3)、(6,7)、(9,4)、(3,5)、(2,5) 中找到斜率为 2.5 的一行中的 5 个条目。点 #2、#3 和 #5 在这里是共线的。

(实现此检查的一种更简单/更快的方法可能是在给定斜率的情况下找到每个候选点的 y 截距,然后以这种方式对候选点进行排序。如果三个或更多点具有相同的 y 截距,它们是共线的。)

我也刚刚找到了这个链接,基本方法相同:http://lists.canonical.org/pipermail/kragen-hacks/2008-March/000482.html

【讨论】:

  • 有一个条件我忘了特别提到,就是所有的点都是有序的。换句话说,通过连接 A1->A2->A3 .. AN,你可以得到一个物体的轮廓。谢谢
  • 对象是凸的吗?另外,如果 A2、A3、A99 共线怎么办?你在乎,还是积分需要是连续的? (如果是这样,那问题就很简单了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2016-02-25
  • 2021-06-14
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多