Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2012, 20:04   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Траектория полета тела брошенного под углом к горизонту в трех измерениях.

Добрый вечер. Вопрос следующий. Есть формула для описания траектории полета тела брошенного под углом к горизонту Как будет выглядеть это уравнение в пространстве? При этом нужно учитывать, что мне нужно узнать: пересекает ли траектория куб и т.д. Так же чтобы можно было использовать для моделирования полета мяча. В 2D вариант уже есть. В нем я пользовался формулой приведенной выше.
Заранее благодарю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 26.09.2012, 20:17   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Чем пространство отличается от плоскости? Правильно, как минимум - наличием третьей координаты Z!=0 (кстати, Ваше уравнение обычно записывается системой вместе с Z=0).
По-идее, y - это проекция траектории на плоскость XoY, x - проекция на плоскость XoZ - прямая линия. Проекция на YoZ будет описываться таким же уравнением, только вместо X пишите Z. При этом, если углы Альфа будут равны в обоих проекциях, то прямая X идет под 45 градусами к осям Y и Z (проекции на плоскости одинаковы).

В общем, как-то так.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 26.09.2012 в 20:19.
Sciv вне форума Ответить с цитированием
Старый 27.09.2012, 14:56   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо, очень благодарен.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 18.10.2012, 20:05   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Не получается никак реализовать. Предположим следующее. В моем распоряжении есть вектор(в пространстве), который указывает направление полета. Т.е. можно узнать угол и проекцию траектории на ось XoZ, это как раз и есть прямая. Каким образом мне делать правильную скорость этого тела по данной прямой? Пусть уравнение будет следующим z=x(45 градусов), тогда, если мы будет изменять координату x на x+1, то получается что скорость под любым углом(в плоскости XoZ) будет различаться. Как исправить?
Рассмотрим другой пример. Уравнение равно не z=x (45 градусов) а z=0 т.е. траектория совпадает с осью Z. А ведь мы изменяем координату X. В таком случае мы не сможем сдвинуть объект с места. Если изменять координату Z то понадобится реализовывать мудреную логику. Получится ли как-то сделать это математическим путем?
Надеюсь, что объяснения понятны.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 18.10.2012, 21:01   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Объянения понятны, но это еще фигня! представьте, что проекция на XoZ не прямая, а такая же парабола (например, боковой ветер дул и сносил тело вбок). так что там может быть любая функция на самом деле... А насчет остальново - справедливое замечание, надо подумать...


UPD 1 При Z=0 (так же, как и при X=0 или Y=0) мы получаем частный случай для плоскости (пример которого Вы, кстати, вначале и привели).
То есть по сути так. Стоит человек, его ось - это Y (Вертикальная). Ось Z - по направлению взгляда (прямо вперед и назад), ось X - строго направо и налево. Если он отбивает мяч строго прямо, то значение x=0 и уравнение превращается в зависимость Y и Z - то есть действие происходит в плоскости YoZ; если мяч улетает строго направо (налево), то это уже плоскость XoY.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 18.10.2012 в 21:10.
Sciv вне форума Ответить с цитированием
Старый 18.10.2012, 21:15   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,318
По умолчанию

Мне представляется это так:
Пусть имеем обычную систему координат с направлениями: X - под 45 гр влево, Y - вправо, Z - вверх.
Плоскость X0Y - плоскость горизонта, а Z - высота.

И пусть уравнение, приведенное вами описывает полет тела в некоторой плоскости, которая составляет углы с плоскостями X0Z и Y0Z и перпендикулярна плоскости X0Y.
Т.е. вид уравнения будет таким: Z = f(t), где t - параметр связанный со временем и проекцией скорости тела на плоскость X0Y: t = Vx0y * T.
Тут T - время.
Тогда координата по Z получается из приведенного уравнения, а координаты по X и Y получаются как x=t*sin(a) и y=t*cos(a), где a - угол между осью 0X и проекцией вектора скорости на плоскость X0Y - азимут.
Значение проекции скорости на горизонтальную плоскость постоянно.

