Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм сталкновения 
:(
    Опции темы
Areostar
Дата 24.1.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1191
Регистрация: 5.4.2008

Репутация: нет
Всего: -2



Здраствуйте! Вообще-то моя прога на 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!

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


PM MAIL   Вверх
Areostar
Дата 7.2.2010, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1191
Регистрация: 5.4.2008

Репутация: нет
Всего: -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;


Было сказано что этот код предотвращает пролёт шарика сквозь шарик! вот тока как вычеслить значение для переменной _delimiter ???  
        

PM MAIL   Вверх
SoWa
Дата 8.2.2010, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Ух, я тебя пожалуй в алгоритмах и ЦП продублирую.
Тут такой вопрос не на месте smile
Вечером если будет не лень- вникну в твой код и скажу ответ smile


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Фантом
Дата 8.2.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 2
Всего: 49



Цитата(Areostar @  7.2.2010,  08:08 Найти цитируемый пост)

Было сказано что этот код предотвращает пролёт шарика сквозь шарик! вот тока как вычеслить значение для переменной _delimiter ???  

М-да, код написан... как бы так помягче выразиться... через одно известное место.

_delimiter - это (судя по смыслу) величина, обратная к времени. Похоже, что его автор пытался таким образом выделить небольшой временной интервал в окрестности собственно столкновения. Соответственно, значение _delimiter должно быть достаточно большим - стоит поставить сначала что-то большое положительное, а потом постепенно уменьшать, проверяя, что результат выглядит правдоподобно.
PM   Вверх
Spiker
Дата 15.2.2010, 13:48 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 25.5.2005
Где: Спортзал

Репутация: нет
Всего: -2



ты картинку нарисуй на граф бумаге и все силы на ее помести и будеш знать что писать.
можно использовать импульс для решение данной задачи. Там и скорость и вес тоже.

В каком классе у нас импульс изучают?

Это сообщение отредактировал(а) Spiker - 15.2.2010, 13:48


--------------------
Даваите жить дружно! (Леопольд.) :shy67:
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.