Path2D的contain()方法失效?点在多边形内却返回false
嘿,我来帮你揪出这个问题——contains()方法大概率没失效,你应该是踩了地理坐标转图形坐标系的常见坑!咱们一步步来分析:
1. 最可能的原因:坐标顺序搞反了
Java的2D图形API(包括Path2D、Polygon)都是基于笛卡尔坐标系,调用contains(x, y)时,第一个参数是x轴坐标,第二个是y轴坐标。但咱们日常说的地理坐标是(纬度, 经度),其中纬度对应y轴(南北方向),经度对应x轴(东西方向)。
你现在调用的是poly.contains(lat1, lon1),相当于把y轴坐标当成x传了,x当成y传了,位置完全错位,自然返回false!
正确的调用应该是:
System.out.println(poly.contains(lon1, lat1));
2. 同步检查多边形顶点的坐标顺序
你定义testBound多边形的时候,是不是也把顶点写成了(纬度, 经度)的顺序?如果是,那整个多边形的形状在笛卡尔坐标系里都是颠倒的,即使你的点在真实地理范围内,也不会落在这个“颠倒的多边形”里。
要确保所有顶点都是**(经度, 纬度)**的顺序传入Path2D,比如:
Path2D poly = new Path2D.Double(); // 第一个顶点:先传经度,再传纬度 poly.moveTo(testBoundLon0, testBoundLat0); poly.lineTo(testBoundLon1, testBoundLat1); // ... 依次添加所有顶点 poly.closePath(); // 别忘了闭合路径!
3. 确认Path2D是闭合的
构建Path2D时,最后一定要调用closePath()方法,让路径形成一个闭合的多边形。如果没闭合,contains()的判断逻辑会基于开放折线,而不是完整的多边形区域,结果自然不对。
4. 浮点数精度的小提醒
如果上面的问题都解决了还是有异常,可能要考虑浮点数精度误差——比如你的点刚好落在多边形的边界上,因为浮点运算的精度问题,contains()可能返回false。这时候可以尝试给坐标加一个极小的偏移量,或者用Java 11+提供的contains(double x, double y, double epsilon)方法来容错。
内容的提问来源于stack exchange,提问作者javanewbie14

