Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多边形内部的点返回到多边形外部_Java_Android_Polygons - Fatal编程技术网

Java 多边形内部的点返回到多边形外部

Java 多边形内部的点返回到多边形外部,java,android,polygons,Java,Android,Polygons,我试图通过经度和纬度来确定手机是否位于这个多边形中 它在我的第一个测试点起作用。我的第二个测试点(绿点)返回它在多边形之外。由于Android无法使用Polygon类,我使用从几个不同站点找到的代码创建了自己的类: public class Polygon { private double[] polyY, polyX; private int polySides; public Polygon( double[] px, double[] py, int ps )

我试图通过经度和纬度来确定手机是否位于这个多边形中

它在我的第一个测试点起作用。我的第二个测试点(绿点)返回它在多边形之外。由于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;
    }
}
以下是失败的代码:

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类,但这也说明它位于Polygon之外。
我使用了一个在线多边形图示器,只是为了完全确定该点位于多边形内部,并且它确实位于多边形内部。
这些点是顺时针方向的


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

我解决了这个问题。我终于注意到所有的点都是按经度排序的。因此,要么是我插入排序数据的查询(如上所示),要么是我选择经度和纬度的查询。点的顺序必须正确,否则
contains()
方法将不起作用。我的解决方案是在表中添加另一列,这样我可以对每个点进行编号。然后,每当我查询点时,我都会按此新列进行排序,以便它们始终以正确的顺序排列。

Erm,您确定
contains()
方法已正确实现吗?不是100%。我在其他3个网站上发现了相同的算法,它在我创建的另一个应用程序上运行(到目前为止),所以我认为它已经足够好了。第一个if条件应该保护内部if不受除以0场景的影响。我总是要问一个问题:你的Y坐标是“右侧向上”(人类会将其编号)还是“倒置”(就像那些模仿30年前技术的愚蠢的Java图形对它们进行编号一样)。有时这要归功于一个混乱(有些是一种方式,有些是另一种方式)这就导致了问题。顺便说一句,写for循环的人太聪明了。整个颠倒/右侧向上的问题是一个骗局;所有的坐标都在同一个系统上,所以这无关紧要。
Polygon p = new Polygon(xArray,yArray,numPoints);
if(p.contains(-95.927714, 41.225281)){
    textView.setText("in polygon");
}else{
    textView.setText("outside polygon");
}