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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2010, 18:32   #1
iMax`
 
Регистрация: 28.12.2010
Сообщений: 9
По умолчанию Траектория полета снаряда...

В общем проблема следующая. У меня выходит, но неправильно просчитать траекторию полета снаряда. А может и правильно... Вот как он должен лететь(я так думаю).

Короче проблема вот в чем.
1) У меня не получается привязаться к углу(когда меняю угол то не снаряд летит по-другому, а координата Y начала полета меняется.
2) В данной ситуации очень легко попасть в танк противника, ведь снаряд летит очень низко. Проблема в методах bulletfly() и Bullet();
V по умолчанию стоит 30;


Код:
Атрибуты:
        double XlenghtDulo;             //Х-координата начала дула
        double YheightDulo;             //Y-координата начала дула
        int X;                          //Х-координата центра танка
        int Y;                          //Y-координата центра танка
        float Alph;                     //Угол наклона дула
        int TankWidth;                  //Высота танка
        int TankHeight;                 //Ширина танка
        bool LeftTank;                  //Проверка танка(левый или правый)
        int LenghtDulo;                 //Длина дула
        int R;                          //Радиус поворота дула
Методи:
        float Bullet(int V, TCanvas* List);           //Считаем полет снаряда
        void TankDuloMove(float, TCanvas* List);          //Двигаем дуло
        void TankShow(TCanvas* List);    //рисуем танк на экран
        void TankDel(TCanvas* List);     //Удаление танка
        int kill(float B);               //Проверка убийства
        void bulletfly(float xx, float yy, TCanvas* List); //Полет снаряда
 

void TTank::TankDuloMove(float step, TCanvas* List)
{
                if (active)
                {
                         XlenghtDulo = XlenghtDulo - step;
                         if(!(fabs(XlenghtDulo) <= R))
                         XlenghtDulo = XlenghtDulo + step;
                         TankDel(List);
                         TankShow(List);
                         Alph = atan( (- pow((R*R - XlenghtDulo*XlenghtDulo), 1.0/2.0) + Y - int(TankHeight / 2 + TankHeight / 4) - Y - int(TankHeight / 2 + TankHeight / 4)) /  XlenghtDulo) ;
                }
};

 
void TTank::InitTank(bool LT)
{
        Lives = 3;
        LeftTank = LT;
        TankWidth = 40;
        TankHeight = 15;
        LenghtDulo = 5;
        YheightDulo = 35;
        if (LeftTank)
        {
                active = true;
                
                XlenghtDulo = 24;
                X = int(LeftBord / 2);
                Y = Gorizont - int(TankHeight / 2);
        }
        else
        {
                active = false;
                XlenghtDulo = -24;
                X = RightBord + int((Xmax - RightBord) / 2);
                Y = Gorizont - int(TankHeight / 2);
        }
        R = fabs(XlenghtDulo);
        Alph = atan( (- pow((R*R - XlenghtDulo*XlenghtDulo), 1.0/2.0) + Y - int(TankHeight / 2 + TankHeight / 4) - Y - int(TankHeight / 2 + TankHeight / 4)) /  XlenghtDulo) ;

};

Последний раз редактировалось iMax`; 28.12.2010 в 18:40.
iMax` вне форума Ответить с цитированием
Старый 28.12.2010, 18:34   #2
iMax`
 
Регистрация: 28.12.2010
Сообщений: 9
По умолчанию

Продолжение... сори если не правильно засунул.
Код:
float TTank::Bullet(int V,int n, TCanvas* List)
{
        if (LeftTank && active)
                 {
                    //  float y =  - pow((R*R - XlenghtDulo*XlenghtDulo), 1.0/2.0) + Y - int(TankHeight / 2 + TankHeight / 4);
                      float g=9.81;
                    //  float x = V*pow((2*y)/g,1.0/2.0);
                      float t = 1.5;
                      float x = /*X 400*/(n*10)+ V * sin(fabs(Alph))*t;
                      float y = Y - V*cos(fabs(Alph))*t + (g * t*t)/2;
                      List->Pen->Color=clBlue;
                      bulletfly(x,y,List);
                      return x+X+XlenghtDulo;
                 }
        if (!LeftTank && active)
                 {
                     //  float y = - pow((R*R - XlenghtDulo*XlenghtDulo), 1.0/2.0) + Y - int(TankHeight / 2 + TankHeight / 4);
                       float g=9.81;
                      // float x = V*pow((2*y)/g,1.0/2.0);
                      float t = 1.5;
                      float x =/* X -400*/ (n*10)+  V * sin(fabs(Alph))*t;
                      float y = Y - V*cos(fabs(Alph))*t + (g * t*t)/2;

                       List->Pen->Color=clBlue;
                       bulletfly(x,y,List);
                       return X - x + XlenghtDulo ;
                 }
};
//---------------------------------------------------------------------------
void TTank::bulletfly(float xx, float yy, TCanvas* List)
{
        float y_;
        float tmpx = 1;
        float tmpy;
        if(LeftTank)
        {
                while(tmpx<=xx)
                {
                        tmpy = pow( ((1 - (tmpx*tmpx) / (xx*xx)) * yy*yy ), 1.0 / 2.0);
                        y_ = (tmpy - yy)*(Gorizont - yy) / (-yy) + yy;
                        List->Pen->Color=clBlack;
                        List->Brush->Color=clWhite;
                        List->Ellipse(tmpx+X+ XlenghtDulo - 2, y_ - 2,tmpx+X+ XlenghtDulo + 2,y_ + 2);
                        int time = GetTickCount();
                        while((GetTickCount()-time)<1)
                               {
                                       Application->ProcessMessages();
                               }
                        TankShow(List);
                        List->Brush->Color=clWhite;
                        List->Pen->Color=clWhite;
                        List->Ellipse(tmpx+X+ XlenghtDulo - 2, y_ - 2,tmpx+X+ XlenghtDulo + 2,y_ + 2);
                        tmpx = tmpx + 8;
                };
        }
        else
        {
                while(tmpx<=xx)
                {
                  tmpy = pow( ((1 - (tmpx*tmpx) / (xx*xx)) * yy*yy ), 1.0 / 2.0);
                        y_ = (tmpy - yy)*(Gorizont - yy) / (-yy) + yy;
                        List->Pen->Color=clBlack;
                        List->Brush->Color=clWhite;
                        List->Ellipse(-tmpx+X + XlenghtDulo - 2, y_ - 2,-tmpx+X + XlenghtDulo + 2,y_ + 2);
                        int time = GetTickCount();
                        while((GetTickCount()-time)<1)
                                {
                                        Application->ProcessMessages();
                                }
                        TankShow(List);
                        List->Brush->Color=clWhite;
                        List->Pen->Color=clWhite;
                        List->Ellipse(-tmpx+X + XlenghtDulo - 2, y_ - 2,-tmpx+X + XlenghtDulo + 2,y_ + 2);
                        tmpx = tmpx + 8;
                };
        }

Последний раз редактировалось iMax`; 28.12.2010 в 18:39.
iMax` вне форума Ответить с цитированием
Старый 28.12.2010, 19:17   #3
Error_kpi
Пользователь
 
Регистрация: 23.06.2010
Сообщений: 17
По умолчанию

float t = 1.5;
это чо время полета????
Код:
 float t = 1.5;
                      float x = /*X 400*/(n*10)+ V * sin(fabs(Alph))*t;
                      float y = Y - V*cos(fabs(Alph))*t + (g * t*t)/2;
Насколько я помню физику g * t*t здесь стоит время в квадрате - тоесть выходит у тебя время не меняется - как он у тебя вообще летит????
t- это должна быть переменная величина, поскольку х и у - это функции времени!
Error_kpi вне форума Ответить с цитированием
Старый 28.12.2010, 19:30   #4
iMax`
 
Регистрация: 28.12.2010
Сообщений: 9
По умолчанию

Я пробовал брать системное время но ничего не вышло... Как мне тогда поступить?
iMax` вне форума Ответить с цитированием
Старый 28.12.2010, 19:32   #5
Error_kpi
Пользователь
 
Регистрация: 23.06.2010
Сообщений: 17
По умолчанию

А вообще-то по правильному нужно делать так:
Выражаешь из уравнений x(t)=... и y(t)=.... переменную t. Приравниваешь правые части и получаешь уравнение y(x) - которое и называется траекторией. Только не забудь поставить ограничения на y>"уровень земли" - ну в том смысле что-бы снаряд под землю у тебя не ушел, а Х у тебя будет меняться от координаты дула до у<"уровень земли"

Так у тебя только одна формула получится, зависящая от g, угла и V. По моему, так проще.
Error_kpi вне форума Ответить с цитированием
Старый 28.12.2010, 22:25   #6
iMax`
 
Регистрация: 28.12.2010
Сообщений: 9
По умолчанию

Спс конечно, но я ничего не понял...
iMax` вне форума Ответить с цитированием
Старый 28.12.2010, 23:51   #7
Mariner
Новичок
Джуниор
 
Регистрация: 01.02.2010
Сообщений: 1
По умолчанию

поддерживаю предложение. По-моему, проще взять готовую формулу из баллистики. Там, после всяких упрощений, получится неплохо. Только вопрос: интересно будет?
Mariner вне форума Ответить с цитированием
Старый 29.12.2010, 07:12   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Итак, у нас нет сопротивления воздуха, снаряд представляет собой материальную точку, не вращается, вращением земли и всякие там кориолисовы силы не учитываем, равно как и полеты птиц и башни ПБЗ.
Начальные проекции скорости:
Vx0 = V0 * cos(alpha);
Vy0 = V0 * sin(alpha);
Координаты снаряда в произвольный момент времени на интервале t0 < t < T (T - момент падения на землю):
X(t) = X0 + Vx0 * (t - t0);
Y(t) = Y0 + Vy0 * (t - t0) - g * (t - t0)^2 / 2;
Если примем t0 = 0, то
X(t) = X0 + Vx0 * t;
Y(t) = Y0 + Vy0 * t - g * t * t / 2;
Время падения на землю:
Y(T) = 0 = Y0 + Vy0 * T - g * T * T / 2;
Примем, что Y0 = 0
Vy0 * T - g * T * T / 2 = 0;
=> T * (Vy0 - g * T / 2) = 0;
T1 = t0 = 0, T2 = T = 2 * Vy0 / g;
Этого вам хватит за глаза.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Траектория полёта deel Помощь студентам 15 01.12.2010 10:11
Расчет полета ракеты reydor Помощь студентам 0 05.10.2010 15:46
Delphi: траектория движения круга Sianessa Помощь студентам 10 25.01.2010 17:31
Построение траектории полета пули V@mpir Общие вопросы Delphi 0 11.12.2009 19:07
Рассчитать время полета ракеты. VC++ C71Me Помощь студентам 5 22.02.2009 19:03