我已经搜索了这个问题的答案,但我似乎无法找到解决方案。我需要的是我有一组坐标(开头的长度未知),我需要确定一个点是否位于由该坐标确定的多边形内部。但是,我不能使用AWT
(我原先认为我可以),因为坐标可以在美国的任何地方。
我想我需要使用for-loop
,并进行一系列less than
,greater than
检查。我是在正确的道路上,还是有一个我没想到的更简单的解决方案?任何帮助将不胜感激!
编辑:以下是我正在处理的数据示例:
49.006452278468664, 115.10363050431958
48.993314385809654, 115.04009921106841
49.03510754434096, 115.02009771650923
49.04825271759021, 115.08366905978859
答案 0 :(得分:2)
Eric Haines写了一篇很棒的文章:http://erich.realtimerendering.com/ptinpoly/
您可以使用一些方法,Jordan Curve定理相当不错,但如果您的数据创建了圆环型多边形并且您的点位于中间,则存在一些问题。
基本上,它表示一个点在多边形内部,如果对于此点的任何光线,光线与多边形的边缘有奇数交叉
你也可以使用角度求和测试,这个测试非常慢,但是测试点是否在多边形内是一种万无一失的方法。
求和每个边缘端点在该点形成的有符号角度。如果总和接近零,则该点在外;如果没有,它就在里面(图2)
第三种方法是三角测试,如果您的多边形不太尖(我怀疑它可能是这样),它将很好用:
多边形被视为从一个顶点发出的三角形的扇形,并通过计算其重心坐标来测试每个三角形的点。
如果您可以检查形状是否凹陷,您可以使用其他方法,我建议阅读本文,因为它讨论了解决问题的更多方法,而不是此处列出的方法。
答案 1 :(得分:1)
维基百科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;
}