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