【问题标题】:Determine if square cell is inside polygon确定方形单元格是否在多边形内
【发布时间】:2016-07-21 00:06:16
【问题描述】:

例如,我希望多边形#14 内部或部分内部的网格单元(正方形)与#14 相关联。是否有一种算法可以有效地计算正方形是否在多边形内?

我有构成多边形的边的坐标。

【问题讨论】:

  • 关于多边形的已知信息,如果有的话?它总是凸的吗?或者它可以是任意的? (Voronoi 细胞有没有机会?)
  • 是的,它是一个 Voronoi 细胞。
  • Voronoi 是聚类过程的结果吗?更具体地说,您是否有聚类中心的坐标和相似度测量?
  • 不,它只是从画布上的随机点生成的。 Here 是我正在使用的实现。

标签: geometry polygon voronoi point-in-polygon


【解决方案1】:

如果我猜对了,这是 JavaScript 中Fortune's algorithm 的实现,它采用一组二维点(称为sites)并返回一个结构,其中包含为这些点计算的Voronoi diagram 的数据.它在名为cells 的列表中返回多边形。它似乎使用Euclidean distance 作为度量。如果这是真的,我们知道多边形总是凸的(参见Voronoi wiki page 中的正式定义部分)。

现在,这些是解决这个问题的选项(很难简单):

1.多边形剪裁

  1. 为正方形形成一个多边形。
  2. Find its intersection 包含所有单元格。
  3. Calculate area 这个路口。
  4. 找到最大的交叉点。

2- 多边形中的点

您也可以简单地找到正方形中心位于其中的单元格。 Ray casting 是一种强大的 PIP 算法。虽然有一种更简单的凸多边形方法(请参阅凸多边形部分 here)。

3.点间距离

如果您知道与每个cell 关联的site,那么您只需要计算正方形中心与所有sites 之间的距离。无论您使用什么 distance measurement 来计算 Voronoi,正方形的中心点位于 cell 内,它与 site 相关联的距离是最小的,因为这实际上是在 Voronoi 图中划分平面的想法。


例外情况:

  • 第一种方法计算量大,但最准确。在大多数情况下,第二个和第三个选项都可以正常工作,但也有一些他们无法正确决定的例外情况:

  • 第二个和第三个非常相似,但 PIP 的缺点是点位于多边形边缘的情况,这会花费您更多的开销来检测。

【讨论】:

  • 谢谢!我最终实现了光线投射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2019-04-26
相关资源
最近更新 更多