在java[矩形]中裁剪数组列表
“裁剪”的参数是云中的两个点。这两点中的一个是底角,另一个是矩形的顶角,位于第一个点的对角位置。裁剪将从云中删除此矩形外的所有点,就像裁剪图像一样。裁剪方法必须处理水平或垂直线段上的两个输入点,在这种情况下,不在线段上的所有点都将被删除,并且必须处理两个相等的点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] 在这一点上,我真的很想知道一个解决方案,因为我太沮丧了,我无法找到它。。。所以,任何关于你们如何解决这个问题的帮助或建议都会很好。我差一点就到了,但我错过了一件重要的事情 我有这个:在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
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);
}
}
}