碰撞检测:即使在使用交叉方法后,形状也会重叠

时间:2014-08-11 19:07:23

标签: java swing collision-detection

我正在编写一个代码,其中圆圈在框中随机移动,如果它与其中的任何小矩形相撞,它会改变其前进方向/反弹。我使用intersects方法来找到它们之间的碰撞。但是圆圈有时会与矩形重叠,而不是在接触时弹回。我通过改变方向(180 + current_orientation)来反弹球。

我正在努力解决这个问题,但尚未找到任何成功。我读到交叉点是通过检查边界矩形的重叠来找到匹配。但是,我该如何解决这个问题呢。这个问题是由于交叉点还是我改变方向的方式有任何问题。有什么想法吗?

代码:

private void collisionAvoidanceRobot(int x, int y, int r, double robot_orientation2)
    {
        boolean collide1=false;
        boolean collide2=false;
        boolean collide3=false;
        boolean collide4=false;
        boolean collide5=false;
        boolean collide6=false;
        r+=5;
        Shape collisionrobot=new Ellipse2D.Double(x,y,r,r);
        collide1=collisionrobot.intersects(obst1);
        if(collide1)
        {
            robot_orientation=180+robot_orientation;
        }
        collide2=collisionrobot.intersects(obst2);
        if(collide2)
        {
            robot_orientation=180+robot_orientation;
        }
        collide3=collisionrobot.intersects(obst3);
        if(collide3)
        {
            robot_orientation=180+robot_orientation;
        }
        collide4=collisionrobot.intersects(obst4);
        if(collide4)
        {
            robot_orientation=180+robot_orientation;
        }
        collide5=collisionrobot.intersects(obst5);
        if(collide5)
        {
            robot_orientation=180+robot_orientation;
        }
        collide6=collisionrobot.intersects(obst6);
        if(collide6)
        {
            robot_orientation=180+robot_orientation;
        }

    }

public void setXPosition_robot(int x)
    {
        double distance=0;
        distance = unit_moved + randomDouble(0, forwardNoise);
        robot_x= (int) (x + Math.sin(Math.toRadians(robot_orientation))*distance);
        //System.out.println("Robot_X:"+robot_x);
    }

public void setYPosition_robot(int y)
{
    double distance=0;
    distance = unit_moved + randomDouble(0, forwardNoise);
    robot_y=(int) (y+ Math.cos(Math.toRadians(robot_orientation))*distance);
    //System.out.println("Robot_Y:"+robot_y);
}

private void createRobot(Graphics2D g)
{
    ArrayList<Integer> robot_list= new ArrayList<Integer>();
    robot_list=positionRobot(robot_x,robot_y);
    robot_x=robot_list.get(0);
    robot_y=robot_list.get(1);
    setNoise(0.05,0.05,5.0);
   //System.out.println("Robot:"+robot_x+"--"+robot_y+"--"+robot_orientation);
    adjustRobotOrientation();
    collisionAvoidanceRobot(robot_x,robot_y,robot_radius,robot_orientation);
    drawRobot(g,robot_x,robot_y,robot_radius);
}

截图: enter image description here

1 个答案:

答案 0 :(得分:1)

圆圈是否会出现晃动?因为你在每次迭代时移动圆圈一个随机距离,它移动到正方形的距离可能大于它在下一次迭代中向相反方向移动的距离,这将导致圆圈“stick& #34;

另外,您的collisionAvoidanceRobot可以使用for循环而不是所有ifs