如何检测物体是否位于两点之间

时间:2013-05-27 22:42:13

标签: math geometry vertex

目前我正在研究最小走廊长度算法,部分设置涉及提出问题中所有相邻点的列表。目前我有两个数组:一个用x坐标上的相邻点排序,另一个列表用y坐标上的点。此外,我通过简单地查看给定两个列表的附近点来找到邻接点,如果点具有相同的y(在列表中按x相邻排序),则它们位于同一行上。类似地,如果它们具有相同的x(在y列表上),则位于同一行上。

例如,假设我们有以下房间:

picture

然后列出x相邻点将按以下顺序排列:{v1,v2,v3,v4,v5,... v21,v22}(它们保持与标记的顺序相同) 此外,具有y相邻点的列表将是:{v22,v16,v14,v9,v4,v13,v8,v3,v21,... v5,v1}(基本上是y = x上的图形的反映)

如上所述,我通过查看列表中的附近点找到相邻点。这适用于大多数点,但是对于以下边缘情况它会失败:

enter image description here

由于x相邻列表将具有{v1,v2,... v6,v7 ... v11,v12},我的算法将检测v6和v7作为相邻点。 怎么能检测到这两点之间有空间?请注意,我有一组矩形和顶点上的点也可供我使用。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

我建议放弃基于位置的方法,因为无法确定最后一个示例中的v6和v7是否仅基于其位置而相邻(即连接)。相反,创建一个graph,指示哪些点与哪些其他点连接:点将是图形的顶点,并在相邻/连接的每对顶点之间添加边。

要构建图形,您可以尝试这种算法(就在我的脑海中):

  1. 创建具有给定顶点且无边缘的图形
  2. 按顶点(点)对x坐标进行分组。创建一个顶点到组的映射,或者以其他方式查找给定顶点所在的组。
  3. 对于每个组,使用该组中的顶点创建disjoint set data structure
  4. 遍历矩形的所有垂直边,并且对于每条边,在与该边的两端的两个顶点对应的子集上执行并集。
  5. 遍历组,并为每个组迭代其子集。对于每个子集,首先按y坐标对该子集中的顶点进行排序,然后在连续顶点对之间向图中添加边。
  6. 然后重复步骤2-5,切换x和y坐标(并使用水平边缘而不是垂直边缘)。

    当然,这依赖于所有边(线)都是水平或垂直的假设。