2016-11-17 2 views
0

** 여전히 정확한 응답을 얻지 못했습니다 ** 내 프로젝트의 교차점을 파악하는 방법을 잘 모릅니다. 지금까지 나는 위, 아래, 왼쪽과 오른쪽을 결정했다. 그러나 나는 거기에서 어디로 가야할지 모르겠다.Java (고정 태그)에 대한 직사각형의 교차점

주 드라이버가 내 이동 사각형이 교차하는지 확인해야하며 사각형이 동결하면 움직이는 교차선이 고정 해제되어 색상이 변경되어야합니다. 나는 그것을 고정 해제하고 색상을 변경하는 방법을 이해하지만 어떤 이유로 든 교차하고있을 때 값을 반환하지 않고이 코드가 잘못되었다는 것을 알고 있습니다. 도움이되는 정보를 제공해 주시면 감사하겠습니다. 이 사이트를 사용하여 처음으로 잘못 게시 한 경우 내게 노출됩니다. 감사! 내가 너무 잘못 여기 일을 할 수 있기 때문에

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

    } 

} 

여기뿐만 아니라 내 주요 드라이버입니다. 여기 OR 연산자를 사용하고 마음에

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

    } 

} 

}

+0

에 오신 것을 환영합니다을 가지고 당신이 단순히 자바의 rectangle 클래스를 사용할 수 있습니다 복잡하게하는 경우! 디버거를 사용하는 법을 배워야 할 것 같습니다. [보완적인 디버깅 기술] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참고하십시오. 나중에 문제가 계속되는 경우 자세한 내용을 알려 주시기 바랍니다. –

+0

여기를보십시오 -> (http://gamedev.stackexchange.com/questions/586/what-is-the-fastest-way-to-work-out-2d-bounding-box-intersection) – Hobbs2000

+1

아래 답변은 조금이라도 더 많은 코드를 게시하면 더 많은 것을 보거나 다운로드 할 수 있습니다. 질문을 업데이트하거나 나중에 코드를 업로드하기로 결정했다면, 업데이트에 대한'@ 사용자 이름 '으로 의견에있는 누군가에게 회신하십시오. – DrZoo

답변

0

하십시오. 따라서 right가 rLeft보다 작 으면 교차 연산자가 true를 반환합니다. 이것이 어떻게 작동해야하는지가 아닙니다.

오른쪽에 사각형이 들어가는 지 확인해야합니다.

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

위의 코드 검사를 마우스 오른쪽은 사각형의 권리보다 작은 경우, 또한 바로 그것의 중간에 어딘가에 의미 사각형의 왼쪽,보다 큰 것을 직사각형의 왼쪽과 오른쪽.

이 너무는 방법 contains 및 스택 오버플로 intersects

+0

고마워요! 불행히도이 프로젝트에서는 사각형을 그리는 데 StdDraw를 사용하기 때문에 사각형 클래스를 사용할 수 없으며 클래스를 아직 다루지 않았습니다. 설명을 해 주셔서 감사합니다. –