Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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_Search_Data Structures_Computational Geometry_Boost Geometry - Fatal编程技术网

Algorithm 从椭圆到静态多边形集的距离

Algorithm 从椭圆到静态多边形集的距离,algorithm,search,data-structures,computational-geometry,boost-geometry,Algorithm,Search,Data Structures,Computational Geometry,Boost Geometry,我有一组静态的简单多边形(它们可能是非凸的,但不是自交的)和大量的查询椭圆。假设这一切都是在2D中完成的。我需要找到每个椭圆和离椭圆最近的多边形之间的距离。距离定义为椭圆和多边形上任意两点之间的短距离。如果椭圆与多边形相交,那么我们可以说距离为0或指定一些负值 蛮力方法只需计算每个椭圆和每个多边形之间的距离,并返回O(mn)时间内的最小距离,其中m是多边形数,n是每个多边形的平均顶点数。我想在这里减少m项,因为我认为我可以通过一些空间分析剔除考虑的多边形数量 我考虑了一些方法,包括Voronoi

我有一组静态的简单多边形(它们可能是非凸的,但不是自交的)和大量的查询椭圆。假设这一切都是在2D中完成的。我需要找到每个椭圆和离椭圆最近的多边形之间的距离。距离定义为椭圆和多边形上任意两点之间的短距离。如果椭圆与多边形相交,那么我们可以说距离为0或指定一些负值

蛮力方法只需计算每个椭圆和每个多边形之间的距离,并返回O(mn)时间内的最小距离,其中m是多边形数,n是每个多边形的平均顶点数。我想在这里减少m项,因为我认为我可以通过一些空间分析剔除考虑的多边形数量


我考虑了一些方法,包括Voronoi图、R树和kd树。然而,其中大多数似乎都涉及点,我不确定如何将它们扩展到多边形。我认为最有希望的方法是计算每个多边形和椭圆的边界框,并使用R-树查找附近的一组多边形。然而,我不太清楚找到这组多边形的最佳方法。或者我忽略了一个更好的方法。

使用边界框或磁盘可以减少计算椭圆/多边形到O(1)的距离的工作量。它允许你获得真实距离的上下限

假设您使用磁盘,并将椭圆括在磁盘中。您将需要执行修改后的最近邻搜索,该搜索枚举磁盘,以使它们到查询磁盘的距离下限小于迄今为止找到的最佳上限

这可以通过在磁盘中心构建k-D树(D=2)来加速。您可以使用其根子树中最大和最小磁盘的半径来增强k-D树中的每个节点。在搜索过程中,您将使用此信息计算边界,而不知道磁盘的确切半径,但在树中越深入,您就越了解它们

执行一次搜索以获得距离的最紧上界,然后执行第二次搜索以枚举下界小于最紧上界的所有磁盘。这将减少要考虑的磁盘数量


您还可以使用边界框,并将框的最小/最大宽度/高度存储在树节点中。

如何表示椭圆?TTBOMK没有库功能。请确认椭圆具有任意方向和大小。是的,椭圆具有任意方向和大小。我现在用一个点和两个距离(半长轴和半短轴)表示它们,但如果需要,我愿意改变表示方式。更正:我指的是两个向量,而不是两个距离,对不起。可能不是最清楚的解释,说起来容易做起来难,但我非常确定修改后的k-D树方法可以工作,只要多边形足够稀疏。其他加速2D范围搜索的设备可能也能做到。我想我理解这种方法,我知道这将如何加速搜索。我考虑的一个例子是,当我得到一个敌对多边形时,这个多边形非常接近椭圆,但是距离的上限要远得多。但是,我认为我可以通过计算到多边形的真实距离来缓解这种情况,从而获得更紧密的距离界限。但是,是的,我想我现在将尝试在boost中使用rtree实现,并查看它的工作情况。