Реакция столкновения окружности при движении к точке - PullRequest
2 голосов
/ 08 января 2012

enter image description here

У меня есть круги (их может быть больше двух), которые движутся к точке.На данный момент они перекрываются, когда они рядом.Как я могу сделать так, чтобы они не пересекались, но все еще двигались к точке?

Я использую Java.

  • Круги - это не шары, которые подчиняются законам физики,они представляют организмы (не имеет значения).
  • У меня уже работает обнаружение столкновений
  • Круги не слипаются, они просто не могут пересекаться.

Ответы [ 4 ]

1 голос
/ 08 января 2012

Это не простой вопрос.

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

У каждого круга есть вектор, который описывает направление, в котором он должен двигаться.В каждом кадре необходимо выполнить обнаружение столкновений и при необходимости изменить этот вектор.

Столкновение между любыми двумя кругами можно обнаружить, проверив, меньше ли расстояние между ними, чем сумма их радиусов.Линия между центрами встречных кругов дает вам направление столкновения.Вектор столкновения для круга находится в направлении столкновения, указывая на центр круга, и его величина равна половине числа единиц, на которые круги перекрываются, то есть сумме их радиусов минусРасстояние между ними делится на два.(Если круги могут быть неравного размера, это становится более сложным, вам нужно выяснить, на сколько делить.)

Итак, одним из возможных решений вашей проблемы было бы просто добавить вектор столкновений квектор направления круга, а затем масштабируйте вектор направления так, чтобы его величина была равна величине, которая была у него до столкновения.(Так что будет изменяться только его направление, а не его величина.)

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

0 голосов
/ 08 мая 2018

Решение по ОП.

Благодаря: https://web.archive.org/web/20120714122645/http://awesty.com/blog/2008/09/circle-collisions/

public void circleCollision(circle1, circle2) {    
    double xDistance = circle1.x – circle2.x;
    double yDistance = circle1.y – circle2.y;
    double distance = xDistance * xDistance + yDistance * yDistance;
    double angle = Math.atan2(ydist, xdist);

    if (distance < circle1.diameter * circle1.diameter) {
        circle2.x = circle1.x + (circle1.width * Math.cos(angle));
        circle2.y = circle1.y + (circle1.width * Math.sin(angle));
    }
}
0 голосов
/ 19 августа 2012

Я сделал это с JQuery. Вот математика позади - без тригонометрических функций.

Сделайте небольшой шаг одним мячом в нужном направлении.

       function pushball(distance,x,y,xgoal,ygoal,step){/
                var factor=1-step/distance;
                var x=xgoal+(xgoal-x)*factor;
                var y=ygoal+(ygoal-y)*factor;
                return [x,y];

Проверьте все другие шары [i], сталкиваются ли они.

        function distance(x1,y1,x2,y2){
                 var x=x1-x2;var y=y1-y2;
                 return Math.sqrt(x*x+y*y);
                 }
        var dist=distance(x,y,x[i],y[i]);
        var touch=r+r[i];

Теперь - по прямой линии, проходящей через две центральные точки, - толкните другие шары (если они столкнутся), чтобы они просто касались друг друга.

        if(dist<touch){
          var range=dist-touch;
          newposxy=pushball(distance,x,y,x[i],y[i],range);
          }

Слайд каждого шара [i], позиция которого изменилась. Помните, что x, y - это координаты средней точки, а не верхнего левого угла. . $ ( "# Шар") смещение ({ "влево": Math.round (х [I] -r), "верх": Math.round (у [I] -г)});

Если вы хотите, чтобы это работало, смотрите здесь

0 голосов
/ 08 января 2012

Вместо того, чтобы изобретать велосипед, подумайте об использовании существующего 2D физического движка. Он сделает все обнаружение столкновений за вас, будет быстрым и, вероятно, предоставит вам множество интересных функций бесплатно.

JBox2D - это порт Java популярного 2D физического движка с открытым исходным кодом Box2D . Хорошее место для начала.

...