检查 2d 点位于由点矢量定义的轮廓的哪一侧
Checking 2d point is on which side of contour defined by a vector of points
我有一个由点向量定义的轮廓,即我有一个向量 (x_i ,y_i).
现在给定任意点 (a,b) 是否有快速的方法来确定 (a,b) 是否与原点 (0,0) 位于同一侧?
定义轮廓的向量是一个大约有 7000 个点的向量。因此,逐点确定可能非常缓慢。如果有人能指点一下,那就太好了。
(我正在使用 Visual C++ 进行计算)
提前致谢。
我知道预处理是允许的(否则你无法避免"point by point"过程)。
一个简单的方法是通过扫描多段线将其分解成单调的部分,即顶点通过增加或减少出现x
。这需要线性时间。
然后当你想将一个点与折线进行比较时,将它独立地与每个单调部分进行比较,并通过二分搜索找到它所面临的 x
区间。对于长度为 m
的部分,这需要 Log m
次操作。当你知道间隔时,你可以立即分辨出你躺在那部分的哪一侧。
对所有部分重复并计算 "below" 的数量,其奇偶性给出答案。
对于长度为 m
的 s
个部分(几何平均数),此过程需要时间 s Log m
。它不是最坏情况下的最优但很简单并且在大多数情况下表现得非常体面。
我有一个由点向量定义的轮廓,即我有一个向量 (x_i ,y_i).
现在给定任意点 (a,b) 是否有快速的方法来确定 (a,b) 是否与原点 (0,0) 位于同一侧?
定义轮廓的向量是一个大约有 7000 个点的向量。因此,逐点确定可能非常缓慢。如果有人能指点一下,那就太好了。
(我正在使用 Visual C++ 进行计算)
提前致谢。
我知道预处理是允许的(否则你无法避免"point by point"过程)。
一个简单的方法是通过扫描多段线将其分解成单调的部分,即顶点通过增加或减少出现x
。这需要线性时间。
然后当你想将一个点与折线进行比较时,将它独立地与每个单调部分进行比较,并通过二分搜索找到它所面临的 x
区间。对于长度为 m
的部分,这需要 Log m
次操作。当你知道间隔时,你可以立即分辨出你躺在那部分的哪一侧。
对所有部分重复并计算 "below" 的数量,其奇偶性给出答案。
对于长度为 m
的 s
个部分(几何平均数),此过程需要时间 s Log m
。它不是最坏情况下的最优但很简单并且在大多数情况下表现得非常体面。