Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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_Arrays_Loops_For Loop_Arraylist - Fatal编程技术网

在java[矩形]中裁剪数组列表

在java[矩形]中裁剪数组列表,java,arrays,loops,for-loop,arraylist,Java,Arrays,Loops,For Loop,Arraylist,“裁剪”的参数是云中的两个点。这两点中的一个是底角,另一个是矩形的顶角,位于第一个点的对角位置。裁剪将从云中删除此矩形外的所有点,就像裁剪图像一样。裁剪方法必须处理水平或垂直线段上的两个输入点,在这种情况下,不在线段上的所有点都将被删除,并且必须处理两个相等的点p1和p2,在这种情况下,除了p1之外的所有点都将从云中删除 例如,如果两个输入点分别为0.0,0,0和1.0,1.0,则删除由0.0,0.0,0.0,1.0,1.0和0.0,1.0分隔的正方形外的所有点,但如果两个输入点分别为0.0,0

“裁剪”的参数是云中的两个点。这两点中的一个是底角,另一个是矩形的顶角,位于第一个点的对角位置。裁剪将从云中删除此矩形外的所有点,就像裁剪图像一样。裁剪方法必须处理水平或垂直线段上的两个输入点,在这种情况下,不在线段上的所有点都将被删除,并且必须处理两个相等的点p1和p2,在这种情况下,除了p1之外的所有点都将从云中删除

例如,如果两个输入点分别为0.0,0,0和1.0,1.0,则删除由0.0,0.0,0.0,1.0,1.0和0.0,1.0分隔的正方形外的所有点,但如果两个输入点分别为0.0,0,0和0.0,1.0,则删除由0.0,0和0.0,1.0分隔的线段外的所有点

因此,如果你有最终云:[3.0,1.0,2.0,2.0,1.5,1.5,3.0,0.0],你应该得到裁剪云:[3.0,1.0,3.0,0.0]

在这一点上,我真的很想知道一个解决方案,因为我太沮丧了,我无法找到它。。。所以,任何关于你们如何解决这个问题的帮助或建议都会很好。我差一点就到了,但我错过了一件重要的事情

我有这个:

public void crop(Point p1, Point p2) {
    double highX = 0;
    double lowX = 0;
    double highY = 0;
    double lowY = 0;
    double x1 = p1.getX();
    if (p1.getX() > p2.getX()) {
        highX = p1.getX();
        lowX = p2.getX();
    } else {
        highX = p2.getX();
        lowX = p1.getX();
    }
    if (p1.getY() > p2.getY()) {
        highY = p1.getY();
        lowY = p2.getY();
    } else {
        highY = p2.getY();
        lowY = p1.getY();
    }
    for (int i = 0; i < points.size(); i++) {
        Point P = points.get(i);
        if (P.getX() < lowX || P.getX() > highX || P.getY() < lowY
                || P.getY() > highY) {
            points.remove(i);
        }

        if (P.getX() == lowX && P.getX() == highX && P.getY() == lowY
                && P.getY() == highY) {
            points.remove(i);
        }

    }

    // vertical
    if (p1.getX() == p2.getX()) {
        double x = p1.getX();
        for (int i = 0; i < points.size(); i++) {
            if (points.get(i).getX() == x
                    && p1.getY() <= points.get(i).getY()
                    && points.get(i).getY() >= p2.getY()) {
                continue;
            } else {
                points.remove(i);
            }
        }
    }
    // Horizontal
    if (p1.getY() == p2.getY()) {
        double y = p2.getY();
        for (int i = 0; i < points.size(); i++) {
            if (points.get(i).getY() == y) {
                if (p1.getX() <= points.get(i).getX()
                        && points.get(i).getX() >= p2.getX()) {
                    continue;
                }
            } else {
                points.remove(i);
            }
        }
    }
    // square
    if (p1.getX() == p2.getX()) {
        for (int i = 0; i < points.size(); i++) {
            if (points.get(i).getY() <= p1.getY()
                    && points.get(i).getY() >= p2.getY()) {
                if (points.get(i).getX() >= p1.getX()
                        && points.get(i).getX() <= p2.getX()) {
                    continue;
                }
            }

            points.remove(i);
        }
    }

}

在我看来,您只需要以下条件:

    if (P.getX() < lowX || P.getX() > highX || P.getY() < lowY
            || P.getY() > highY) {
        points.remove(i);
    }
