Java 碰撞检测:即使使用相交方法,形状也会重叠

Java 碰撞检测:即使使用相交方法,形状也会重叠,java,swing,collision-detection,Java,Swing,Collision Detection,我正在编写一个代码,其中一个圆在一个框中随机移动,如果它与其中的任何小矩形碰撞,它会改变其前进方向/反弹回来。我正在使用“相交”方法来查找它们之间的碰撞。但圆有时与矩形重叠,而不是在接触时反弹。我通过改变方向(180+当前方向)反弹球 我正试图解决这个问题,但还没有找到任何成功。我读到intersects是通过检查边界矩形的重叠来查找匹配。但是,我如何解决这个问题。这个问题是因为交叉口还是我改变方向的方式有问题。有什么想法吗 代码: private void collisionAvoidance

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

我正试图解决这个问题,但还没有找到任何成功。我读到intersects是通过检查边界矩形的重叠来查找匹配。但是,我如何解决这个问题。这个问题是因为交叉口还是我改变方向的方式有问题。有什么想法吗

代码:

private void collisionAvoidanceRobot(intx,inty,intr,双机器人方向2)
{
布尔值1=假;
布尔值2=假;
布尔值3=假;
布尔值4=假;
布尔值5=假;
布尔值6=假;
r+=5;
形状碰撞机器人=新的椭圆2d.Double(x,y,r,r);
碰撞1=碰撞机器人。相交(obst1);
如果(1)
{
机器人方向=180+机器人方向;
}
碰撞2=碰撞机器人。相交(obst2);
如果(2)
{
机器人方向=180+机器人方向;
}
碰撞3=碰撞机器人。相交(obst3);
如果(3)
{
机器人方向=180+机器人方向;
}
碰撞4=碰撞机器人。相交(obst4);
如果(4)
{
机器人方向=180+机器人方向;
}
碰撞5=碰撞机器人。相交(obst5);
如果(5)
{
机器人方向=180+机器人方向;
}
碰撞6=碰撞机器人。相交(obst6);
如果(6)
{
机器人方向=180+机器人方向;
}
}
公共无效设置位置(int x)
{
双倍距离=0;
距离=单位移动+随机双精度(0,正向噪声);
机器人x=(int)(x+Math.sin(Math.toRadians(机器人方向))*距离);
//System.out.println(“Robot_X:+Robot_X”);
}
公共无效设置位置(int y)
{
双倍距离=0;
距离=单位移动+随机双精度(0,正向噪声);
机器人y=(int)(y+Math.cos(Math.toRadians(机器人方向))*距离);
//System.out.println(“Robot_Y:+Robot_Y”);
}
专用void createRobot(Graphics2D g)
{
ArrayList robot_list=新建ArrayList();
机器人列表=定位机器人(机器人x、机器人y);
robot_x=robot_list.get(0);
robot_y=robot_list.get(1);
设定噪声(0.05,0.05,5.0);
//System.out.println(“Robot:+Robot_x+”--“+Robot_y+”--“+Robot_方向”);
调整机器人方向();
碰撞避免机器人(机器人x、机器人y、机器人半径、机器人方向);
牵引机器人(g、机器人x、机器人y、机器人半径);
}
截图:

圆圈是否出现摆动?由于每次迭代都会将圆移动一个随机距离,因此它移动到正方形中的距离可能大于它在下一次迭代中以相反方向移动的距离,这将导致圆“粘住”


此外,您的collisionAvoidanceRobot可以使用for循环,而不是所有那些If

如果您可以提供一个屏幕截图,它可能会有所帮助。您可能需要为此使用一个库:@tieTYT attached screenshot.@tietytyt您认为问题在于intersects方法吗?如果没有一个笔名可能针对正确的问题:根据移动和碰撞测试的顺序,它可能会注意到碰撞并掉头,但随后*仍处于碰撞状态并立即再次掉头。(在许多情况下,当目标状态是冲突时,不移动是有益的。大致类似于
Point newPos=computeNewPosition();if(doesNotCollideAt(newPos)){currentPos=newPos}else{/*不要移动到那里*/}
,但这也有一些注意事项是的,圆摆动,然后慢慢地与矩形重叠。我不是每次都使用随机。我只是第一次使用随机,然后,我将设置器计算的距离添加到其中。我应该如何修复它。谢谢,我会将其更改为循环。对不起,你说的第一次是什么意思?setXPosition\u robot不是每次迭代都调用吗?我说不出来,因为它不是从所表示代码中的任何地方直接调用的。总之,有几种方法可以修复它,可以提高下一次迭代的速度,以便它总是清除矩形,可以设置一个标志,使它忽略交点,直到清除为止(不建议),或者您可以调用一个函数来设置圆的x,y坐标,以便根据它的方向(可能是最干净的方法)刚好离开矩形
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);
}