多边形内的点返回它在多边形之外

时间:2012-06-08 17:14:12

标签: java android polygons

我正在尝试使用经度和纬度确定手机是否位于此多边形中。

enter image description here

这是我的第一个测试点。我的第二个测试点(绿点)返回它在多边形之外。由于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类,但是它也说它在多边形之外。
我使用在线多边形图示只是为了完全确定点在多边形内部并且它是。
这些点顺时针方向。

为什么这个点会返回“外部多边形”?

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。我终于注意到所有的点都是经度排序的。因此,我插入数据的查询(如上所示)对其进行排序,或者我选择经度和纬度的查询。这些点必须按正确顺序排列,否则contains()方法将无效。我的解决方案是在表格中添加另一列,以便为每个点编号。然后,每当我查询这些点时,我将按此新列进行排序,以便它们始终处于正确的顺序。