【问题标题】:Checking 2d point is on which side of contour defined by a vector of points检查 2d 点位于由点向量定义的轮廓的哪一侧
【发布时间】:2017-06-02 20:23:57
【问题描述】:

我有一个由点向量定义的轮廓,即我有一个 (x_i ,y_i) 的向量。

现在给定任何点 (a,b) 是否有一种快速的方法来确定 (a,b) 是否与原点 (0,0) 位于同一侧?

定义轮廓的向量是一个大约 7000 个点的向量。因此,逐点确定可能非常缓慢。如果有人可以指点一下,那就太好了。

(我使用 Visual C++ 进行计算)

提前致谢。

【问题讨论】:

  • 您需要回答多少个问题?你真的测量过标准的线性算法太慢了吗? CPU 在线性阵列扫描方面出奇地好 :)
  • 我正在尝试整合。对于被积函数的每个点,我必须检查它是否在轮廓的正确一侧。发生积分的网格有 100K 点。
  • 你想在那个多边形上积分还是只是积分函数的一个参数?
  • 如果您将不正确一侧的点归零,这不只是在该多边形上积分吗?或者,也许你想在没有那个多边形的情况下集成盒子?
  • 它不是真正的多边形,因为轮廓是光滑的、蜿蜒的,并且有很大的曲率。此外,轮廓可能会不断地从一个集成更改为下一个集成。找出多边形的边界将是一个更难解决的问题。

标签: algorithm vector geometry line contour


【解决方案1】:

我了解允许进行预处理(否则您无法避免“逐点”程序)。

一种简单的方法是扫描折线以将其分解为单调的部分,即通过增加或减少x 来显示顶点。这需要线性时间。

然后,当您想将一个点与折线进行比较时,将其与每个单调部分单独进行比较,并通过二分法搜索找到它所面临的x 区间。对于长度为m 的部分,这需要Log m 操作。知道间隔后,您可以立即分辨出您所在的部分的哪一侧。

对所有部分重复并计算“以下”的数量,其奇偶性给出答案。

此过程需要时间 s Log m 来处理 s 长度为 m 的部分(几何平均值)。它不是最坏情况下的最优方法,但很简单,并且在大多数情况下表现得非常好。

【讨论】:

    猜你喜欢
    • 2018-11-13
    • 2013-03-19
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2018-04-30
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多