我在Stackoverflow和其他网站上经历了很多类似的问题,我的解决方案基于这些答案,但我仍然无法让它工作......
我的问题:我想确定某个GPS位置P
是否位于由四个给定的GPS坐标A
所限定的矩形区域内B
,{{1} },C
,D
。
目前我正在计算三角形ABP
,BCP
,CDP
和DAP
的区域。如果这些区域中的任何一个大于零(不要沮丧,数学家),那么点就在我的矩形之外,如here所述。
代码:
private static double triangleArea(Location a, Location b, Location c) {
// (C.x*B.y-B.x*C.y)-(C.x*A.y-A.x*C.y)+(B.x*A.y-A.x*B.y)
double result = (c.getLongitude()*b.getLatitude()-b.getLongitude()*c.getLatitude())-(c.getLongitude()*a.getLatitude()-a.getLongitude()*c.getLatitude())+(b.getLongitude()*a.getLatitude()-a.getLongitude()*b.getLatitude());
return result;
}
public static boolean isInsideSquare(Location a, Location b, Location c, Location d, Location p) {
if (triangleArea(a,b,p)>0 || triangleArea(b,c,p)>0 || triangleArea(c,d,p)>0 || triangleArea(d,a,p)>0) {
return false;
}
return true;
}
但是当我调用此函数时,它总是返回false
。即使使用以下坐标(纬度,经度):
A: (50.884706, 4.714151)
B: (50.884944, 4.716149)
C: (50.884679, 4.716228)
D: (50.884441, 4.714230)
P: (50.884538, 4.714615)
然而,当我在地图上绘制这些点(例如here)时,我可以看到P点位于ABCD内...(见下文)
我已经阅读了一些简单的解决方案,你只需减去点的x,y坐标,但这显然只适用于平行于x轴和y轴的矩形,而我的矩形可以任意方向角。
任何人都可以告诉我我做错了什么或建议更好的解决方案来解决这个问题吗?
非常感谢!
答案 0 :(得分:4)
为每个l i 制作一个等式。等式:
˚F<子> I 子>(P)= 0。
P是一个观点。对于属于l i 的点,等式为真。
所以,我们必须检查一下:
f AB (P)f AB (C)&gt; = 0
f BC (P)f BC (D)&gt; = 0
f CD (P)f CD (A)&gt; = 0
f DA (P)f DA (B)&gt; = 0
不等式不严格,因为如果一个点在边界上,它也属于矩形。如果边界上不需要点,则可以更改严格的点的不等式。但是当你在浮点运算中工作时,选择是无关紧要的。
唯一剩下的就是得到一条线经过两点的等式。这是一个众所周知的线性方程。让我们把它写成AB行和P点:
f AB (P)≡ (x A -x B )(y P -y B ) - (y A < / sub> -y B )(x P -x B )
检查可以简化 - 让我们沿着矩形顺时针 - A,B,C,D,A。然后所有正确的边都在线的右边。因此,我们无需与另一个顶点所在的一侧进行比较。我们需要检查一组较短的不等式:
f AB (P)&gt; = 0
f BC (P)&gt; = 0
f CD (P)&gt; = 0
f DA (P)&gt; = 0
但这对于普通的数学家坐标系是正确的,其中X在右边,Y在顶部。对于大地测量坐标,如GPS中使用的那样,X在顶部,Y在右边,我们必须改变不等式:
f AB (P)&lt; = 0
f BC (P)&lt; = 0
f CD (P)&lt; = 0
f DA (P)&lt; = 0
如果您不确定轴的方向,请注意这种简化的检查 - 如果您选择了正确的不等式,请手动检查一个点。
答案 1 :(得分:0)
我会在多边形函数中使用一个点。这总是有效,除非不与基准限制(180到-180跳)或极点重叠。
我很好奇哪个更快,来自Gangnus的方法还是poly中的点。 正常情况是点远在外面。
答案 2 :(得分:-1)
也许试试java.awt.Rectangle
课程。
public boolean contains(Point p)
检查此Rectangle
是否包含指定的Point
。