即使这个条件正确,它仍然是多余的,因为如果P1=P2,上面的第一个条件将删除任何不等于P1的点。此外,您的第一个条件还考虑了P1和P2形成水平或垂直线段的情况,因此您的代码的其余部分要么是错误的,要么是冗余的

您所需要的就是:

public void crop(Point p1, Point p2) {
    double highX = 0;
    double lowX = 0;
    double highY = 0;
    double lowY = 0;
    double x1 = p1.getX();
    if (p1.getX() > p2.getX()) {
        highX = p1.getX();
        lowX = p2.getX();
    } else {
        highX = p2.getX();
        lowX = p1.getX();
    }
    if (p1.getY() > p2.getY()) {
        highY = p1.getY();
        lowY = p2.getY();
    } else {
        highY = p2.getY();
        lowY = p1.getY();
    }
    for (int i = 0; i < points.size(); i++) {
        Point P = points.get(i);
        if (P.getX() < lowX || P.getX() > highX || P.getY() < lowY
                || P.getY() > highY) {
            points.remove(i);
        }

    }
}

即使使用了我已经厌倦的代码,你仍然会得到错误的答案,你会得到这样的结果:裁剪前的点:[0.0,1.0,1.0,0.0,裁剪前的点:[0.0,1.0,1.0,0.0,裁剪前的点:[0.0,1.0,2.0,2.0,裁剪后的点:[2.0,2.0];裁剪后的点:[2.0,2.0,2.0,2.0]裁剪后的极端值:[2.0,2.0,2.0,2.0,|裁剪后的极端值:[2.0,2.0,2.0,2.0,test1分数:0/1-----@user3785202对不起,你的例子不清楚。输入点和极值是什么意思?输入点和极值是构成裁剪矩形的两个点吗?如果是这样的话,裁剪后极值如何变化?输入点包含的内容如何完全不同裁剪后的ent点?裁剪只会删除一些点,不会添加新点或更改现有点。我还有其他测试,例如您的输出/主输出:网格:网格:[0.0,0.0,0.0,1.0,0.0,2.0,1.0,0.0,0.0,0.0,1.0,0.0,2.0,1.0,0.0,网格裁剪在1,1:1:1,1:0,0,0,0,0,0,0,1.0,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0[0.0,0.0,0.0,1.0,1.0,1.0,1.0]网格在0,1处裁剪:网格在0,1处裁剪:[2.0,2.0]|[0.0,0.0,0.0,1.0]网格在0,0处裁剪:网格在0,0处裁剪:[]@用户3785202很难理解你评论中的数字是什么意思。请编辑你的问题,并在那里清楚地写下输入数组列表P1和P2、预期输出和实际得到的输出。你不可能从你的教授和/或助教那里得到帮助吗?还有,这一点:在这一点上,我真的想知道一个解决方案…所以有什么问题吗帮助或者你们将如何解决它会很好->堆栈溢出不是关于回答广泛的问题,我被卡住了,你能帮我解决问题吗。这个问题没有表明任何研究工作都是一个失败的原因,人们把缺乏调试工作作为失败的原因并不少见。你还没有描述你所面临的问题不起作用,也没有描述任何调试工作。从“关闭”菜单中:问题寻求调试帮助为什么此代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中复制它所需的最短代码。没有明确问题说明的问题对其他人没有用处r读者。请参阅:。仅在此处粘贴您的作业和尝试的解决方案会使您很难获得帮助。请添加更多详细信息。
public void crop(Point p1, Point p2) {
    double highX = 0;
    double lowX = 0;
    double highY = 0;
    double lowY = 0;
    double x1 = p1.getX();
    if (p1.getX() > p2.getX()) {
        highX = p1.getX();
        lowX = p2.getX();
    } else {
        highX = p2.getX();
        lowX = p1.getX();
    }
    if (p1.getY() > p2.getY()) {
        highY = p1.getY();
        lowY = p2.getY();
    } else {
        highY = p2.getY();
        lowY = p1.getY();
    }
    for (int i = 0; i < points.size(); i++) {
        Point P = points.get(i);
        if (P.getX() < lowX || P.getX() > highX || P.getY() < lowY
                || P.getY() > highY) {
            points.remove(i);
        }

    }
}