И ещё. Изображение в картинной плоскости будет изменяться в зависимости от выбранного типа проекции. Например, соотношение перемещений по осям X и Z может быть одинаковым, а по оси X в два раза меньше (например при расчете размера того же мяча)


Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 06.01.2013, 11:57   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо. Предположим следующее. Ось X идет влево перпендикулярно вектору Вашего взгляда, ось Z параллельно с отрицательным направлением(т.е., чем дальше от Вас, тем меньше координата), а Y вверх. Короче, начальное положение системы в OpenGL. Итак, я слепил такой код, но он как-то не правильно функционирует. Иногда нормально, а иногда шар откланяется от вектора взгляда выше или ниже, т.е. получается угол различен. Можно сказать, что он два раза пересекает прямую, образованную вектором взгляда. Описал движение следующим образом:
z'=z*cos(alpha)*t(равномерное прямолинейное движение)
x'=x*сos(alpha)*t(равномерное прямолинейное, но, учитывая две координаты, по плоскости)
y'=y*sin(alpha)-0.5*g*t

Реализация у меня в виде класса. Инициализацию можно убрать в конструктор, но пока важно найти ошибку. Надеюсь на то, что она очевидная, и я просто не могу заметить. Может что-то не так высчитываю. В общем вот описание класса:
Код:
class Bullet
{
    /* d - direction - Направление, значением является скорость. Проще говоря - это начальная скорость по трем осям x,y,z
       p - position  - Позиция*/
public:
    float px,py,pz; //Координаты позиции снаряда, пули, или какого-нибудь другого тела

    void CreateBullet(float x,float y,float z,
                      float tx,float ty,float tz); // x,y,z - это вектор взгляда
    void NextStep();

private:
    float dx,dy,dz,time; //coord*(sin | cos)
    float tpx,tpy,tpz;
};
Описание методов.
Код:
    // x,y,z ниже - это вектор взгляда
void Bullet::CreateBullet(float x,float y,float z,
                          float tx,float ty,float tz)
 {
     float alpha,a,b;
     a=x*x+z*z;
     b=sqrt(x*x+y*y+z*z)*sqrt(x*x+z*z);
     alpha=acos(a/b); //вычисление угла alpha
     dx=x*cos(alpha);
     dy=y*sin(alpha);
     dz=z*cos(alpha);
     tpx=tx;  tpy=ty;  tpz=tz;  // начальная позиция.
     time=0.0;
 }

void Bullet::NextStep()
 {   px=dx*time+tpx;
     py=(dy*time-4.9*time*time)+tpy; // 4.9 - это ускорение свободного падения деленное на 2
     pz=dz*time+tpz;
     time+=0.01;
 }
Можно переписать код, сделав alpha глобальной переменной. Так будет понятней.
Код:
void Bullet::NextStep()
 {   px=x*cos(alpha)+tpx;
     py=(y*sin(alpha)*time-4.9*time*time)+tpy; // 4.9 - это ускорение свободного падения деленное на 2
     pz=z*cos(alpha)+tpz;
     time+=0.01;
 }
переменные tpx,tpy,tpz - начальная позиция из которой осуществился бросок. Завтра выложу исполняемый файл.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 06.01.2013 в 12:09.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 06.01.2013, 12:02   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Предыдущее сообщение я написал вчера, но забыл отправить. С трудом до меня ночью дошло. Зачем я умножаю на sin или cos в следующем фрагменте?
Цитата:
z'=z*cos(alpha)*t(равномерное прямолинейное движение)
x'=x*сos(alpha)*t(равномерное прямолинейное, но, учитывая две координаты, по плоскости)
y'=y*sin(alpha)-0.5*g*t
Ведь у меня и так готовый вектор. Убрав sin и cos проблема исчезла.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уравнение движения тела, брошенного под углом к горизонту _PROGRAMM_ Помощь студентам 4 20.04.2012 18:13
Движение тела, брошенного под углом к горизонту с учетом сопротивления Encore Помощь студентам 0 03.04.2011 20:34
Движение тела, брошенного под углом к горизонту Medik07 Общие вопросы C/C++ 1 17.03.2011 22:28
Тело, брошенное под углом к горизонту blackberryx Паскаль, Turbo Pascal, PascalABC.NET 9 14.05.2009 01:43
Движение тела под углом Lemo Помощь студентам 6 05.04.2009 14:49