【问题标题】:Determine if point is in set of coordinates in java确定点是否在java中的坐标集中
【发布时间】:2016-07-30 15:33:01
【问题描述】:

我已经搜索了这个问题的答案,但我似乎找不到解决方案。我需要的是我有一组坐标(开始时长度未知),我需要确定一个点是否位于由该坐标确定的多边形内。但是,我不能使用AWT(我最初认为我可以),因为坐标可以在美国的任何地方进行。

我想我需要使用for-loop,以及一系列less thangreater than 检查。我是在正确的道路上,还是有一个我没有想到的更简单的解决方案?任何帮助将不胜感激!

编辑:这是我正在使用的数据示例:

49.006452278468664, 115.10363050431958
48.993314385809654, 115.04009921106841
49.03510754434096, 115.02009771650923
49.04825271759021, 115.08366905978859

【问题讨论】:

  • 坐标如何确定多边形?我们是在谈论凸包还是坐标与多边形边界的顺序相同?
  • 请参考凸包问题!
  • 我正在从 KMZ 文件中提取数据,据我所知,它们是按顺序排列的(虽然文件中有很多点,所以我没有全部检查)。跨度>
  • 多边形是凸的吗?
  • 不一定。我从spc.noaa.gov outlooks 获取数据,所以这真的取决于预测者绘制的内容。

标签: java gis


【解决方案1】:

Eric Haines 写了一篇很棒的文章:http://erich.realtimerendering.com/ptinpoly/

有几种方法可供您使用,Jordan 曲线定理相当不错,但如果您的数据创建了一个甜甜圈类型的多边形并且您的点位于中间,则会出现一些问题。

从本质上讲,如果对于从该点发出的任何射线,该点与多边形边缘的交叉次数为奇数,则该点位于多边形内

您还可以使用角度求和测试,虽然速度很慢,但它是测试点是否在多边形内的可靠方法。

将每条边的端点在该点形成的有符号角度相加。如果总和接近于零,则该点在外部;如果没有,它在里面(图2)

第三种方法是三角形测试,如果你的多边形不是太尖(我怀疑它可能是),它会很好用:

多边形被视为从一个顶点发出的三角形的扇形,并通过计算每个三角形的重心坐标来测试该点。

如果您可以检查形状是否为凹形,还有其他方法可供您使用,我建议您阅读这篇文章,因为它讨论了比此处列出的更多方法来解决您的问题。

【讨论】:

    【解决方案2】:

    维基百科writes:

    确定该点是在简单多边形内部还是外部的一种简单方法是测试从该点开始沿任意固定方向行进的射线与多边形边缘相交的次数。如果该点位于多边形的外部,则射线将与其边缘相交偶数次。如果该点位于多边形内部,则它将与边缘相交奇数次。不幸的是,如果该点位于多边形的边缘,则此方法将不起作用。

    为简单起见,水平投射光线可能最容易,因此可以通过符号变化来识别穿过光线的边缘:

    boolean inside(Point p, Point[] polygon) {
        int intersections = 0;
        Point prev = polygon[polygon.length - 1];
        for (Point next : polygon) {
            if ((prev.y <= p.y && p.y < next.y) || (prev.y >= p.y && p.y > next.y)) {
                double dy = next.y - prev.y;
                double dx = next.x - prev.x;
                double x = (p.y - prev.y) / dy * dx + prev.x;
                if (x > p.x) {
                    intersections++;
                }
            }
            prev = next;
        }
        return intersections % 2 == 1;
    }
    

    【讨论】:

    • 所以我需要水平和垂直投射它还是只需要做一个或另一个?
    • 所有方向都应该给出相同的结果。
    • 好的,我想我现在记得它背后的数学理论了!谢谢!我们只向一个方向投射,对吗? (只喜欢右边?)
    • 在你发布的代码中,当你有sgn时,你的意思是sin吗?
    • 我用 signum 函数尝试了这段代码,不幸的是它似乎不适用于我的情况。确定点位置不准确
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多