【问题标题】:Is a point inside or outside a polygon which is on the surface of a globe是位于地球表面上的多边形内部或外部的点
【发布时间】:2011-03-05 06:29:52
【问题描述】:

如何确定一个点是位于地球表面的多边形内部还是外部?

多边形的内部可以通过右手定则确定,即。当你在多边形周围走动时,多边形的内部在你的右手边。

多边形可能

  1. 环绕任一极
  2. 跨越180经度
  3. 覆盖全球 50% 以上的地区

由于地球是一个球体,因此正常的光线交叉算法无法正常工作。

【问题讨论】:

  • 你的问题不是很清楚:多边形不能弯曲(根据定义),所以你问的是如何确定一个点是否在球体的表面上?这实际上很简单:如果到球体中心的距离 == 球体的半径,它就在表面上。
  • 我相信他的意思是如果你在球体上取一系列点并在它们之间构建一个封闭的形状。关于如何将多边形点连接到边缘的细节似乎模棱两可(您可以直接连接它们然后投影到球体上,也许吧?)
  • 正确,我的世界中的多边形是球体上的一系列点,我在它们之间构造了一个封闭的形状
  • @Gray,其实我不同意。我可以想到许多现实世界的应用程序(初学者只需想到 google earth)
  • @Akusete 关于如何将多边形点连接到边缘的细节似乎模棱两可 - 不,显然有一种最合理的方法。那就是沿着连接两点的球体表面采取最短的路径。这条路碰巧也是一个大圆弧。

标签: java math geometry geocoding


【解决方案1】:

事实上,普通光线追踪和缠绕规则方法在球体表面上工作得很好,只需稍作调整。

在球体的表面上,“直线”是一个大圆,距离以角度单位而不是米或英寸来衡量。要从球体表面上的任意点绘制射线,只需通过该任意点和球体表面上的任何其他点形成一个大圆。为了保持数学清晰,请选择远离您正在测试的位置的点的第二个点 pi/2。将通常的奇偶规则应用于大圆和测试多边形。

缠绕规则也直接从平面中的直线转换为球体上的大圆(段)。

您现在需要的只是基本球面几何操作的 Java 实现。在这方面我没有任何建议,但我想互联网会有所帮助。数学从Mathworld开始。

另一种方法是将您的点和多边形从球体表面投影到平面上——这就是地图投影所做的——内部的拓扑关系不会受到这种变换的影响。

哦,如果你的多边形描述了一个大圆,你必须决定该怎么做

【讨论】:

  • 如果你的多边形描述了一个大圆,你不需要做任何决定。还有一个内部和一个外部。
【解决方案2】:

使用平面而不是射线。由两点定义的球体表面上的“线”是一个大圆(圆心为球心的圆)的弧,也包含在包含这两个点和球心的平面中.

测试该点是“大于”还是“小于”“多边形”每条边的对应平面,以确定它位于“线”的哪一侧。

【讨论】:

  • 谢谢,我了解了基本理论。您知道执行此操作的 Java api 吗?或者我可以在哪里找到算法?
  • NASA 为地理空间应用程序提供了一个名为 WorldWind 的开源 Java SDK。它可能对您的需要有点过分,但它可能会为您的应用程序提供更多想法。 worldwind.arc.nasa.gov/java
  • 我会像解决数学问题一样解决它。从平面上的三个点找到一个平面的公式,将你的点代入公式,看看它在平面的哪一侧。起泡,冲洗,重复。我会使用 xyz 坐标,而不是柱面/球面坐标系,因为这样平面更简单。由于我不熟悉您的光线交叉算法,因此我不知道如何使这种方法适应它,但我怀疑它是可行的。
猜你喜欢
  • 2013-12-19
  • 2020-05-30
  • 1970-01-01
  • 2017-10-09
  • 2018-09-22
  • 2014-06-16
  • 2016-11-06
  • 1970-01-01
相关资源
最近更新 更多