【问题标题】:Intersection of Rectangles for Java (Freeze Tag)Java的矩形交集(冻结标签)
【发布时间】:2016-11-17 22:32:25
【问题描述】:

**已编辑仍然没有得到正确的响应** 我不太了解如何弄清楚我的项目的交集方面。到目前为止,我已经确定了顶部、底部、左侧和右侧,但我不确定从那里去哪里。

主驱动程序应该调用来检查我的移动矩形是否相交,如果矩形被冻结,与它相交的移动矩形应该解冻它并改变它的颜色。我了解如何解冻它并更改颜色,但无论出于何种原因,当它们相交时它没有将值返回为真,我知道这段代码是错误的。感谢任何有用的提示。

*CLASS CODE*

import edu.princeton.cs.introcs.StdDraw;
import java.util.Random;
import java.awt.Color;

public class MovingRectangle {
Random rnd = new Random();
private int xCoord;
private int yCoord;
private int width;
private int height;
private int xVelocity;
private int yVelocity;
private Color color;
private boolean frozen;
private int canvas;

public MovingRectangle(int x, int y, int w, int h, int xv, int yv, int canvasSize) {
    canvas = canvasSize;
    xCoord = x;
    yCoord = y;
    width = w;
    height = h;
    xVelocity = xv;
    yVelocity = yv;
    frozen = false;
    int c = rnd.nextInt(5);

    if (c == 0) {
        color = StdDraw.MAGENTA;
    }
    if (c == 1) {
        color = StdDraw.BLUE;
    }
    if (c == 2) {
        color = StdDraw.CYAN;
    }
    if (c == 3) {
        color = StdDraw.ORANGE;
    }
    if (c == 4) {
        color = StdDraw.GREEN;
    }

}

public void draw() {
    StdDraw.setPenColor(color);
    StdDraw.filledRectangle(xCoord, yCoord, width, height);
}

public void move() {
    if (frozen == false) {
        xCoord = xCoord + xVelocity;
        yCoord = yCoord + yVelocity;
    }
    else {
        xCoord +=0;
        yCoord +=0;
    }
    if (xCoord >= canvas || xCoord < 0) {
        xVelocity *= -1;
        this.setRandomColor();
    }

    if (yCoord >= canvas || yCoord < 0) {
        yVelocity *= -1;
        this.setRandomColor();
    }


}

public void setColor(Color c) {
    StdDraw.setPenColor(color);
}

public void setRandomColor() {
    int c = rnd.nextInt(5);

    if (c == 0) {
        color = StdDraw.MAGENTA;
    }
    if (c == 1) {
        color = StdDraw.BLUE;
    }
    if (c == 2) {
        color = StdDraw.CYAN;
    }
    if (c == 3) {
        color = StdDraw.ORANGE;
    }
    if (c == 4) {
        color = StdDraw.GREEN;
    }

}

public boolean containsPoint(double x, double y) {
    int bottom = yCoord - height / 2;
    int top = yCoord + height / 2;
    int left = xCoord - width / 2;
    int right = xCoord + width / 2;

    if (x > left && x < right && y > bottom && y < top) {
        color = StdDraw.RED;
        return true;
    } else {
        return false;
    }

}

public boolean isFrozen() {
    if (frozen) {
        return true;

    } else {
        return false;
    }

}

public void setFrozen(boolean val) {
    frozen = val;


}

public boolean isIntersecting(MovingRectangle r) {
int top = xCoord + height/2;
int bottom = xCoord - height/2;
int right = yCoord + width/2;
int left = yCoord - width/2;

int rTop = r.xCoord + r.height/2;
int rBottom = r.xCoord - r.height/2;
int rRight = r.yCoord + r.width/2;
int rLeft = r.yCoord - r.width/2;

  if(right <= rRight && right >= rLeft || bottom <= rBottom && bottom    
   >= rTop){

  return true;

    } else {
        return false;
    }

    }

}

这也是我的主要驱动力,因为我也可能在这里做错了什么。

 import edu.princeton.cs.introcs.StdDraw;
 import java.util.Random;

