Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 并行查找多个最近的光线段交点_Algorithm_Parallel Processing_Geometry_Computational Geometry - Fatal编程技术网

Algorithm 并行查找多个最近的光线段交点

Algorithm 并行查找多个最近的光线段交点,algorithm,parallel-processing,geometry,computational-geometry,Algorithm,Parallel Processing,Geometry,Computational Geometry,我知道如何找到以二维兴趣点(POI)为根的光线是否与给定的二维线段相交,以及如何有效地找到与多个线段的POI相交最近的光线 但是,我有几条(不是太多)射线,它们的根位于许多(我的意思是many)POI和许多(我的意思是many)分段中的每一条,我需要找到与每条射线的分段最接近的POI交点 我的想法是:将光线视为线段,一侧位于相应的POI,另一侧位于正确方向非常远的位置,然后运行以查找所有交点,然后为每个光线输出最接近POI的交点。这应该在O(N logn)中运行,因此有点好 然而,这一部分恰好是

我知道如何找到以二维兴趣点(POI)为根的光线是否与给定的二维线段相交,以及如何有效地找到与多个线段的POI相交最近的光线

但是,我有几条(不是太多)射线,它们的根位于许多(我的意思是many)POI和许多(我的意思是many)分段中的每一条,我需要找到与每条射线的分段最接近的POI交点

我的想法是:将光线视为线段,一侧位于相应的POI,另一侧位于正确方向非常远的位置,然后运行以查找所有交点,然后为每个光线输出最接近POI的交点。这应该在O(N logn)中运行,因此有点好

然而,这一部分恰好是整个系统的瓶颈,我想做得更好一些。特别是,因为确实有很多对象需要排序,所以我想让这个算法并行。不幸的是,扫描线算法似乎本质上是顺序的,若继续使用它,将损害我原本相当并行的系统的整体性能

因此,问题是:对于上述问题的有效并行化,您有什么建议


此外,是否有任何已知的高度并行的交叉点检测算法能够利用并行级别

您可以尝试基于一个或一些其他空间索引的2d数据结构执行算法

以下是想法:

在四叉树的每一片叶子中,存储与该正方形相交的任何线段的引用。首先,分辨率为零,即所有线段都位于边界框节点中,而边界框节点根本没有细分

然后,对于每条光线,查看光线的原点并细分包含它的节点,直到节点仅与一个线段相交。如果细分后节点未与任何线段相交,请跟随光线移动到下一个节点。如果节点与节点内的某个线段相交,则我们已找到第一个交点,并且可以停止沿该光线的搜索。如果光线没有与节点内的线段相交,我们可以从搜索中删除该线段,然后移动到光线相交的下一个节点

通过沿每条射线并行执行搜索,该算法显然可以并行运行。仍然会有共享的四叉树,但是当它被细分时,线程很快就不会争夺访问权

运行时间:

运行时间有点难以分析,因为它取决于分段和光线的二维结构。也许有人能更好地分析运行时间,但以下是我的最佳方案:

如果存在一个小距离d,它小于任何光线到最近的非相交线段的距离,并且小于同一光线上任意两个交点之间的距离,那么我们可以得到一个上界。然后我们可以称r=D/D为问题的“解决方案”,其中D是边界框的维数

运行时间将以
N*r
为界,但这是一个非常粗糙的界,因为它基本上假设每条光线必须沿其整个长度解析为分辨率d

让我们尝试细化这个界限

对于任何光线,考虑光线在其原点和第一交点之间的截面。对于沿该光线部分的任何点,我们可以询问哪个非相交线段距离该点最近。然后,我们可以询问有多少个不同的非相交线段最靠近光线这一部分的某个点。换句话说,若我们用不相交的线段做一个网格,我们会问这段光线会相交多少个单元。如果我们让p是任何光线的这个问题的最大答案,那么我们可以得到一个更好的上界

 N*p*log(r)
通过考虑沿光线搜索时所需的最大分辨率

所以如果p和r是常数,我们有一个线性时间算法

不幸的是,我很确定p,N和r之间存在某种关系,这使得p和r不能保持大致恒定。作为粗略的猜测,我会说
r~sqrt(N)
,这意味着它回到了
nlogn
运行时间

并行化很有趣。如果我们假设C核,我们的搜索运行时间为
N/C*p*log(r)
,但仍然存在划分子树的瓶颈。有
log(r)
级别,每个段必须在最多N个位置划分到该级别,因此需要
N/C*log(r)
时间,这意味着总运行时间为

(N/C)*p*log(r)
这基本上意味着假设C 结论
在我看来,作为一个单核算法,这可能不是很好,但对于具有特殊结构和/或并行化的问题,它可能工作得很好。我不建议尝试实现这个算法,除非你考虑了很多,并且你确信粗糙的边缘可以被平滑,我的分析没有出错。我还建议搜索基于类似概念的已发布算法。

如果不需要数学精确,您可以使用具有相同起点但斜率已捕捉到集合中最接近的离散值的版本来近似光线,从而执行算法

例如,考虑将光线的角度舍入到最接近的程度。将有360个可能的角度值。如果我们考虑180条不同的线,每一条线旋转一度,那么每一条射线将平行于至少一条线。如果我们让我们的一组线的大小为l,我们将有resolut
l*n*log(n)+n*(log(n)+k)
(n/c)*(l*log(n)+k)
(s*n/c)*log(n) +((n+k)/s)*log(n)
((n+k)/sqrt(c))*log(n)
n^1.5 * log(n)