Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


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

Доброго времени суток, мне нужно реализовать столкновение шариков с краями окна и друг с другом. Все шарики я записываю в 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 Кб, 19 просмотров)
Тип файла: jpg 1.jpg (24.2 Кб, 0 просмотров)
EDWIN503 вне форума   Ответить с цитированием
Старый 05.03.2018, 14:52   #2
ultimatet41
Форумчанин
 
Аватар для ultimatet41
 
Регистрация: 08.04.2012
Адрес: Спас-Деменск
Сообщений: 98
Репутация: 94
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Две программы не состыкуются друг с другом. Как подружить их Krasi Общие вопросы .NET 5 27.11.2015 12: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


08:20.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru