我正在尝试使用经度和纬度确定手机是否位于此多边形中。
它适用于我的第一个测试点。我的第二个测试点(绿点)返回它在多边形之外。由于 Android 无法使用 Polygon 类,因此我使用从几个不同站点找到的代码创建了自己的类:
public class Polygon {
private double[] polyY, polyX;
private int polySides;
public Polygon( double[] px, double[] py, int ps ) {
polyX = px;
polyY = py;
polySides = ps;
}
public boolean contains( double x, double y ) {
boolean oddTransitions = false;
for( int i = 0, j = polySides -1; i < polySides; j = i++ ) {
if( ( polyY[ i ] < y && polyY[ j ] >= y ) || ( polyY[ j ] < y && polyY[ i ] >= y ) ) {
if( polyX[ i ] + ( y - polyY[ i ] ) / ( polyY[ j ] - polyY[ i ] ) * ( polyX[ j ] - polyX[ i ] ) < x ) {
oddTransitions = !oddTransitions;
}
}
}
return oddTransitions;
}
}
我查询数据库以从此表中获取经度和纬度:
db.execSQL("insert into " + DATABASE_TABLE_POLYGON + " select null as " + KEY_ROWID
+ ", 0 as " + KEY_BUILDING
+ ", -95.929635 as " + KEY_LONG
+ ", 41.223459 as " + KEY_LAT
+ " union select null,0,-95.931544, 41.223491"
+ " union select null,0,-95.931587, 41.224734"
+ " union select null,0,-95.929484, 41.224782"
+ " union select null,0,-95.929227, 41.227655"
+ " union select null,0,-95.929184, 41.229656"
+ " union select null,0,-95.926437, 41.23006"
+ " union select null,0,-95.92633, 41.228478"
+ " union select null,0,-95.924141, 41.227413"
+ " union select null,0,-95.920944, 41.22617"
+ " union select null,0,-95.921073, 41.225299"
+ " union select null,0,-95.922811, 41.224008"
+ " union select null,0,-95.92706, 41.22099"
+ " union select null,0,-95.927553, 41.221022"
+ " union select null,0,-95.927811, 41.222943"
+ " union select null,0,-95.929334, 41.222991";
这是失败的代码:
Polygon p = new Polygon(xArray,yArray,numPoints);
if(p.contains(-95.927714, 41.225281)){
textView.setText("in polygon");
}else{
textView.setText("outside polygon");
}
输出:外部多边形
其他信息:
它似乎在我创建的另一个应用程序中工作。
我正在使用模拟器和模拟位置。
我还创建了一个普通的 java 类,所以我可以使用内置的 Polygon 类,但这
也说明它在多边形之外。
我使用了一个在线多边形绘图仪,只是为了完全确定该点在多边形内部,而且确实如此。
这些点按顺时针方向移动。
为什么这一点返回“外部多边形”?