Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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_Math_Geometry_Polygon - Fatal编程技术网

Java 计算点是否位于多边形内

Java 计算点是否位于多边形内,java,math,geometry,polygon,Java,Math,Geometry,Polygon,我试图检查点阵列列表中包含的点是否在多边形内。多边形和要检查的点也是结构化的: private ArrayList<Pair<Float,Float>> polygon, points; 私有阵列列表多边形,点; 我的算法是从多边形的前两点开始,检查点中包含的点是否包含在它们中。如果没有,他将再次检查,比较第一个和第三个等,直到所有多边形数组列表都已滚动。如果布尔变量从未变为true,则表示该点不包含在多边形中。问题在于,使用此方法,它还可以找到不应包含的点,如下图所

我试图检查点阵列列表中包含的点是否在多边形内。多边形和要检查的点也是结构化的:

private ArrayList<Pair<Float,Float>> polygon, points;
私有阵列列表多边形,点;
我的算法是从多边形的前两点开始,检查点中包含的点是否包含在它们中。如果没有,他将再次检查,比较第一个和第三个等,直到所有多边形数组列表都已滚动。如果布尔变量从未变为true,则表示该点不包含在多边形中。问题在于,使用此方法,它还可以找到不应包含的点,如下图所示:

如果我在P1和P2之间的区域中绘制一些东西,它将返回真值,即使存在明显不在形状中的零件。如何改进算法:

boolean between = false;
for (int j=0; j<points.size(); j++, between=false) {
    for (int i=0; i<polygon.size() && !between; i++) {
        float x1 = polygon.get(i).first;
        float y1 = polygon.get(i).second;
        for (int ii=0; ii<polygon.size() && !between; ii++) {
            float x2 = polygon.get(ii).first;
            float y2 = polygon.get(ii).second;
            if ((points.get(j).first < x1 && points.get(j).first > x2) &&
                (points.get(j).second < y1 && points.get(j).second > y2))
                    between = true;
        }
    }
    if (!between) scoreDrawOut = 1; else scoreDrawIn = 1;
} 
boolean-between=false;

对于(intj=0;jIs)有什么深刻的理由不只是从点创建一个,然后简单地调用
path.contains(点)
?@Marco13是否可以在路径中转换该ArrayList?您可以使用它来构造路径。我按照@Marco13的建议更新了该方法,但该方法包含的内容未被识别。我还更新了该问题,以便您可以看到。有什么深刻的理由不只是从点创建一个数组,然后简单地调用
Path.contain吗s(point)
?@Marco13是否可以在路径中转换该ArrayList?您可以使用它来构造路径。我按照@Marco13的建议更新了该方法,但该方法包含的内容未被识别。我还更新了该问题,以便您可以看到。
private void checkDrawOut() {
    Path shape = new Path();
    for (int i=0; i<figura.size(); i++)
        shape.moveTo(figura.get(i).first, figura.get(i).second);
    boolean compreso = false;
    for (int x=0; x<segments.size(); x++) {
        ArrayList<Pair<Float, Float>> punti = segments.get(x);
        for (int j = 0; j < punti.size(); j++, compreso = false) {
            if (shape.contains(punti.get(j).first, punti.get(j).second))
                compreso = true;
        }
        if (!compreso) scoreDrawOut = 1;
        else scoreDrawIn = 1;
    }
}