Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2018, 11:27   #1
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию Столкновение шариков с краями окна и друг с другом

Доброго времени суток, мне нужно реализовать столкновение шариков с краями окна и друг с другом. Все шарики я записываю в ArrayList. Дальше, в цикле использую метод UpdatePosition, чтобы менять позицию шариков, также в данном методе есть вложенный цикл для проверки столкновения шариков друг с другом.
Код:
public void updatePosition(int width, int height, Graphics2D g)
    {
        //Изменение позиции
        y += yMove;
        x += xMove;
        
        //Вложенный цикл для проверки столкновения шариков друг с другом.
        for(int i = 0; i < DrawingSurface.bList.size(); i++) {
            for (int j = 0; j < DrawingSurface.bList.size(); j++) {
                if (i == j) {
                    continue;
                }
                else {
                    if(DrawingSurface.bList.get(i).getBounds().intersects(DrawingSurface.bList.get(j).getBounds())){
                        FlipDirection(DrawingSurface.bList.get(i), DrawingSurface.bList.get(j));
                    }
                }
            }
        }    
        
        //Если столкнулись в правым краем
        if(x > width - size)
        {
            x = width - size;
            xMove *= -1;
            c = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
        }
        
        //Если столкнулись в левым краем
        if(x < 1)
        {
            xMove *= -1;
            x = 1;
            c = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
        }
            
        //Если столкнулись в нижним краем
        if(y > height - size )
        {
            y = height - size;
            yMove *= -1;
            c = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
        }
        
        //Если столкнулись в верхним краем
        if(y < 1)
        {
            yMove *= -1;
            y = 1;
            c = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
        }
        g.setColor(c);
        g.fillOval(x, y, size, size);
    }
Направление шариков при столкновении друг с другом я меняю в данном методе:
Код:
public void FlipDirection (BouncingBall bouncingBall, BouncingBall bouncingBall2) {
        
        if(bouncingBall.x + size > bouncingBall2.x - size || bouncingBall2.x + size > bouncingBall.x - size)
        {
            bouncingBall.xMove *= -1;
            bouncingBall2.xMove *= -1;
            bouncingBall.x += bouncingBall.xMove;
            bouncingBall2.x += bouncingBall2.xMove;
        }
        
        if(bouncingBall.y + size > bouncingBall2.y - size || bouncingBall2.y + size > bouncingBall.y - size)
        {
            bouncingBall.yMove *= -1;
            bouncingBall2.yMove *= -1;
            bouncingBall.y += bouncingBall.yMove;
            bouncingBall2.y += bouncingBall2.yMove;
        }
    }
Проблема в следующем: При небольшом количестве шариков (до 6 штук) программа работает отлично.
При большем количестве шариков появляется небольшой баг, иногда шарики застревают в левом верхнем углу. Они начинают отбиваться друг от друга и от краев окна, и из-за этого не могут вылететь из этого угла. Я попытался примерно нарисовать это. Проблема в том, что у меня нет идей как исправить это. А еще очень интересно, почему шары "Застревают" именно в вернем левом углу и больше ни в каком.

Подскажите, как исправить данную ошибку?
Изображения
Тип файла: jpg загруженное.jpg (15.6 Кб, 61 просмотров)
Тип файла: jpg 1.jpg (24.2 Кб, 126 просмотров)
EDWIN503 вне форума Ответить с цитированием
Старый 05.03.2018, 13:52   #2
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Сообщений: 104
По умолчанию

Возможно проблема в шаге движения. Какой размер у шага? Что будет если оба шара пересекутся центрами?
ultimatet41 вне форума Ответить с цитированием
Старый 05.03.2018, 14:50   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Одному мне непонятен переход от 2) к 3) ?
На мой взгляд, после 2) оба шара должны отразиться примерно параллельно к центру, но никак не навстречу друг другу..
Black Fregat вне форума Ответить с цитированием
Старый 05.03.2018, 15:32   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
оба шара должны отразиться примерно параллельно к центру
конечно. причём по правилу закона отражения света - "угол падения равен углу отражения" -
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Две программы не состыкуются друг с другом. Как подружить их Krasi Общие вопросы .NET 5 27.11.2015 11:32
неработают 2 скрипта, не работают друг с другом Bardak2 JavaScript, Ajax 0 23.11.2011 17:41
поменять адреса указателей друг с другом dasvex Помощь студентам 8 08.09.2011 20:08
как связать 2 приложения друг с другом на c# ? kaljan775 C# (си шарп) 11 07.05.2011 00:43
Столкновение шариков в delphi vladlen1993 Помощь студентам 4 08.10.2010 15:11