![]() |
|
|
![]()
|
|
| MasterSID |
|
|||
|
Unregistered |
Хотел вот написать бильярдно-подобную игру, но вот проьлема - не силен в физике.
В общем-то сама модель уже написана, но на кривых формулах. Я бы хотел чтобы взаимодействие шаров зависило от их массы, моя же формула этого не учитывает. Т.е. на входе мы имеем массу шара, его объем, направление и скорость/энергию, а на выходе нужно получить клевую модель взаимодействия. Кроме того, в моей модели столкновением шаров считается пересечение их площадей. Но иногда возникает такая ситуация, когда на следующем шаге два пересекшихся шара не "расстаются" и программа считает, что они столкнулись снова и так обычно продолжаетя пока они полностью не погасят энергию друг друга, т.е. создается эффект того, что они слиплись. Я вроде бы придумал как это обойти: если имеет место пересечение площадей, то нужно определеить где находился шар, когда площади не пересекались, а соприкасались. Затем передвинуть его в это место и провести перерсчет. Вести эти перерасчеты до тех пор, пока не будет ни одного пересечения и только тогда продолжать обрабатывать не пересекающиеся шары. В общем-то просьба помочь с формулами столкновения и движения, а также определения где был шар в момент удара (до пересечения площадей шаров). Заранее спасибо |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
1) Это надолго - рекомендую зарегистрироваться.
2) Соударение считается упругим - следовательно система из 2 линейных уравнений: сохранение энергии и импульса (векторно). 3) Соударение - если расстояние между центрами = сумме радиусов, и никаких площадей. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Амортизатор |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 17.4.2005 Где: в Караганде Репутация: нет Всего: 8 |
Вообще-то если не считать шары "материальными точками" (как любили говорить в школе
-------------------- Поехали! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
я плакаль! -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
ну вращение в любом случае придется учитывать
а то получится слишком идеальная система - если посмотреть, как отлетают шарики в бильярде, то угол отражения совсем не равен углу падения... -------------------- qqq |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
именно. и различие трения справа и слева от точки касания. однако это не Кориолис... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| MasterSID |
|
|||
|
Unregistered |
Да, именно по сумме двух радиусов я и определяю столкновение, просто я слово площадь для пущей убедительности написал
Проблема все равно имеет место быть. Сильно крутых расчетов мне не нужно. Главное просто чтобы шары летали более менее реалистично. углы у меня считаются так: &$hiter - экземпляр шара, столкнувшегося с данным Energy - энергия шара. На каждом шаге уменьшается на 0.01 GetCenter - возвращает координаты центра шара GetDIrection - возвращает угол, под которым шар движется M_PI - константа PI если что-то не понятно - поясню function HitBy(&$hiter){ $hiter->SetEnergy($hiter->GetEnergy()-$hiter->GetEnergy()*0.5); $this->energy+=$hiter->GetEnergy(); $hiter->GetCenter(&$h_x, &$h_y); $this->GetCenter(&$x, &$y); $this->SetDirection($this->HitAngle($x-$h_x, $y-$h_y)); $da= $hiter->GetDirection() - $this->GetDirection(); $hiter->SetDirection($hiter->GetDirection()+$da); } function HitAngle($x, $y){ if ( abs($x) < 0.05 ) $na = M_PI/2; else $na = atan(abs($y/$x)); if ( $x < 0 ) $na = M_PI - $na; if ( $y < 0 ) $na = -$na; return (float)$na; } |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Интересно, а твои шары могут "подскакивать" и затем соударяться?
|
|||
|
||||
| MasterSID |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 15.8.2005 Репутация: нет Всего: нет |
В смысле подскакивать? В трехмерном пространстве? Нет - все действие происходит только в одной плоскости - в 2х мерном пространстве. Задача банальная, но опять же повторюсь - я не очень силен в физике
|
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Но сделай сначала, чтобы удары были центральными. А потом, когда это будет готово, делай так:
Я думаю, что любой удар не "центр в центр" от одной точки отсчета является центральным от другой. Но это, как я сказал, потом, наверно -------------------- Всем добра |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Да, но эта "другая" система координат не является инерционной:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| MasterSID |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 15.8.2005 Репутация: нет Всего: нет |
Нет, ну углы высчитываются более-менее правдоподобно. Мне нужны формулы движения и определения местонахождения шара в определенный момент времени. желательно чтобы все это было завязано на dX и dY
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Забудь про направления и углы. Оперируй только векторами. Отсчет положения всегда производи не от предыдущего положения, а от предыдущего столкновения. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: нет Всего: 115 |
Кстати можно добавить рандомное искажение траэктории движения (это придаст небольшую реалистичность), ибо сукно не бывает идеальным.
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
это не влияет на алгоритмы расчета, пока необязательно. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |