Обнаружение столкновения между кругом и прямоугольником без пересечения методом AWT

1

Я пишу код, в котором я рисую два прямоугольника как препятствия и овал как робот. Робот движется, пока препятствия неподвижны. Проблема в том, что местоположение робота генерируется случайным образом в начале, оно иногда перекрывает прямоугольники. Я постоянно пытаюсь это исправить, но я не могу найти хорошее решение.

Я попытался проверить границы прямоугольника с координатой x, y круга, прежде чем рисовать его. Но он проверяет только одну точку, а иногда и другую точку круга перекрывает прямоугольник. Я попробовал метод пересечения, но я не могу реализовать это в своем коде, поскольку использую fillOval и fillRect.

Я знаю, что этот вопрос уже задан в сообществе несколько раз. Но все ответы вращаются вокруг метода пересечения в AWT. Я не использую классы Rectangle/Ellipse. Я использую fillRect и fillOval для создания своих фигур. Есть ли другой способ предотвратить столкновение, когда в методе инициализации эти фигуры в первый раз нарисованы на JPanel случайным образом.

Код:

public void initializePanel(Graphics g)
{
    createObstacle(g,150,225,100,40);
    createObstacle(g,500,300,40,100);  
    drawNParticles(g);
    createRobot(g); 
}

private void createRobot(Graphics 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);
    System.out.println("Robot:"+robot_x+"--"+robot_y+"--"+robot_orientation);
    if((robot_x>620)||(robot_y>395)||(robot_x<1)||(robot_y<1))
    {
        robot_orientation=180;
    }
    drawRobot(g,robot_x,robot_y,robot_radius);
}


private ArrayList<Integer> positionRobot(int x, int y)
{
    int robot_radius=50;  
    ArrayList<Integer> list= new ArrayList<Integer>();
    if(counter==0)
    {
        x=randomInteger(25,655);//so that it stays inside the content_Walls panel 
        y=randomInteger(25,425); //so that it stays inside the content_Walls panel 
        x=x-(robot_radius/2);
        y=y-(robot_radius/2);
        robot_orientation=randomFloat(0,360);
        if((x<251&&x>149)&&(y<266&&y>224))
        {
            x=0;
            y=0;
            positionRobot(x,y);
        }
        else if((x<=541&&x>499)&&(y<401&&y>299))
        {
        x=0;
        y=0;
        positionRobot(x,y);
        }
    counter++;
    }
    else
    {
        setXPosition_robot(robot_x);
        setYPosition_robot(robot_y);
    }
        list.add(x);
        list.add(y);
        return list;                
}

private void drawNParticles(Graphics g)
{   
    ArrayList<Integer> list;        
    list = new ArrayList<Integer>(Collections.nCopies(n, 0));
    for(int i=0;i<list.size();i++)
    {
       generateParticle(g);
    }
}

private void generateParticle(Graphics g)
{
    int radius = 4;
    ArrayList<Integer> list= new ArrayList<Integer>();
    list=positionParticles(particle_x,particle_y);
    g.setColor(Color.RED);
    g.fillOval(list.get(0),list.get(1), radius, radius);
}

private ArrayList<Integer> positionParticles(int x, int y)
{
    int radius = 4;
    ArrayList<Integer> list= new ArrayList<Integer>();

        x=randomInteger(2,678); // bounds of x between which the particles should be generated
        y=randomInteger(2,448); // bounds of y between which the particles should be generated
        x=x-(radius/2);
        y=y-(radius/2);
        if((x<251&&x>149)&&(y<266&&y>224))
        {
            x=0;
            y=0;
            positionParticles(x,y);
        }
        if((x<541&&x>499)&&(y<401&&y>299))
        {
            x=0;
            y=0;
            positionParticles(x,y);
        }
    list.add(x);
    list.add(y);
    return list;
}

private void createObstacle(Graphics g, int x, int y, int width, int height)
{
    //g.setColor(Color.YELLOW);
    //g.fillRect(x, y, width, height);  
}

private void drawRobot(Graphics g, int x, int y, int radius)
{
    g.setColor(Color.GREEN);
    g.fillOval(x, y, radius, radius);   
}

private static Random rand;

private static int randomInteger(int min, int max)
{
    if(rand==null)
        rand=new Random();
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}

private static Random randFloat;
private static float randomFloat(float min, float max)
{
    if(randFloat==null)
        randFloat=new Random();
    float randomNum = randFloat.nextFloat() *(max-min)+ min;
    return randomNum;
}
Теги:
swing
collision-detection

1 ответ

4
Лучший ответ

Я не использую классы Rectangle/Ellipse. Я использую fillRect и fillOval для создания своих фигур.

Так что измените свой код.

Я попытался проверить границы прямоугольника с координатой x, y круга, прежде чем рисовать его. Но он проверяет только одну точку, а иногда и другую точку круга перекрывает прямоугольник.

Точно, это не простой код для написания, поэтому вы должны использовать существующие API. Не изобретайте велосипед, пытаясь написать свой собственный код пересечения! Я знаю, что это выше моего уровня мастерства, чтобы получить правильную геометрию.

Проверьте " Игра с фигурами" для идей, которые не связаны с выполнением вашей собственной картины, используя методы fillRect() и fillOval().

  • 0
    +1 "Так измени свой код." - Отличный совет!
  • 0
    @camickr Я пытался найти решение без изменения существующего кода. Но теперь я чувствую, что было бы лучше изменить мой код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню