Столкновение шаров

  • Автор темы areostar
  • Дата начала
A

areostar

#1
Здраствуйте! Вообще-то моя прога на Action Script 3.0 (Flash). Но вопрос по сути алгоритме!!

игра которую я разрабатываю чем-то схожа с билиардом! нашёл в сети функцию обработки сталкновения:

Код:
private function collideBall(ballA:Ball,ballB:Ball):void
{
var plotnost = 0.95; 

/**
* Находим точку столкномвения
* (Центр отрезка между двумя центрами)
**/
var cx = (ballA.tx + ballB.tx)/2;
var cy = (ballA.ty + ballB.ty)/2;

/**
* Находим Растояние между шарами
* (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
**/
var d = geom.distance(ballA.tx, ballA.ty, ballB.tx, ballB.ty)/2;

/**
* Сдвигаем шарики (отскок)
* (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
**/
ballA.tx = cx + (_ballRadius) * (ballA.tx - ballB.tx)/2/d;
ballA.ty = cy + (_ballRadius) * (ballA.ty - ballB.ty)/2/d;

ballB.tx = cx + (_ballRadius) * (ballB.tx - ballA.tx)/2/d;
ballB.ty = cy + (_ballRadius) * (ballB.ty - ballA.ty)/2/d;


/**
* Сдвигаем шарики промежуточное положение
* (Может быть и меньше 2х радиусов, необходима для выравнивания шара)
**/
ballB.tx = ballB.tx - ballB.speedX/_delimiter;
ballB.ty = ballB.ty - ballB.speedY/_delimiter;

ballA.tx = ballA.tx - ballA.speedX/_delimiter;
ballA.ty = ballA.ty - ballA.speedY/_delimiter;

/**
* Получаем скорости шаров
**/
var v1 = Math.sqrt(ballA.speedX * ballA.speedX + ballA.speedY * ballA.speedY);
var v2 = Math.sqrt(ballB.speedX * ballB.speedX + ballB.speedY * ballB.speedY);

/**
* Получаем углы наклона скоростей к оси OX
**/
var fi1 = Math.atan2(ballA.speedY,ballA.speedX);
var fi2 = Math.atan2(ballB.speedY,ballB.speedX);

/**
* Получаем углы наклона между линией соединяющей центры шаров и осью OX
**/
var lambda1 = Math.atan2(ballB.ty - ballA.ty, ballB.tx - ballA.tx);
var lambda2 = Math.atan2(ballA.ty - ballB.ty, ballA.tx - ballB.tx);

/**
* Получаем проекции скоростей на соединяющую линию между шарами
**/
var pv1 = v1 * Math.cos(lambda1 - fi1)*plotnost;
var pv2 = v2 * Math.cos(lambda2 - fi2)*plotnost;

/**
* Получаем новые скорости (векроты направления)
**/
ballA.speedX = ballA.speedX - pv1 * Math.cos(lambda1) + pv2 * Math.cos(lambda2);
ballA.speedY = ballA.speedY - pv1 * Math.sin(lambda1) + pv2 * Math.sin(lambda2);

ballB.speedX = ballB.speedX - pv2 * Math.cos(lambda2) + pv1 * Math.cos(lambda1);
ballB.speedY = ballB.speedY - pv2 * Math.sin(lambda2) + pv1 * Math.sin(lambda1);
}
В принципе работает но...

Одно из главных отличий от билиарда в том чтто один из игровых снорядов(продолжим называть их шарами) значительно больше остальных! В реале у большенства диаметр 3,5 а у большого 5!

какие поправки в алгоритм мне надо внести с учётом этого! поподробнее если можно! подобную прогу пишу в первый раз!!!
 
B

berserker

#2
Ну вообще, если по - простому рассуждать, то у этих шаров соответственно масса (5)^3 к (3,5)^3 следовательно нужно в параметре speedX и speedY учесть эту пропорцию . Если изучали физику, то вспомните закон сохранения импульса. Только надо это отношение отнести не к каждой проекции, а к т. н. вектору скорости, а потом разложить на проекции (эта процедура я думаю в алгоритме уже есть). Также можно заметить, что измениться угол скоростей по проекции Z на величину arctg ((R-r)/(2*sqrt(R*r)), поэтому скорость по проекциям X и Y опять таки уменьшиться. Для удобства советую нарисовать два шара и вектор скорости в 3-х пр-ве, и аккуратненько разложить все по проекциям...

P/S Надеюсь я не поздно заметил данную тему)