在java中裁剪数组列表[rectangle]

时间:2014-06-30 01:50:32

标签: java arrays loops for-loop arraylist

crop()的参数在Points中有两个Cloud。这两个Points中的一个是底角,另一个是矩形的顶角,位于第一个Point的对角线上。 crop()会从Cloud中移除此矩形外的所有点,就像裁剪图像一样。 crop()方法必须处理水平或垂直线段上的两个输入点,在这种情况下,不会删除线段上的所有点,并且它必须处理两个相等的Points {{1} }和p1,在这种情况下,所有p2Points都会从云中删除。

例如,如果两个输入p1Points(0.0,0,0),则广场外的所有点均由(1.0,1.0)(0.0,0.0),{{1}分隔}}和(0.0,1.0)已删除,但如果两个输入(1.0,1.0)(0.0,1.0)Points,则线段外的所有点均由(0.0,0,0)分隔,并且(0.0,1.0)已被移除。

所以如果你有最终的云:(0.0,0.0)你应该得到裁剪云:(0.0,1.0)

此时我真的想知道一个解决方案,因为我很沮丧,以至于我无法理解......所以任何有关你们如何解决它的帮助或建议都会很好。我非常接近,但我只是错过了一件主要的事情。

我有这个:

[(3.0,1.0), (2.0,2.0), (1.5,1.5), (3.0,0.0)]

1 个答案:

答案 0 :(得分:3)

在我看来,你只需要这个条件:

    if (P.getX() < lowX || P.getX() > highX || P.getY() < lowY
            || P.getY() > highY) {
        points.remove(i);
    }

第二个条件(下面)是错误的。它将删除P = P1 = P2的情况下的点,这与您想要做的完全相反。

    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);
        }

    }
}