Идеальный круг к идеальному кругу и Идеальный круг к прямому столкновению ОБРАЩЕНИЕ в Java - PullRequest
3 голосов
/ 11 июля 2010

Я новичок в 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

Спасибо за вашу помощь заранее

Ответы [ 2 ]

4 голосов
/ 11 июля 2010

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

Нормаль - это просто единичный вектор (единица измерения: = 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.x V1.x + N.y V1.y).

Изображение из Википедии о том, что мы делаем (P - вектор инцидента, Q - отраженный вектор):

alt text

Вот все это в psuedocode:

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);

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

1 голос
/ 11 июля 2010

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

...