Разделение двух встречных кругов - PullRequest
2 голосов
/ 01 сентября 2011

Я пытаюсь разделить два круга, которые сталкиваются. Благодаря помощи других, я прямо там!

Это мой код:

var totalRadius : Number = _circle1.radius + _circle2.radius;
var x : Number = _circle1.position.x - _circle2.position.x;
var y : Number = _circle1.position.y - _circle2.position.y;

var distanceSquared : Number = (x * x) + (y * y);

if (distanceSquared < totalRadius * totalRadius)
{   
    var distance : Number = Math.sqrt(distanceSquared);

    var separation : Number = totalRadius - distance;

    var unitVectorX : Number = (_circle1.position.x - _circle2.position.x) / distance;
    var unitVectorY : Number = (_circle1.position.y - _circle2.position.y) / distance;

    _circle1.position.x += unitVectorX * (separation / 2);
    _circle1.position.y += unitVectorY * (separation / 2);

    _circle2.position.x -= unitVectorX * (separation / 2);
    _circle2.position.y -= unitVectorY * (separation / 2);
}

Отлично работает, если круги имеют одинаковую скорость. Проблема возникает, когда они имеют разные скорости, и проблема в том, что я разделяю разделение равномерно (separation / 2) Я думаю!

Все работает отлично, если circle1 имеет скорость 1,0, а circle2 имеет скорость -1,0. Два круга ударяются друг о друга и останавливаются.

Если круг 1 имеет скорость 2,0, а круг 2 имеет скорость -1,0, круги постепенно сдвигаются вправо. Я думаю, что это то, что происходит:

frame1:

  • круг1 (99, 100)
  • круг 2 (101, 100)

frame2:

  • circle1 (101, 100)
  • circle2 (100, 100)
  • обнаружено столкновение, исправлено положение -0,5 и +0,5 соответственно.
  • circle1 (100,5, 100)
  • circle2 (100,5, 100)

frame3:

  • круг1 (102,5, 100)
  • circle2 (99,5, 100)
  • обнаружено столкновение, исправлено положение -1,5 и +1,5 соответственно.
  • circle1 (101, 100)
  • circle2 (101, 100)

frame4:

  • circle1 (103, 100)
  • circle2 (100, 100)
  • обнаружено столкновение, исправлено положение -1,5 и +1,5 соответственно.
  • круг1 (101,5, 100)
  • circle2 (101,5, 100)

Как видите, оба круга набирают +0,5 вправо из-за разницы в скорости.

Итак, наконец, мой вопрос: как я могу учесть их скорость в уравнении, чтобы она не играла роль в их разделении?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

Вам нужно вычислить точку удара, а не просто (произвольно) перемещать их обоих назад в равной степени.

Быстрый поиск нашел следующие ссылки:

  1. http://www.t3hprogrammer.com/research/circle-circle-collision-tutorial#TOC-Static-Circle-Circle-Collision-Dete (раздел «Динамическое столкновение круг-круг»)

  2. http://nonlinear.openspark.com/tutorials/vectors/index.htm (раздел «Воздействие, а не пересечение»)

0 голосов
/ 01 сентября 2011

, чтобы сделать ответ коротким: вам нужно набрать импульс там;)

Как я полагаю, вы хотите, чтобы массы были такими же, как "v1_before ^ 2 + v2_before ^ 2 = v1_after ^ 2 + v2_after ^ 2". Как говорится в вики-статье, я просто "переключаю" скорости.

Что я не понимаю, так это то, почему вы думаете, что оба круга сместятся вправо? Разве это не предположение, что это упругое столкновение? Тогда они должны идти в разных направлениях, если вы хотите, чтобы они имели одинаковую массу.

...