Идеальный круг для идеального круга и Идеальный круг для столкновения с прямой Обработка в 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

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

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, которое просто (NxV1.x + Ny V1.y).

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

альтернативный текст

Вот все это в 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);

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

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

Другие вопросы по тегам