如何在java中裁剪出给定的点数

时间:2014-06-30 18:34:15

标签: java arrays for-loop arraylist

所以我给出了不在我的矩形内的点或者在边界线上的点。矩形由方法p1,p2引入的两个点组成。所以,例如,如果您在作物之后有[(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;
    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 (Math.abs(P.getX() - lowX) < Point.EPSILON
                || Math.abs(P.getX() - highX) < Point.EPSILON
                || Math.abs(P.getY() - lowY) < Point.EPSILON
                || Math.abs(P.getY() - highY) < Point.EPSILON) {
            System.out.println(Math.abs(P.getX() - highX) < Point.EPSILON);
            System.out.println("Keeping: " + points.get(i));
            // keep
        } else {
            System.out.println("Remvoing: " + points.get(i));
            points.remove(i);
        }

        if (P.getX() < lowX || P.getX() > highX || P.getY() < lowY
                || P.getY() > highY) {
            System.out.println("Removing: " + points.get(i));
            points.remove(i);
        }
    }
}

解决这个问题的任何帮助都会很好我已经被困了一段时间

2 个答案:

答案 0 :(得分:1)

java.awt.Rectangle为整数和java.awt.Rectangle2D类,方法为contains(x, y)

这将解决点在矩形内部或左边界或上边界上的情况。

出于好的理由,你不应该将右边界和下边界上的点视为内部。 与那个需要的人交谈。

否则你可能得到两个触摸矩形内的点,这不是一个好的解决方案。

另外通常指定:&#34;如果某个点正好在边框处,则该方法可能返回true或false&#34;。

然而,对于斧头平行的矩形,&#34;要在内部或在边界上&#34;任务很容易解决。查看java方法的src并更改&lt;到&lt; =。 (或类似的)

答案 1 :(得分:0)

我最终想出了解决问题的方法

public void crop(Point p1, Point p2) {
double highX = 0;
double lowX = 0;
double highY = 0;
double lowY = 0;
ArrayList<Point> list = new ArrayList<Point>();
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();
}
if (p1.equals(p2)) {
    list.add(p1);
    points = list;
    return;

}
double i = 0;
while (i < points.size()) {
    Point P = points.get((int) i);
    if (P.getX() < highX + EPSILON && P.getX() > lowX - EPSILON
            && P.getY() < highY + EPSILON && P.getY() > lowY - EPSILON) {
        list.add(P);
    }
    i++;
}//thank god
points = list;

}