public class FreezeTagDriver {
public static final int CANVAS_SIZE = 800;

public static void main(String[] args) {
    StdDraw.setCanvasSize(CANVAS_SIZE, CANVAS_SIZE);
    StdDraw.setXscale(0, CANVAS_SIZE);
    StdDraw.setYscale(0, CANVAS_SIZE);

    Random rnd = new Random();
    MovingRectangle[] recs;
    recs = new MovingRectangle[5];
    boolean frozen = false;

    for (int i = 0; i < recs.length; i++) {
        int xv = rnd.nextInt(4);
        int yv = rnd.nextInt(4);
        int x = rnd.nextInt(400);
        int y = rnd.nextInt(400);
        int h = rnd.nextInt(100) + 10;
        int w = rnd.nextInt(100) + 10;

        recs[i] = new MovingRectangle(x, y, w, h, xv, yv, CANVAS_SIZE);
    }
    while (true) {
        StdDraw.clear();

        for (int i = 0; i < recs.length; i++) {

            recs[i].draw();
            recs[i].move();

        }

        if (StdDraw.mousePressed()) {

            for (int i = 0; i < recs.length; i++) {
                double x = StdDraw.mouseX();
                double y = StdDraw.mouseY();

                if (recs[i].containsPoint(x, y)) {
                    recs[i].setFrozen(true);
                }
            }
        }

        for (int i = 0; i < recs.length; i++) {
//for 0
        if(recs[0].isFrozen() && recs[0].isIntersecting(recs[1])){
            recs[0].setFrozen(false);
                }

        if(recs[0].isFrozen() && recs[0].isIntersecting(recs[2])){
            recs[0].setFrozen(false);
                }

        if(recs[0].isFrozen() && recs[0].isIntersecting(recs[3])){
            recs[0].setFrozen(false);

                }

 //for 1    
        if(recs[1].isFrozen() && recs[1].isIntersecting(recs[2])){
            recs[1].setFrozen(false);

                }
        if(recs[1].isFrozen() && recs[1].isIntersecting(recs[3])){
            recs[1].setFrozen(false);
                }

        if(recs[1].isFrozen() && recs[1].isIntersecting(recs[4])){
            recs[1].setFrozen(false);
                }

//for 2
        if(recs[2].isFrozen() && recs[2].isIntersecting(recs[0])){
            recs[2].setFrozen(false);

                }
        if(recs[2].isFrozen() && recs[2].isIntersecting(recs[1])){
            recs[2].setFrozen(false);
                }

        if(recs[2].isFrozen() && recs[2].isIntersecting(recs[3])){
            recs[2].setFrozen(false);

                }
        if(recs[2].isFrozen() && recs[2].isIntersecting(recs[4])){
            recs[2].setFrozen(false);

                }
//for 3                 
        if(recs[3].isFrozen() && recs[3].isIntersecting(recs[0])){
            recs[3].setFrozen(false);

                }

        if(recs[3].isFrozen() && recs[3].isIntersecting(recs[1])){
            recs[3].setFrozen(false);
                }

        if(recs[3].isFrozen() && recs[3].isIntersecting(recs[2])){
            recs[3].setFrozen(false);
                }

        if(recs[3].isFrozen() && recs[3].isIntersecting(recs[4])){
            recs[3].setFrozen(false);
                }
//for 4         
        if(recs[4].isFrozen() && recs[4].isIntersecting(recs[0])){
            recs[4].setFrozen(false);
                }

        if(recs[4].isFrozen() && recs[4].isIntersecting(recs[1])){
            recs[4].setFrozen(false);
                }

        if(recs[4].isFrozen() && recs[4].isIntersecting(recs[3])){
                recs[4].setFrozen(false);
                }

        if(recs[4].isFrozen() && recs[4].isIntersecting(recs[2]))
                recs[4].setFrozen(false);
                }










        if (recs[0].isFrozen() && recs[1].isFrozen() &&      
   recs[2].isFrozen() && recs[3].isFrozen()
                && recs[4].isFrozen()) {
            StdDraw.text(400, 400, "YOU WIN");

        }
        StdDraw.show(20);

    }

}

}

【问题讨论】:

  • 欢迎来到 Stack Overflow!看来您需要学习使用调试器。请帮助自己一些complementary debugging techniques。如果之后仍有问题,请随时回来提供更多详细信息。
  • 如果以下答案没有任何帮助,请随时在某处发布更多代码,以便我们查看更多信息,或下载它。如果您决定稍后更新问题或上传一些代码,只需在评论中回复某人@username 关于您的更新。

标签: java class intersection


【解决方案1】:

请记住,您在这里使用的是 OR 运算符。因此,如果 right 小于 rLeft,则您的交叉点将返回 true。这不是它应该的工作方式。

您需要检查右边是否在矩形边界内。

if(right <= rRight && right >= rLeft || the other checks here)

上面的代码检查右边是否小于矩形的右边,但也检查右边是否大于矩形的左边,这意味着它在矩形左右中间的某个位置。

如果这变得太复杂,您可以简单地使用 java 的 rectangle 类,因为它有方法 containsintersects

【讨论】:

  • 谢谢!不幸的是,对于这个项目,我不能使用 rectangle 类,因为我们正在使用 StdDraw 来绘制矩形,并且还没有涵盖该类。我会试试这个方法谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多