Идеальный круг в идеальный круг и идеальный круг в прямолинейное столкновение HANDLING в Java

Я новичок в Java, но решил сделать приложение, в котором прыгает куча шаров. Пожалуйста, имейте в виду, что я почти ничего не знаю о нормалях, о которых я много раз упоминал в подобных темах. Я также изучил только Алгебру 1 и немного знаю тригонометрию (грех, косинус и тангенс). В любом случае...

Я включил обнаружение столкновений, используя
if (java.awt.geom.Point2D.distance(X1, Y1, X2, Y2) < ball1.radius + ball2.radius) {return true;} else {return false;}

и if (ball.x + ball.radius > getWidth) {COLLISION}

и так на все четыре стены

Что мне нужно сделать, так это обрабатывать эти столкновения полуреалистичным образом, помимо переключения скоростей и направлений.

Все рисуется в JPanel

заранее спасибо за помощь


person Bob Twinkles    schedule 11.07.2010    source источник


Ответы (2)


Вам нужно будет понять, что такое нормаль, чтобы рассчитать вектор отражения при столкновении. К счастью, это не очень сложно понять. Для любителей математики я буду немного неточен, поэтому, пожалуйста, не бейте меня за это. :)

Нормаль — это просто единичный вектор (единица измерения: величина = 1), ортогональный (под углом 90 градусов) к поверхности. Вы можете визуализировать нормаль как стрелку, торчащую прямо из поверхности. Поскольку ваши стены не наклонены, определить нормали для них легко (при условии, что верхний левый угол вашего экрана здесь равен 0,0):

top: (0,1)
bottom: (0,-1)
left: (1,0)
right: (-1,0)

Что нам нужно сделать, так это взять скорость вашего мяча и «отразить» ее вдоль вектора нормали к стене, о которую вы ударились. Формула отражения следующая:

V2 = V1 - 2*N*(N.dot(V1))

Где V1 — вектор вашего падения (в данном случае ваша старая скорость), N — нормаль стены, в которую мы врезались, а V2 — вектор отражения (ваша новая скорость). «N.dot(V1)» — это «точечный продукт» N и V1, который равен (N.xV1.x + N.yV1.y).

Картинка из Википедии того, что мы делаем (P — вектор падения, Q — вектор отражения):

alt text

Вот все это в псевдокоде:

float nx = 0, ny = 1; // replace these with the normal of the wall you hit
float ix = ball.vx, iy = ball.vy; // incident vector
float dotprod = (nx*ix + ny*iy); // the dot product i mentioned earlier

ball.vx = ix - 2*nx*(dotprod);
ball.vy = iy - 2*ny*(dotprod);

Дайте мне знать, если что-то неясно. :) Кроме того, хотя для стен это излишество, вам нужно будет вычислить нормаль при столкновении мяча с мячом, так что это не пустая трата времени...

person Faisal    schedule 11.07.2010

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

person trashgod    schedule 11.07.2010