确定空间区域是否为空

时间:2011-08-10 21:34:06

标签: java lines points space-partitioning

我有一个空间区域,即2个维度,从(0,0)(MAX_X, MAX_Y)

在这个空间区域内,我绘制了一些线条,它们与区域的周边相交,它们可以相互交叉。通过这种方式,这些线在子区域中划分我的空间区域,如果求和,则给出整个空间区域。

在这个空间区域内,有一些点(x,y)。我必须确定

  1. 组成由线
  2. 创建的所有空间子区域的所有顶点的坐标
  3. 如果给定的空间子区域包含或不包含一个或多个点
  4. 我正在尝试用java编写代码,但语言并不重要。我对如何完成这两项任务一无所知。如果有人能给我一个暗示,我真的很感激。

2 个答案:

答案 0 :(得分:0)

这确实是一个数学问题。考虑到这个问题我认为解决方案将非常复杂和/或昂贵(计算方面)。

从一个子区域列表R开始,从一个元素开始:整个区域。接下来,遍历您的行列表。对于每一行,你循环每一个R.如果该行与Region相交,则将它分成两行。网上交叉口检查的帮助应该很容易在网上找到。只需寻找线和凸区之间的交叉点。该算法的问题在于它将具有大约O(n ^ 3)的运行时间。对于交叉点检查,n行的O(n)乘以O(n)的区域乘以O(n)(但是你可能能够显着提高最后一部分的速度,将你降低到O(n ^ 2)端)。

检查哪个区域包含特定点是凸分析的经典问题。应该有可用的算法。我想你想要做的就是循环你的线并检查你的点是否是该线的“左或右”。如果您在第一步中将子区域链接到您的线,这将为您提供O(n)中的相应子区域。

使用更复杂的算法可以更快地解决第一个问题,就像我说的那样,我解释的那个问题可以大大加快。

基本上,如果您想了解有关该主题的更多信息,请参阅凸分析。

但是,如果所有这一切都没有帮助你,那么你可能已经过头了(没有违法行为,你在这里处理真正复杂的数学)。

答案 1 :(得分:0)

这是计算几何的一个相当困难的问题。一种可能的方法是通过原始矩形的平面细分来表示结果区域。细分将由双连接边缘列表(DCEL)表示。这包括一个有向半边的列表,一个区域列表( faces )和一个顶点列表(行的交叉点) 。所有这些数据都完全连接在一起,因此在给定一些其他数据的情况下查找任何数据非常有效。

DCEL将以迭代方式构建,从一个区域开始,该区域是原始矩形并逐行添加一条线。添加一条线意味着通过该线切割当前的DCEL并获得更精细的DCEL。

构建最终DCEL时,它可用于查找和标记包含点的区域。测试点是否在区域中可以有效地完成,因为区域是凸多边形。

关于DCEL的好书是M. de Berg,et.al。:Computational Geometry。您还可以在Web上找到许多资源。您还可以找到实现和各种软件包。