Редактирование: Информатика: Движение тела в среде

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
<div>
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
'''[[Абрамов Игорь]]'''  
+
'''[[Лебедев Станислав]]'''  
  
'''Алгоритм''': в специализированном классе хранятся данные о мяче, функции-члены, задающие различные типы движения тела, функции отрисовки движения мяча. Все расчёты ведутся в режиме реального времени с помощью дополнительных функций. Отрисовка движения мяча происходит с помощью графических средств библиотеки OpenGL.
+
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
 +
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
'''Инструкция''': при запуске программы пользователь видит полёт четырёх мячей в замкнутом пространстве с равными начальными условиями, но различными алгоритмами движения. При желании изменить тип движения мяча достаточно изменить лишь название функции движения конкретного объекта в функции Display.
+
Скачать можно  [http://tm.spbstu.ru/Файл:Шарик.rar тут].
  
Ссылка для скачивания: [http://tm.spbstu.ru/File:Ball_Abramov.rar]
+
<div class="mw-collapsible-content">
  
</div>
+
[[File:1.png]]
  
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
'''Визуализированный результат работы программы'''
'''[[Андреева Полина]]'''
+
[[File:graph.png]]
  
'''Краткое описание алгоритма''': в классе находятся координаты по формулам и записываются в файл.
+
# o1 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
# o2 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# o3 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# o4 - координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
''' Инструкция ''':
 
Пользователь должен ввести начальную скорость, угол и шаг, с которым будут рассчитываться координаты. В файл координаты записываются в таком порядке: 1, 2 столбики - Координаты, рассчитанные по формуле, при движении без сопротивления воздуха; 3, 4 - Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости; 5,6 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости; 7,8 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости.
 
  
Скачать можно  [http://tm.spbstu.ru/File:ТраекторияАнПол.rar тут].
+
Для тела с массой 10,сопротивлением воздуха 1, угол бросания 30°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2;
  
 +
''Примечание: графики o1 и o2 намеренно посчитаны с малой точностью, чтобы графики не сливались.''
  
<div class="mw-collapsible-content">
+
Файл "'''main.cpp'''"
 
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
+
#include <iostream>
'''Визуализированный результат работы программы'''
+
#include <math.h>
 
+
#include "Vector.h"
[[:File:graphAP.png]]
+
#include <cstring>
 +
#include <cmath>
 +
#include <malloc.h>
 +
#include <fstream>
  
Для тела с массой 1 кг,сопротивлением воздуха 0.001, угол бросания 60°, начальная скорость 50 м/с, ускорение свободного падения 9.8 м/c^2, шаг 0.00001;
+
using namespace std;
  
# "MyFile.txt" using 1 : 2 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
+
int n = 100;
# "MyFile.txt" using 3 : 4 -  Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
+
ofstream outfile;
# "MyFile.txt" using 5 : 6 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
# "MyFile.txt" using 7 : 8 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости.
 
  
 
+
class Ball                                          //класс бросаемого тела
 
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <iostream>
 
#include <fstream>
 
#include "math.h"
 
#include <iomanip>
 
using namespace std;
 
class func
 
 
{
 
{
 +
    private:
 +
        double angle,m,k;                          //угол броска,масса,коэффицент сопротивления воздуха
 +
        Vector3D r,v,a;                            //радиус-вектор,вектор скорости,ускорения
 +
    public:
  
private:
+
        //задание начальных параметров через угол,начальное положение,скорость и ускорение,с которым движется тело. Без сопротивления воздуха
    double speed0, angle0, step ;
+
        Ball(double _angle, Vector3D _r, Vector3D _v, Vector3D _a)
  double time;
+
        {
 +
            angle = _angle;
 +
            r    = _r;
 +
            v    = _v;
 +
            a    = _a;
 +
        }
  
  public:
+
        //задание начальных параметров через угол,начальное положение,скорость и ускорение,с которым движется тело. Без сопротивления воздуха
      double const g=9.8, n=0.001, m=1;///постоянная g, n-коэфициент сопротивления воздухаб m-масса
+
        Ball(double _angle, double _m, double _k, Vector3D _r, Vector3D _v, Vector3D _a)
      double t, amount;
+
        {
      int amountint;
+
            angle = _angle;
    func ( double _speed0, double _angle0, double _step ):speed0(_speed0), angle0(_angle0), step(_step)
+
            r    = _r;
     {
+
            v    = _v;
        angle0=(3.14159*angle0) / 180 ; ///перевод угла в радианы
+
            a    = _a;
 +
            m     = _m;
 +
            k    = _k;
 +
        }
  
         time = ( 2*speed0*sin(angle0) ) / g;///подсчет полного времени полета
+
         //точная формула зависимости координаты от времени
        amount = (time/step) + 1;///количество точек для траектории
+
        Vector3D positionReal(double t)
         amountint =  static_cast<int> (amount) ;
+
        {
 +
            double c1 = m/k,c2 = fabs(a.y)*c1, c3 = exp(-t/c1), c4 = c2*t;
 +
            return MakeVector(v.x*c1*(1 - c3), c1*(v.y + c2)*(1 - c3) - c4 , 0 );
 +
         }
  
 +
        //вывод положения на экран
 +
        void writePosToScreen()
 +
        {
 +
            cout << r.x << "  " << r.y << "  " << r.z << endl;
 +
        }
  
    }
+
        //вывод положения в файл
 +
        void writePosToFile(char s[])
 +
        {
 +
            outfile.open(s,ios :: app);
 +
            outfile << r.x << "          " << r.y << endl;
 +
            outfile.close();
 +
        }
  
 +
        //вывод произвольного вектора на экран
 +
        void WVTS(Vector3D v)
 +
        {
 +
            cout.width(15);
 +
            cout << v.x;
 +
            cout.width(15);
 +
            cout << v.y;
 +
            cout.width(15);
 +
            cout << v.z << endl;
 +
        }
  
 +
        //вывод произвольного вектора в файл
 +
        void WVTF(Vector3D v,char s[])
 +
        {
 +
            outfile.open(s,ios :: app);
 +
            outfile << v.x << "          " << v.y << endl;
 +
            outfile.close();
 +
        }
  
      void SaveFile(char filename[])
+
         //"пересчет" координаты по Верле(Линейная зависмость)
    {
+
         void changeR(Vector3D r1, double dt)
        double x0=0, y0=0;
 
         double xv1=0, x1=0, y1=0, Vx1=speed0*cos(angle0),Vy1=speed0*sin(angle0), V1=speed0, yv1=0;
 
         double xm1=x0-speed0*cos(angle0)*step, ym1=y0-speed0*sin(angle0)*step;
 
        double xv2=0, x2=0, y2=0, Vx2=speed0*cos(angle0),Vy2=speed0*sin(angle0), V2=speed0, yv2=0;
 
        double xm2=x0-speed0*cos(angle0)*step, ym2=y0-speed0*sin(angle0)*step;
 
        double x3,y3;
 
        std::ofstream fout(filename);
 
        for (int i=0; (y0+(speed0*sin(angle0)*i*step - (g*i*i*step*step*0.5)))>=0; i++)
 
 
         {
 
         {
             ///Верле линейная зависимость
+
             r = MakeVector(2 * r.x - r1.x - k/m*v.x*dt*dt,2*r.y - r1.y - (abs(a.y) + k/m*v.y)*dt*dt, 0 );
            x2=2*xv2-xm2-(n/m)*step*step*Vx2;
+
        }
            y2=2*yv2-ym2-(g+(n/m)*Vy2)*step*step;
 
            Vx2=(x2-xm2) / (2.0*step);
 
            Vy2=(y2-ym2) / (2.0*step);
 
            xm2=xv2;
 
            xv2=x2;
 
            ym2=yv2;
 
            yv2=y2;
 
  
            ///точное решение
+
        //"пересчет" координаты по Верле(Квадратичная зависимость)
             x3=x0+speed0*cos(angle0)*(m/n)*(1.0-exp(-(n/m)*i*step));
+
        void changeRSQ(Vector3D r1, double dt)
             y3=y0+(m/n)*(speed0*sin(angle0) + g*(m/n))*(1.0-exp(-(n/m)*i*step))-g*(m/n)*i*step;
+
        {
 +
             r = MakeVector(2 * r.x -  r1.x - k/m*Length(v)*v.x*dt*dt,2*r.y - r1.y - (abs(a.y) + k/m*Length(v)*v.y)*dt*dt, 0 );
 +
        }
 +
        //пересчет скорости по Верле
 +
        void changeV(Vector3D r1,double dt)
 +
        {
 +
             v =VS((VmV(r,r1)),1/(2*dt));
 +
        }
  
            ///метод Верле, квадратичная зависимость
+
        //рассчет предыдущегт к 0ому элементу
            x1=2*xv1-xm1-(n/m)*step*step* Vx1 * V1;
+
        Vector3D MR1(double dt)
            y1=2*yv1-ym1-(g+(n/m)*V1*Vy1)*step*step;
+
        {
             Vx1=(x1-xm1) / (2.0*step);
+
             return MakeVector(r.x - v.x * dt,r.y - v.y * dt,0);
            Vy1=(y1-ym1) / (2.0*step);
+
        }
            V1=sqrt(Vx1*Vx1+Vy1*Vy1);
 
            xm1=xv1;
 
            xv1=x1;///запоминание предыдущего шага
 
            ym1=yv1;
 
            yv1=y1;
 
  
 +
        //возращает координату тела
 +
        Vector3D getR()
 +
        {
 +
            return r;
 +
        }
  
 +
        //рассчет времени полета
 +
        double TimeOfFly()
 +
        {
 +
            return (2*Length(v)*sin(angle)/Length(a));
 +
        }
  
fout<< setw(20) << (x0+(speed0*cos(angle0)*step*i)) << setw(20) << (y0+(speed0*sin(angle0)*i*step - (g*i*i*step*step*0.5)))<<setw(20) << x1 << setw(20) << y1 <<setw(20) << x2 << setw(20)<<y2<<setw(20) << x3 << setw(20) << y3<<" \n";
+
        //рассчет координаты по точной формуле. без сопротивления воздуха.
 
+
        Vector3D position(double t)
 +
        {
 +
            return MakeVector(r.x + v.x*t + a.x*t*t/2,r.y + v.y*t + a.y*t*t/2,r.z + v.z*t + a.z*t*t/2);
 
         }
 
         }
        fout.close();
 
    }
 
  
 
};
 
};
 
  
 
int main()
 
int main()
 
{
 
{
     double V0, angle, step;
+
     //задание начальных параметров
    cout << " enter V0 = ";///введите начальную скорость
+
     Vector3D g = {0,-9.8,0};
     cin >> V0;
+
     double a,dt = 0;
    cout << " enter an angle , 0 < angle <= 90, angle = " ;///введите угол в диапозоне от 0 до 90 градусов
+
     char s[20];
    cin >> angle;
 
     cout << "\n enter step ";///введите шаг, с которым будут рассчитываться координаты
 
    cin >> step; cout << endl;
 
     func f1(V0,angle,step);///создание траектории
 
    f1.SaveFile("Myfile.txt");///запись в файл
 
  
 +
//    cin >> dt;
  
     return 0;
+
     dt = 0.1;
}
+
    a = (M_PI * 30)/180;
</syntaxhighlight>
+
    Ball b1(a, MakeVector(0,0,0),MakeVector(30,a),g);
</div>
 
  
<div>
+
    double tof = b1.TimeOfFly()+1;  //единичка прибавлена,чтобы график красивым был
  
'''[[Бальцер Анастасия]]'''
+
    //Без сопротивления возлуха
 +
    strcpy(s,"");
 +
    strcat(s, "o1.txt");
 +
    outfile.open(s, ios :: trunc);
 +
    outfile.close();
 +
    for (double i = 0; i <= tof; i += dt)
 +
    {
 +
        b1.WVTS(b1.position(i));
 +
        b1.WVTF(b1.position(i), s);
 +
    }
  
'''Описание программы''' : программа записывает в четыре файла результаты вычисления:
 
  
Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
+
    //Верле(Линейная зависимость)
Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
+
    dt = 0.1;
Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
+
    a = (M_PI * 30)/180;
Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
+
    Ball b2(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
  
Посмотреть программу можно [http://tm.spbstu.ru/File:falling.zip здесь]
+
    strcpy(s,"");
 
+
    strcat(s, "o2.txt");
</div>
+
    outfile.open(s,ios :: trunc);
 
+
    outfile.close();
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
    Vector3D r1 = b2.MR1(dt),rp;
'''[[Белоусова Екатерина]]'''
+
    for (double i = 0; i <= 20; i += dt)
 
+
    {
'''Описание программы''': пользователь вводит начальную скорость полета, угол бросания и шаг, с которым будут рассчитаны точки.  
+
        rp = b2.getR();
 +
        b2.writePosToFile(s);
 +
        b2.writePosToScreen();
 +
        b2.changeR(r1,dt);
 +
        b2.changeV(r1,dt);
 +
        r1.x = rp.x;
 +
        r1.y = rp.y;
 +
    }
  
Программа записывает в один файл результаты вычисления:
+
    //Точное решение (Линейная зависимость)
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
+
    dt = 0.1;
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
+
    a = (M_PI * 30)/180;
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
+
    Ball b3(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
  
Скачать можно  [http://tm.spbstu.ru/Файл:задача_3.zip тут].
+
    strcpy(s,"");
 +
    strcat(s, "o3.txt");
 +
    outfile.open(s, ios :: trunc);
 +
    outfile.close();
 +
    for (double i = 0; i <= 20; i += dt)
 +
    {
 +
        b3.WVTS(b3.positionReal(i));
 +
        b3.WVTF(b3.positionReal(i), s);
 +
    }
  
<div class="mw-collapsible-content">
 
  
[[File:формулы.png]]
+
    //Верле (Квадратичная зависимость)
 +
    dt = 0.1;
 +
    a = (M_PI * 30)/180;
 +
    Ball b4(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
  
'''Визуализированный результат работы программы'''
+
    strcpy(s,"");
[[File:graph1.png]]
+
    strcat(s, "o4.txt");
 
+
    outfile.open(s, ios :: trunc);
Для тела с массой 1 кг,сопротивлением воздуха 0.05, угол бросания 30°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2, шаг 0.01;
+
    outfile.close();
 
+
    r1 = b4.MR1(dt);
# "Zapis.txt" using 1 : 2 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
+
    for (double i = 0; i <= 20; i += dt)
# "Zapis.txt" using 3 : 4 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
+
    {
# "Zapis.txt" using 5 : 6 - координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости;
+
        rp = b4.getR();
# "Zapis.txt" using 7 : 8 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости.
+
        b4.writePosToFile(s);
 +
        b4.writePosToScreen();
 +
        b4.changeRSQ(r1,dt);
 +
        b4.changeV(r1,dt);
 +
        r1.x = rp.x;
 +
        r1.y = rp.y;
 +
    }
  
 +
    return 0;
 +
}
 +
</syntaxhighlight>
  
 +
Файл "'''Vector.h'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
#include <iostream>
+
#ifndef VECTOR_H_INCLUDED
#include <locale.h>
+
#define VECTOR_H_INCLUDED
#include <math.h>
 
#include <fstream>
 
#include<iomanip>
 
#include <cmath>
 
  
using namespace std;
+
struct Vector3D
 
 
class fly ///создаем класс полета тела
 
 
{
 
{
 +
  double x,y,z;
 +
};
  
private: ///объявляем тип переменных в привате
+
Vector3D VmV(Vector3D v1,Vector3D v2)              //векторное вычитание
     double Vo, Agrad, Brad, time, step, amountdouble; ///Vo-начальная скорость тела; Agrad-угол, под которым летит тело, в градусах;
+
{
                                                      ///Brad-угол, под которым летит тело, в радианах; time-время полета тела; step-шаг;
+
     Vector3D v = {v1.x - v2.x,v1.y - v2.y,v1.z - v2.z };
                                                      ///amountdouble-количество точек (типа double)
+
    return v;
 +
};
 +
Vector3D VpV(Vector3D v1,Vector3D v2)              //векторное сложение
 +
{
 +
    Vector3D v = {v1.x + v2.x,v1.y + v2.y,v1.z + v2.z };
 +
    return v;
 +
}
  
public: ///объявляем переменные в паблике
+
double VV(Vector3D v1,Vector3D v2)              //скалярное умножение
    int amount; ///amoun-количество точек (типа int)
+
{
 +
  return (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
 +
}
  
fly (double _step, double _Agrad, double _Vo):step(_step),Agrad(_Agrad),Vo(_Vo) ///создаем конструктор функции с объявлением переменных
+
Vector3D VxV(Vector3D v1,Vector3D v2)               //векторное умножение
 
{
 
{
 +
  Vector3D v = {v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z,v1.x*v2.y - v1.y*v2.x};
 +
  return v;
 +
}
  
    double g=9.8; ///объявляем тип и значение переменной g(ускорение свободного падения)
+
bool Kol(Vector3D v1,Vector3D v2)
    Brad=3.14159*Agrad/180.0; ///переводим значение угла из градусов в радианы
+
{
 +
  return ((v1.x/v2.x == v1.y/v2.y)&&(v1.z/v2.z == v1.y/v2.y))? true:false;
 +
}
  
     time=2*Vo*sin(Brad)/g; ///рассчитываем время полета тела
+
Vector3D VS(Vector3D v1, double s)
     amountdouble=(round(time/step)+1); ///подсчитываем количество точек с заданым шагом
+
{
    amount=static_cast<int>(amountdouble); ///преобразуем количество из типа double к типу int
+
     Vector3D v = {v1.x*s, v1.y*s, v1.z*s};
 +
     return v;
 +
}
  
 +
double Length(Vector3D v1)
 +
{
 +
    return sqrt(VV(v1,v1));
 
}
 
}
void zapis (char Zapis[]) ///создаем функцию записи
+
 
 +
Vector3D MakeVector(double x,double y,double z)
 
{
 
{
     double g=9.8, m=1, n=0.05; ///объявляем тип и значения переменных g (ускорение свободного падения), m (масса тела), n(коэффициэнт сопротивления)
+
     Vector3D v = {x,y,z};
     double Xb, Yb; ///объявляем тип переменных для полёта тела без сопротивления ветра Xb(координата тела по Х), Yb(координата тела по У)
+
     return v;
    double V=Vo, Vxv=Vo*cos(Brad), Vyv=Vo*sin(Brad), Xo=0, Yo=0, Xv=0, Yv=0, Y_1=Yo-Vo*sin(Brad)*step, X_1=Xo-Vo*cos(Brad)*step, Y=0, X=0;
+
}
          ///объявляем тип переменных для метода ВерлеI V (скорость тела по модулю), Vxv (составляющая скорости по Х),
 
          ///Vyv (составляющая скорости по У), Xo (начальное положение тела на оси Х), Yo (начальное положение тела на оси У),
 
          ///Xv (координата тела на оси Х), Yv (координата тела на оси У), Y_1 (координата тела на (n-1)ом шаге на оси У),
 
          ///X_1 (координата тела на (n-1)ом шаге на оси Х), Y (координата тела на n-ом шаге на оси У),
 
          ///X (координата тела на n-ом шаге на оси Х);
 
    double Vxv2=Vo*cos(Brad), Vyv2=Vo*sin(Brad), Xo2=0, Yo2=0, Xv2=0, Yv2=0, Y_12=Yo2-Vo*sin(Brad)*step, X_12=Xo-Vo*cos(Brad)*step, Y2=0, X2=0;
 
          ///объявляем тип переменных для метода ВерлеII V (скорость тела по модулю), Vxv (составляющая скорости по Х),
 
          ///Vyv (составляющая скорости по У), Xo (начальное положение тела на оси Х), Yo (начальное положение тела на оси У),
 
          ///Xv (координата тела на оси Х), Yv (координата тела на оси У), Y_1 (координата тела на (n-1)ом шаге на оси У),
 
          ///X_1 (координата тела на (n-1)ом шаге на оси Х), Y (координата тела на n-ом шаге на оси У),
 
          ///X (координата тела на n-ом шаге на оси Х);
 
    double Yt=0, Xt=0, Yot=0, Xot=0, Voxt=Vo*cos(Brad), Voyt=Vo*sin(Brad);
 
  
    ofstream outfile("Zapis.txt"); ///запись элементов функции в фаил "Zapis.txt"
+
Vector3D MakeVector(double length,double angle)
     outfile<<setw(20)<<"Xb"<<setw(20)<<"Yb"<<setw(20)<<"Xt"<<setw(20)<<"Yt"<<setw(20)<<"Xv"<<setw(20)<<"Yv"<<setw(20)<<"Xv2"<<setw(20)<<"Yv2"<<" \n"; ///вывод на экран по столбцам
+
{
                                                                                  ///X (координата тела на оси Х без ветра),
+
     Vector3D v = {length * cos(angle), length * sin(angle),0};
                                                                                  ///Y (координата тела на оси У без ветра),
+
    return v;
                                                                                  ///Xv (координата тела на оси Х с ветром для метода Верле),
+
}
                                                                                  ///Yv (координата тела на оси У с ветром для метода Верле)
 
                                                                                  ///setw() размер столбиков
 
  
    for (int l=0; Yb>=0; ++l) ///создаем цикл от 0 до тех пор пока У больше нуля
+
double Proection(Vector3D base, Vector3D dir)
    {
+
{
        outfile<<setw(20)<<Xb<<setw(20)<<Yb<<setw(20)<<Xt<<setw(20)<<Yt<<setw(20)<<Xv<<setw(20)<<Yv<<setw(20)<<Xv2<<setw(20)<<Yv2<<" \n";
+
    return (VV(base,dir)/Length(base));
            ///вывод на экран по столбцам Xv, Yv;
+
}
 +
#endif // VECTOR_H_INCLUDED
 +
</syntaxhighlight>
 +
</div>
  
        ///полёт без ветра
 
        Xb=Vo*cos(Brad)*l*step;
 
        Yb=Vo*sin(Brad)*l*step-(9.8*l*step*l*step*0.5);
 
  
        ///точный метод
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
        Xt=Xot+(m/n)*Voxt*(1.0 - exp((-n*l*step)/m));
+
'''[[Белоусова Екатерина]]'''
        Yt=Yot+(m/n)*(Voyt+g*(m/n))*(1.0 - exp((-n*l*step)/m))-g*l*step*(m/n);
 
  
        ///метод Верле I
+
'''Описание программы''': пользователь вводит начальную скорость полета, угол бросания и шаг, с которым будут рассчитаны точки.  
        Xv=2*X-X_1-(n/m)*V*Vxv*step*step; ///расчитываем координату Х в момент времени t для метода Верле
 
        Yv=2*Y-Y_1-(g+(n/m)*V*Vyv)*step*step; ///расчитываем координату У в момент времени t для метода Верле
 
        Vxv=(Xv-X_1)/(2.0*step); ///расчитываем скорость тела по оси Х в момент времени t для метода Верле
 
        Vyv=(Yv-Y_1)/(2.0*step); ///расчитываем скорость тела по оси У в момент времени t для метода Верле
 
        V=sqrt(Vxv*Vxv+Vyv*Vyv); ///рассчитываем скорость тела по модулю
 
        X_1=X; ///присваиваем значению координаты Х на (n-1)ом шаге значение координаты Х на n-ом шаге
 
        X=Xv;  ///присваиваем значению координаты Х на n-ом шаге значение координаты Х
 
        Y_1=Y; ///присваиваем значению координаты У на (n-1)ом шаге значение координаты У на n-ом шаге
 
        Y=Yv;  ///присваиваем значению координаты У на n-ом шаге значение координаты У
 
  
        ///метод Верле II
+
Программа записывает в один файл результаты вычисления:
        Xv2=2*X2-X_12-(n/m)*Vxv2*step*step; ///расчитываем координату Х в момент времени t для метода Верле
+
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
        Yv2=2*Y2-Y_12-(g+(n/m)*Vyv2)*step*step; ///расчитываем координату У в момент времени t для метода Верле
+
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
        Vxv2=(Xv2-X_12)/(2.0*step); ///расчитываем скорость тела по оси Х в момент времени t для метода Верле
+
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
        Vyv2=(Yv2-Y_12)/(2.0*step); ///расчитываем скорость тела по оси У в момент времени t для метода Верле
+
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
        X_12=X2; ///присваиваем значению координаты Х на (n-1)ом шаге значение координаты Х на n-ом шаге
 
        X2=Xv2;  ///присваиваем значению координаты Х на n-ом шаге значение координаты Х
 
        Y_12=Y2; ///присваиваем значению координаты У на (n-1)ом шаге значение координаты У на n-ом шаге
 
        Y2=Yv2; ///присваиваем значению координаты У на n-ом шаге значение координаты У
 
  
    }
+
Скачать можно  [http://tm.spbstu.ru/Файл:задача_3.zip тут].
  
    outfile.close();
+
<div class="mw-collapsible-content">
  
}
+
[[File:формулы.png]]
  
};
+
'''Визуализированный результат работы программы'''
 +
[[File:graph1.png]]
  
int main()
+
Для тела с массой 1 кг,сопротивлением воздуха 0.05, угол бросания 30°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2, шаг 0.01;
{
 
  
    setlocale(LC_ALL,"RUS"); ///функция, позволяющая с++ распознавать русский язык
+
# "Zapis.txt" using 1 : 2 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
# "Zapis.txt" using 3 : 4 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# "Zapis.txt" using 5 : 6 - координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости;
 +
# "Zapis.txt" using 7 : 8 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости.
  
    double Vo, Agrad, Brad, time, step; ///объявляем тип переменных Vo (начальная скорость тела), Agrad (угол, под которым летит тело, в градусах);
 
                                        ///Brad (угол, под которым летит тело, в радианах); time (время полета тела); step (шаг)
 
    cout<<"Задайте начальную скорость тела в м/с: Vo="; ///на экран выводится сообщение с просьюой задать начальную скорость тела
 
    cin>>Vo; ///пользователь вводит начальную скорость тела
 
    cout<<'\n'<<"Задайте в градусах угол, под которым брошено тело (угол должен принимать значения от 0 до 90): a=";
 
                                                        ///на экран выводится сообщение с просьбой задать угол, под которым летит тело, в градусах
 
    cin>>Agrad; ///пользователь вводит угол, под которым летит тело
 
    cout<<'\n'<<"Задайте шаг (шаг должен быть очень маленьким): шаг="; ///на экран выводится сообщение с просьбой ввести шаг
 
    cin>>step; ///пользователь вводит шаг
 
  
    fly X(step,Agrad,Vo); ///объявление коструктора, создание функции Х, зависящей от step,Agrad,Vo
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    X.zapis("координаты.txt"); ///запись элементов функции в файл
+
#include <iostream>
 +
#include <locale.h>
 +
#include <math.h>
 +
#include <fstream>
 +
#include<iomanip>
 +
#include <cmath>
  
    return 0; ///конец программы
+
using namespace std;
  
}
+
class fly ///создаем класс полета тела
</syntaxhighlight>
+
{
</div>
 
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
private: ///объявляем тип переменных в привате
'''[[Васильева Анастасия]]'''
+
    double Vo, Agrad, Brad, time, step, amountdouble; ///Vo-начальная скорость тела; Agrad-угол, под которым летит тело, в градусах;
 +
                                                      ///Brad-угол, под которым летит тело, в радианах; time-время полета тела; step-шаг;
 +
                                                      ///amountdouble-количество точек (типа double)
  
'''Описание программы''': пользователь вводит начальную скорость полета, угол падения и шаг, с которым будут рассчитаны точки.
+
public: ///объявляем переменные в паблике
 +
    int amount; ///amoun-количество точек (типа int)
  
Программа записывает в один файл результаты вычисления:
+
fly (double _step, double _Agrad, double _Vo):step(_step),Agrad(_Agrad),Vo(_Vo) ///создаем конструктор функции с объявлением переменных
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
+
{
# Координаты, полученные при численном интегрировании - метод Эйлера;
 
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
  
Скачать можно  [http://tm.spbstu.ru/Файл:fly.zip тут].
+
    double g=9.8; ///объявляем тип и значение переменной g(ускорение свободного падения)
 +
    Brad=3.14159*Agrad/180.0; ///переводим значение угла из градусов в радианы
  
 +
    time=2*Vo*sin(Brad)/g; ///рассчитываем время полета тела
 +
    amountdouble=(round(time/step)+1); ///подсчитываем количество точек с заданым шагом
 +
    amount=static_cast<int>(amountdouble); ///преобразуем количество из типа double к типу int
  
<div class="mw-collapsible-content">
+
}
 +
void zapis (char Zapis[]) ///создаем функцию записи
 +
{
 +
    double g=9.8, m=1, n=0.05; ///объявляем тип и значения переменных g (ускорение свободного падения), m (масса тела), n(коэффициэнт сопротивления)
 +
    double Xb, Yb; ///объявляем тип переменных для полёта тела без сопротивления ветра Xb(координата тела по Х), Yb(координата тела по У)
 +
    double V=Vo, Vxv=Vo*cos(Brad), Vyv=Vo*sin(Brad), Xo=0, Yo=0, Xv=0, Yv=0, Y_1=Yo-Vo*sin(Brad)*step, X_1=Xo-Vo*cos(Brad)*step, Y=0, X=0;
 +
          ///объявляем тип переменных для метода ВерлеI V (скорость тела по модулю), Vxv (составляющая скорости по Х),
 +
          ///Vyv (составляющая скорости по У), Xo (начальное положение тела на оси Х), Yo (начальное положение тела на оси У),
 +
          ///Xv (координата тела на оси Х), Yv (координата тела на оси У), Y_1 (координата тела на (n-1)ом шаге на оси У),
 +
          ///X_1 (координата тела на (n-1)ом шаге на оси Х), Y (координата тела на n-ом шаге на оси У),
 +
          ///X (координата тела на n-ом шаге на оси Х);
 +
    double Vxv2=Vo*cos(Brad), Vyv2=Vo*sin(Brad), Xo2=0, Yo2=0, Xv2=0, Yv2=0, Y_12=Yo2-Vo*sin(Brad)*step, X_12=Xo-Vo*cos(Brad)*step, Y2=0, X2=0;
 +
          ///объявляем тип переменных для метода ВерлеII V (скорость тела по модулю), Vxv (составляющая скорости по Х),
 +
          ///Vyv (составляющая скорости по У), Xo (начальное положение тела на оси Х), Yo (начальное положение тела на оси У),
 +
          ///Xv (координата тела на оси Х), Yv (координата тела на оси У), Y_1 (координата тела на (n-1)ом шаге на оси У),
 +
          ///X_1 (координата тела на (n-1)ом шаге на оси Х), Y (координата тела на n-ом шаге на оси У),
 +
          ///X (координата тела на n-ом шаге на оси Х);
 +
    double Yt=0, Xt=0, Yot=0, Xot=0, Voxt=Vo*cos(Brad), Voyt=Vo*sin(Brad);
  
 +
    ofstream outfile("Zapis.txt"); ///запись элементов функции в фаил "Zapis.txt"
 +
    outfile<<setw(20)<<"Xb"<<setw(20)<<"Yb"<<setw(20)<<"Xt"<<setw(20)<<"Yt"<<setw(20)<<"Xv"<<setw(20)<<"Yv"<<setw(20)<<"Xv2"<<setw(20)<<"Yv2"<<" \n"; ///вывод на экран по столбцам
 +
                                                                                  ///X (координата тела на оси Х без ветра),
 +
                                                                                  ///Y (координата тела на оси У без ветра),
 +
                                                                                  ///Xv (координата тела на оси Х с ветром для метода Верле),
 +
                                                                                  ///Yv (координата тела на оси У с ветром для метода Верле)
 +
                                                                                  ///setw() размер столбиков
  
'''Визуализированный результат работы программы'''
+
    for (int l=0; Yb>=0; ++l) ///создаем цикл от 0 до тех пор пока У больше нуля
[[File:graphick.png]]
+
    {
 +
        outfile<<setw(20)<<Xb<<setw(20)<<Yb<<setw(20)<<Xt<<setw(20)<<Yt<<setw(20)<<Xv<<setw(20)<<Yv<<setw(20)<<Xv2<<setw(20)<<Yv2<<" \n";
 +
            ///вывод на экран по столбцам Xv, Yv;
  
Для тела с массой 0.5 кг,сопротивлением воздуха 0.1, угол бросания 30°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2, шаг 0.001;
+
        ///полёт без ветра
 +
        Xb=Vo*cos(Brad)*l*step;
 +
        Yb=Vo*sin(Brad)*l*step-(9.8*l*step*l*step*0.5);
  
# "output.txt" using 1 : 2 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
+
        ///точный метод
# "output.txt" using 3 : 4 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости (численное интегрирование - метод Эйлера);
+
        Xt=Xot+(m/n)*Voxt*(1.0 - exp((-n*l*step)/m));
# "output.txt" using 5 : 6 - координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости;
+
        Yt=Yot+(m/n)*(Voyt+g*(m/n))*(1.0 - exp((-n*l*step)/m))-g*l*step*(m/n);
# "output.txt" using 7 : 8 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости.
 
  
 +
        ///метод Верле I
 +
        Xv=2*X-X_1-(n/m)*V*Vxv*step*step; ///расчитываем координату Х в момент времени t для метода Верле
 +
        Yv=2*Y-Y_1-(g+(n/m)*V*Vyv)*step*step; ///расчитываем координату У в момент времени t для метода Верле
 +
        Vxv=(Xv-X_1)/(2.0*step); ///расчитываем скорость тела по оси Х в момент времени t для метода Верле
 +
        Vyv=(Yv-Y_1)/(2.0*step); ///расчитываем скорость тела по оси У в момент времени t для метода Верле
 +
        V=sqrt(Vxv*Vxv+Vyv*Vyv); ///рассчитываем скорость тела по модулю
 +
        X_1=X; ///присваиваем значению координаты Х на (n-1)ом шаге значение координаты Х на n-ом шаге
 +
        X=Xv;  ///присваиваем значению координаты Х на n-ом шаге значение координаты Х
 +
        Y_1=Y; ///присваиваем значению координаты У на (n-1)ом шаге значение координаты У на n-ом шаге
 +
        Y=Yv;  ///присваиваем значению координаты У на n-ом шаге значение координаты У
  
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
        ///метод Верле II
 +
        Xv2=2*X2-X_12-(n/m)*Vxv2*step*step; ///расчитываем координату Х в момент времени t для метода Верле
 +
        Yv2=2*Y2-Y_12-(g+(n/m)*Vyv2)*step*step; ///расчитываем координату У в момент времени t для метода Верле
 +
        Vxv2=(Xv2-X_12)/(2.0*step); ///расчитываем скорость тела по оси Х в момент времени t для метода Верле
 +
        Vyv2=(Yv2-Y_12)/(2.0*step); ///расчитываем скорость тела по оси У в момент времени t для метода Верле
 +
        X_12=X2; ///присваиваем значению координаты Х на (n-1)ом шаге значение координаты Х на n-ом шаге
 +
        X2=Xv2;  ///присваиваем значению координаты Х на n-ом шаге значение координаты Х
 +
        Y_12=Y2; ///присваиваем значению координаты У на (n-1)ом шаге значение координаты У на n-ом шаге
 +
        Y2=Yv2;  ///присваиваем значению координаты У на n-ом шаге значение координаты У
  
#include <iostream>
+
    }
#include <fstream>
 
#include <iomanip>
 
#include <time.h>
 
#include <conio.h>
 
#include <stdlib.h>
 
#include <math.h>
 
#include <cstring>
 
using namespace std;
 
  
class pad ///создаем класс
+
    outfile.close();
 +
 
 +
}
 +
 
 +
};
 +
 
 +
int main()
 
{
 
{
private: ///в закрытом доступе
 
    double *X, *Y, *E, *G, *Z, *S, *V, *U; ///координаты по х и у; *E, *G : численное интегрирование метод Эйлера, *Z, *S- метод верле, *V, *U- точный метод
 
    double a, g , pi;///ускорение, коэфф свободного падения, значение числа пи
 
    int Size; ///размер массива- сколько точек считать в первом способе
 
    double v, shag, b, vx, vy;///скорость, шаг по времени, угол в градусах скорость по х, скорость по у
 
  
     void SetX() ///создаем функцию для вычисления значенй по х для простого падения и по эйлеру
+
     setlocale(LC_ALL,"RUS"); ///функция, позволяющая с++ распознавать русский язык
     {
+
 
        g = 9.8;///коэфф свободного падения
+
     double Vo, Agrad, Brad, time, step; ///объявляем тип переменных Vo (начальная скорость тела), Agrad (угол, под которым летит тело, в градусах);
        float t = 0; ///время
+
                                        ///Brad (угол, под которым летит тело, в радианах); time (время полета тела); step (шаг)
        X = new double [Size];///создаем массив для координат по х для простого падения
+
    cout<<"Задайте начальную скорость тела в м/с: Vo="; ///на экран выводится сообщение с просьюой задать начальную скорость тела
        E = new double [Size];///создаем массив для координат по х для интегрирования по эйлеру
+
    cin>>Vo; ///пользователь вводит начальную скорость тела
        X[0] = 0; ///задаем значение по х в нуле
+
    cout<<'\n'<<"Задайте в градусах угол, под которым брошено тело (угол должен принимать значения от 0 до 90): a=";
        E[0] = 0 ; ///задаем значение по х в нуле по эйлеру
+
                                                        ///на экран выводится сообщение с просьбой задать угол, под которым летит тело, в градусах
        for (int i = 1; i < Size; i++) ///задаем цикл от 1 (для нуля мы задали), чтобы считать координаты
+
    cin>>Agrad; ///пользователь вводит угол, под которым летит тело
        {
+
    cout<<'\n'<<"Задайте шаг (шаг должен быть очень маленьким): шаг="; ///на экран выводится сообщение с просьбой ввести шаг
            t += shag; ///каждый раз прибавляем по времени шаг
+
    cin>>step; ///пользователь вводит шаг
            X[i] = v * cos(a) * t; ///координаты по х для простого падения
+
 
            E[i] = E[i-1] + v * cos(a) * shag; ///х из интегрирования по эйлеру
+
    fly X(step,Agrad,Vo); ///объявление коструктора, создание функции Х, зависящей от step,Agrad,Vo
        }
+
    X.zapis("координаты.txt"); ///запись элементов функции в файл
     }
+
 
 +
     return 0; ///конец программы
 +
 
 +
}
 +
</syntaxhighlight>
 +
</div>
  
    void SetY()///создаем функцию для вычисления значенй по у для простого падения и по эйлеру
 
    {
 
        g = 9.8; ///коэфф свободного падения
 
        double Vy; /// переменная для значение скорости по у для метода эйлера
 
        float t = 0; ///время
 
        Y = new double [Size];///создаем массив для координат по у для простого падения
 
        G = new double [Size];///создаем массив для координат по х для интегрирования по эйлеру
 
        Vy = v * sin (a);/// значение скорости по у для метода эйлера
 
        Y[0] = 0;///задаем значение по у в нуле
 
        G[0] = 0;///задаем значение по у в нуле по эйлеру
 
        for (int i = 1; i < Size; i++)///задаем цикл от 1 (для нуля мы задали), чтобы считать координаты
 
        {
 
            t += shag; ///каждый раз прибавляем по времени шаг
 
            Y[i] = v * sin (a) *t - (g * t * t) * 0.5; ///координаты по у для простого падения
 
            Vy -= g * shag; ///значение скорости по у для метода эйлера
 
            G[i] = G[i-1] + Vy  * shag;///у из интегрирования по эйлеру
 
        }
 
    }
 
  
    void SetVerle() ///функция для метода верле
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    {
+
'''[[Васильева Анастасия]]'''
        double k = 0.1, m = 0.5; ///коэфф сопротивления водуха, масса тела
+
 
        g = 9.8; /// коэфф свободного падения
+
'''Описание программы''': пользователь вводит начальную скорость полета, угол бросания и шаг, с которым будут рассчитаны точки.  
        uint32_t Size1 = 1000000.0; ///размер массива
+
 
        S = new double [Size1]; ///создаем массив для значений по х для метода верле
+
Программа записывает в один файл результаты вычисления:
        Z = new double [Size1]; ///создаем массив для значений по у для метода верле
+
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
        vx = v * cos(a); ///формулы для вычисления скорости по оси х
+
# Координаты, полученные при численном интегрировании - метод Эйлера;
        vy = v * sin(a); ///формулы для вычисления скорости по оси у
+
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
        S[1] = 0; ///значение х метод верле
+
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
        S[0] = -vx * shag; ///значение в нуле
+
 
        Z[1] = 0; ///значение у метод верле
+
Скачать можно  [http://tm.spbstu.ru/Файл:fly.zip тут].
        Z[0] = -vy * shag; ///значение в нуле
 
        for (int i = 0; i < Size1-2; i++) ///задаем цикл
 
        {
 
            S[i+2] = 2.0 * S[i+1] - S[i] - (k / m) * v * vx * shag * shag;///значения по х для верле
 
            vx = 0.5 * ( 1.0 / shag )* ( S[i+2] - S[i]);///считаем значения скорости по оси х
 
            Z[i+2] = 2.0 * Z[i+1] - Z[i] - ( g + (k / m) * v * vy ) * shag * shag;///значения по х для верле
 
            vy = 0.5 * ( 1.0 / shag )* ( Z[i+2] - Z[i]);///считаем значения скорости по оси х
 
            v = sqrt (vx * vx + vy * vy); ///модуль общей скорости
 
        }
 
    }
 
    void SetVerleLast() ///функция для точного метода верле
 
    {
 
        double k = 0.1, m = 0.5;///коэфф сопротивления водуха, масса тела
 
        g = 9.8; /// коэфф свободного падения
 
        uint32_t Size2 = 1000000.0; ///размер массива
 
        float t = 0; ///время
 
        V = new double [Size2]; ///создаем массив для значений по х для точного метода верле
 
        U = new double [Size2]; ///создаем массив для значений по у для точного метода верле
 
        vx = v * cos(a); ///формулы для вычисления скорости по оси х
 
        vy = v * sin(a); ///формулы для вычисления скорости по оси у
 
        ///double e = 2.7 ;///значение экспоненты
 
        V[0] = 0; ///значение х точный метод верле
 
        U[0] = 0; ///значение у точный метод верле
 
        for (int i = 1; i < Size2; i++)
 
        {
 
            t += shag; ///увеличиваем время на шаг
 
            V[i] = vx * (m / k) * (1.0 - exp(((-k) / m) * t)); ///значения по х для точного верле
 
            U[i] = (m / k) * (vy +  g * (m / k)) * (1.0 -  (exp(((-k) / m) * t))) - g * t * (m / k);///значения по х для точного верле
 
        }
 
    }
 
  
public: ///в открытом
 
    pad()
 
    {
 
        X = 0; ///зануляем значения
 
        Y = 0;
 
        Size = 0;
 
        v = 0;
 
        shag = 0;
 
        b = 0;
 
    }
 
    pad(double _v, double _shag, double _b) ///конструктор с параметрами
 
    {
 
        pi = M_PI; ///значение числа пи
 
        g = 9.8; ///коэфф свободного падения
 
        v = _v;/// присваиваем значения переменных значению параметров в конструкторе
 
        shag = _shag;
 
        b = _b;
 
        a = (pi * b) / 180.0 ; ///вычисляем значение угла в радианах
 
        double t = (2.0 * v * sin(a)) / g; /// считаем значение времени
 
        Size = abs( t / shag )+1;///ищем значение размера массива
 
        SetX(); ///вызываем функции зависящие от параметров конструктора
 
        SetY();
 
        SetVerle();
 
        SetVerleLast();
 
    }
 
  
    void FilePrint() ///функция записи в файл
+
<div class="mw-collapsible-content">
    {
+
 
        ofstream fout("output.txt"); ///открываем файл уже созданный в папке с программой
 
        fout << "X:    " << "    Y:    " << "    E:  " << "  G:  " << "  S:  " << "  Z:  "<< "  V:  "<< "    U:    "<<"\n" ; ///выводим стоку с разными названиями массивов, соотв. координатам по х и у различных методов
 
        for (int i = 0; i < Size; i++) ///цикл
 
        fout << X[i] << "    " << Y[i] << "     " << E[i] << "   "  << G[i] << "  " << S[i] << "  " << Z[i] << "  " << V[i] <<"    "<< U[i] <<"\n"; ///забивает сами значения массивов
 
        fout.close();///закрываем файл
 
    };
 
};
 
  
int main()/// основная функция
+
'''Визуализированный результат работы программы'''
{
+
[[File:graphick.png]]
    double shag, b, v; ///шаг, угол в градусах, скорость начальная
 
    cout << "vvedite v "; ///просим пользователя ввести значение скорости начальной
 
    cin >> v; ///считываем начальную скорость
 
    cout << "vvedite ygol ";///просим пользователя ввести угол в градусах
 
    cin >> b;/// считываем угол
 
    cout << "vvedite shag ";///просим пользователя ввести шаг по времени
 
    cin >> shag; ///считываем значение шага
 
    pad F1(v, shag, b); ///объявление коструктора, создание функции F1 с переменными v, shag, b
 
    F1.FilePrint(); ///вызываем функцию для записи файла
 
}
 
</syntaxhighlight>
 
</div>
 
  
'''[[Гильманов Илья]]'''
+
Для тела с массой 0.5 кг,сопротивлением воздуха 0.1, угол бросания 30°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2, шаг 0.001;
  
'''Описание программы''': программа состоит из четырех независимых друг от друга частей:
+
# "output.txt" using 1 : 2 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
#  Полет тела без сопротивления воздуха;  
+
# "output.txt" using 3 : 4 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости (численное интегрирование - метод Эйлера);
# Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются точным методом;
+
# "output.txt" using 5 : 6 - координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости;
# Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
+
# "output.txt" using 7 : 8 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости.
#  Полет тела при квадратичной зависимости силы сопротивлении воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
 
  
Скачать можно [[http://mech.spbstu.ru/File:Движение_тела_в_среде.rar тут]]
 
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
'''[[Демченко Артём]]'''
 
 
 
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
 
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
 
 
''' Инструкция ''':
 
Пользователь вводит начальные данные ( массу, скорость, угол броска, шаг по времени и сопротивление воздуха). Выбираем режим работы программы, после этого в папке с программой создается файл, который требуется открыть программой gnuplot для просмотра графика, построенного на полученных координатах.
 
 
 
 
 
<div class="mw-collapsible-content">
 
 
 
 
 
 
 
'''Визуализированный результат работы программы'''
 
 
 
[[:File:Throws.png]]
 
 
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
  
 
#include <iostream>
 
#include <iostream>
#include <math.h>
+
#include <fstream>
 
#include <iomanip>
 
#include <iomanip>
#include <fstream>
+
#include <time.h>
 
#include <conio.h>
 
#include <conio.h>
#include <stdio.h>
+
#include <stdlib.h>
 
+
#include <math.h>
 
+
#include <cstring>
 
using namespace std;
 
using namespace std;
  
double g = 9.8, Pi = 3.1415; // Задаем две глобальные переменные ускорения свободного падения и числа Pi
+
class pad ///создаем класс
 
 
int WoutR(double alpha, double dt, double t, double Yo, double Vo) // Функция, записывающая в файл Throws Without Resistance.txt координаты тела, которое движется без сопротивления
 
 
{
 
{
     FILE *Coord;
+
private: ///в закрытом доступе
  Coord = fopen ("Throws Without Resistance.txt", "w");
+
     double *X, *Y, *E, *G, *Z, *S, *V, *U; ///координаты по х и у; *E, *G : численное интегрирование метод Эйлера, *Z, *S- метод верле, *V, *U- точный метод
    double X = 0, Y = 0; // Координаты начала
+
    double a, g , pi;///ускорение, коэфф свободного падения, значение числа пи
 +
    int Size; ///размер массива- сколько точек считать в первом способе
 +
    double v, shag, b, vx, vy;///скорость, шаг по времени, угол в градусах скорость по х, скорость по у
  
    while ( Y >= Yo) // Yo используем для того, чтобы цикл прекратился тогда, когда тело упадет
+
    void SetX() ///создаем функцию для вычисления значенй по х для простого падения и по эйлеру
    {
+
    {
 +
        g = 9.8;///коэфф свободного падения
 +
        float t = 0; ///время
 +
        X = new double [Size];///создаем массив для координат по х для простого падения
 +
        E = new double [Size];///создаем массив для координат по х для интегрирования по эйлеру
 +
        X[0] = 0; ///задаем значение по х в нуле
 +
        E[0] = 0 ; ///задаем значение по х в нуле по эйлеру
 +
        for (int i = 1; i < Size; i++) ///задаем цикл от 1 (для нуля мы задали), чтобы считать координаты
 +
        {
 +
            t += shag; ///каждый раз прибавляем по времени шаг
 +
            X[i] = v * cos(a) * t; ///координаты по х для простого падения
 +
            E[i] = E[i-1] + v * cos(a) * shag; ///х из интегрирования по эйлеру
 +
        }
 +
    }
  
      X = Vo*t*cos(alpha);
+
    void SetY()///создаем функцию для вычисления значенй по у для простого падения и по эйлеру
      Y = Vo*t*sin(alpha) - (g*t*t)*0.5;
+
    {
      t+= dt;
+
        g = 9.8; ///коэфф свободного падения
    if (Y > Yo )
+
        double Vy; /// переменная для значение скорости по у для метода эйлера
         fprintf(Coord, "%.3lf \t %.3lf\n", X, Y);
+
        float t = 0; ///время
     else
+
        Y = new double [Size];///создаем массив для координат по у для простого падения
        fprintf(Coord, "%.3lf \t %.3lf\n", X, 0.000); // Используем такой else для того, чтобы не получить отрицательную координату
+
        G = new double [Size];///создаем массив для координат по х для интегрирования по эйлеру
    }
+
        Vy = v * sin (a);/// значение скорости по у для метода эйлера
 +
        Y[0] = 0;///задаем значение по у в нуле
 +
        G[0] = 0;///задаем значение по у в нуле по эйлеру
 +
        for (int i = 1; i < Size; i++)///задаем цикл от 1 (для нуля мы задали), чтобы считать координаты
 +
        {
 +
            t += shag; ///каждый раз прибавляем по времени шаг
 +
            Y[i] = v * sin (a) *t - (g * t * t) * 0.5; ///координаты по у для простого падения
 +
            Vy -= g * shag; ///значение скорости по у для метода эйлера
 +
            G[i] = G[i-1] + Vy  * shag;///у из интегрирования по эйлеру
 +
         }
 +
     }
  
}
+
    void SetVerle() ///функция для метода верле
 
+
    {
int ExactForm(double alpha, double dt, double t, double Yo, double Vo, double R, double m) // Функция, записывающая в файл ExactForm.txt координаты тела, рассчитывающиеся по формлуе точного решения
+
        double k = 0.1, m = 0.5; ///коэфф сопротивления водуха, масса тела
{                                                                                          // для линейной зависимости
+
        g = 9.8; /// коэфф свободного падения
    FILE *Coord;
+
        uint32_t Size1 = 1000000.0; ///размер массива
  Coord = fopen ("ExactForm.txt", "w");
+
        S = new double [Size1]; ///создаем массив для значений по х для метода верле
    double X, Y = 0, Vx, Vy;
+
        Z = new double [Size1]; ///создаем массив для значений по у для метода верле
 
+
        vx = v * cos(a); ///формулы для вычисления скорости по оси х
    while ( Y >= Yo) // Использование Yo аналогично использованию в прошлом пункте.
+
        vy = v * sin(a); ///формулы для вычисления скорости по оси у
    {
+
        S[1] = 0; ///значение х метод верле
 
+
        S[0] = -vx * shag; ///значение в нуле
      X = ((m*Vx)/R) * (1 - exp(((-1)*R*t)/m));
+
        Z[1] = 0; ///значение у метод верле
      Y = (m/R)*((Vy + (g*m)/R)*(1 - exp((-1)*R*t/m))) - (g*t*m)/R;
+
        Z[0] = -vy * shag; ///значение в нуле
      Vx = Vo*cos(alpha);
+
        for (int i = 0; i < Size1-2; i++) ///задаем цикл
      Vy = Vo*sin(alpha);
+
        {
      t+= dt;
+
            S[i+2] = 2.0 * S[i+1] - S[i] - (k / m) * v * vx * shag * shag;///значения по х для верле
    if (Y > Yo )
+
            vx = 0.5 * ( 1.0 / shag )* ( S[i+2] - S[i]);///считаем значения скорости по оси х
        fprintf(Coord, "%.3lf \t %.3lf\n", X, Y);
+
            Z[i+2] = 2.0 * Z[i+1] - Z[i] - ( g + (k / m) * v * vy ) * shag * shag;///значения по х для верле
    else
+
            vy = 0.5 * ( 1.0 / shag )* ( Z[i+2] - Z[i]);///считаем значения скорости по оси х
        fprintf(Coord, "%.3lf \t %.3lf\n", X, 0.000); // используется аналогично прошлому пункту
+
            v = sqrt (vx * vx + vy * vy); ///модуль общей скорости
      }
+
        }
}
+
    }
 +
    void SetVerleLast() ///функция для точного метода верле
 +
    {
 +
        double k = 0.1, m = 0.5;///коэфф сопротивления водуха, масса тела
 +
        g = 9.8; /// коэфф свободного падения
 +
        uint32_t Size2 = 1000000.0; ///размер массива
 +
        float t = 0; ///время
 +
        V = new double [Size2]; ///создаем массив для значений по х для точного метода верле
 +
        U = new double [Size2]; ///создаем массив для значений по у для точного метода верле
 +
        vx = v * cos(a); ///формулы для вычисления скорости по оси х
 +
        vy = v * sin(a); ///формулы для вычисления скорости по оси у
 +
        ///double e = 2.7 ;///значение экспоненты
 +
        V[0] = 0; ///значение х точный метод верле
 +
        U[0] = 0; ///значение у точный метод верле
 +
        for (int i = 1; i < Size2; i++)
 +
        {
 +
            t += shag; ///увеличиваем время на шаг
 +
            V[i] = vx * (m / k) * (1.0 - exp(((-k) / m) * t)); ///значения по х для точного верле
 +
            U[i] = (m / k) * (vy +  g * (m / k)) * (1.0 -  (exp(((-k) / m) * t))) - g * t * (m / k);///значения по х для точного верле
 +
        }
 +
    }
  
int VerleSq (double alpha, double dt, double t, double Yo, double Xo, double Vo, double R, double m) // Функция, записывающая в файл VerleSq.txt оординаты тела, рассчитывающиеся по формлуе Верле
+
public: ///в открытом
{                                                                                                    // для Квадратичной зависимости сопротивления от скорости
+
    pad()
    FILE *Coord;
+
    {
  Coord = fopen ("VerleSq.txt", "w");
+
        X = 0; ///зануляем значения
 +
        Y = 0;
 +
        Size = 0;
 +
        v = 0;
 +
        shag = 0;
 +
        b = 0;
 +
    }
 +
    pad(double _v, double _shag, double _b) ///конструктор с параметрами
 +
    {
 +
        pi = M_PI; ///значение числа пи
 +
        g = 9.8; ///коэфф свободного падения
 +
        v = _v;/// присваиваем значения переменных значению параметров в конструкторе
 +
        shag = _shag;
 +
        b = _b;
 +
        a = (pi * b) / 180.0 ; ///вычисляем значение угла в радианах
 +
        double t = (2.0 * v * sin(a)) / g; /// считаем значение времени
 +
        Size = abs( t / shag )+1;///ищем значение размера массива
 +
        SetX(); ///вызываем функции зависящие от параметров конструктора
 +
        SetY();
 +
        SetVerle();
 +
        SetVerleLast();
 +
    }
  
     double X, Xnext, Xprev, Y, Ynext, Yprev, Vx, Vy, V, Yop, Xop; // X, Y - текущие координаты; Xnext, Ynext - координаты следующего шага; Xprev, Yprev - координаты предыдущего шага.
+
     void FilePrint() ///функция записи в файл
                                                                  // Xop, Yop - вспомогательные координаты для (-1)-го шага
+
    {
 
+
        ofstream fout("output.txt"); ///открываем файл уже созданный в папке с программой
     Yop = Yo - Vo*sin(alpha)*dt; // Сторки 62-79 используются для просчитывания (-1)-го шага, так как в точке 0;0 у нас нету предыдущего шага
+
        fout << "X:    " << "    Y:    " << "    E:  " << "  G:  " << "  S:  " << "  Z:  "<< "  V:  "<< "    U:    "<<"\n" ; ///выводим стоку с разными названиями массивов, соотв. координатам по х и у различных методов
     Xop = Xo - Vo*cos(alpha)*dt;
+
        for (int i = 0; i < Size; i++) ///цикл
     X = Xo;
+
        fout << X[i] << "    " << Y[i] << "    " << E[i] << "    "  << G[i] << "  " << S[i] << "  " << Z[i] << "  " << V[i] <<"    "<< U[i] <<"\n"; ///забивает сами значения массивов
     Y = Yo;
+
        fout.close();///закрываем файл
     Xnext = 2.0*X - Xop - (R/m)*Vo*Vo*cos(alpha)*(dt*dt);
+
    };
     Vx = (1.0/(2.0*dt))*(Xnext - Xop);
+
};
     Ynext = 2.0*Y - Yop - (g +(R/m)*Vo*Vo*sin((alpha)))*(dt*dt);
+
 
    Vy =  (1.0/(2.0*dt))*(Ynext - Yop);
+
int main()/// основная функция
    V = sqrt((Vo*cos(alpha)*Vo*cos(alpha)) + (Vo*sin(alpha)*Vo*sin(alpha)));
+
{
 +
     double shag, b, v; ///шаг, угол в градусах, скорость начальная
 +
    cout << "vvedite v "; ///просим пользователя ввести значение скорости начальной
 +
     cin >> v; ///считываем начальную скорость
 +
     cout << "vvedite ygol ";///просим пользователя ввести угол в градусах
 +
     cin >> b;/// считываем угол
 +
     cout << "vvedite shag ";///просим пользователя ввести шаг по времени
 +
    cin >> shag; ///считываем значение шага
 +
     pad F1(v, shag, b); ///объявление коструктора, создание функции F1 с переменными v, shag, b
 +
     F1.FilePrint(); ///вызываем функцию для записи файла
 +
}
 +
</syntaxhighlight>
 +
</div>
  
    fprintf(Coord, "%.3lf \t %.3lf\n", X, Y); // Записываем первую координату в файл
 
  
    Xprev = X; // Меняем координаты местами. Так (n-1)-ый шаг становится n-ым шагом, n-ый шаг становится (n+1)-ым шагом. Далее аналогично
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    X = Xnext;
+
'''[[Андреева Полина]]'''
    Yprev = Y;
 
    Y = Ynext;
 
  
 +
'''Краткое описание алгоритма''': в классе находятся координаты по формулам и записываются в файл.
  
    while (Y >= Yo) // После выполнения строк 62-79 получаем все необходимые данные для выполнения алгоритма.
+
''' Инструкция ''':
    {
+
Пользователь должен ввести начальную скорость, угол и шаг, с которым будут рассчитываться координаты. В файл координаты записываются в таком порядке: 1, 2 столбики - Координаты, рассчитанные по формуле, при движении без сопротивления воздуха; 3, 4 - Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости; 5,6 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости; 7,8 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости.  
    Xnext = 2.0*X - Xprev - (R/m)*V*Vx*(dt*dt);
 
    Vx = (1.0/(2.0*dt))*(Xnext - Xprev);
 
    Ynext = 2.0*Y - Yprev - (g +(R/m)*V*Vy)*(dt*dt);
 
    Vy =  (1.0/(2.0*dt))*(Ynext - Yprev);
 
    V = sqrt((Vx*cos(alpha)*Vx*cos(alpha)) + (Vy*sin(alpha) - g*dt)*(Vy*sin(alpha) - g*dt));
 
    if (Ynext > Yo )
 
        fprintf(Coord, "%.3lf \t %.3lf\n", Xnext, Ynext);
 
    else
 
  
      fprintf(Coord, "%.3lf \t %.3lf\n", X, 0.000);
+
Скачать можно  [http://tm.spbstu.ru/File:ТраекторияАнПол.rar тут].
  
    Xprev = X;
 
    X = Xnext;
 
    Yprev = Y;
 
    Y = Ynext;
 
    }
 
  
}
+
<div class="mw-collapsible-content">
int VerleL (double alpha, double dt, double t, double Yo, double Xo, double Vo, double R, double m) // Функция, записывающая в файл VerleL.txt оординаты тела, рассчитывающиеся по формлуе Верле
 
{                                                                                                  // для линейной зависимости сопротивления от скорости
 
    FILE *Coord;
 
  Coord = fopen ("VerleL.txt", "w");
 
  
    double X, Xnext, Xprev, Y, Ynext, Yprev, Vx, Vy, V,Yop, Xop; // Комментарии аналогичны переменным и формулам в VtrleSq
 
  
    Yop = Yo - Vo*sin(alpha)*dt;
+
'''Визуализированный результат работы программы'''
    Xop = Xo - Vo*cos(alpha)*dt;
 
    X = Xo;
 
    Y = Yo;
 
    Xnext = 2.0*X - Xop - (R/m)*Vo*Vo*cos(alpha)*(dt*dt);
 
    Vx = (1.0/(2.0*dt))*(Xnext - Xop);
 
    Ynext = 2.0*Y - Yop - (g +(R/m)*Vo*Vo*sin((alpha)))*(dt*dt);
 
    Vy =  (1.0/(2.0*dt))*(Ynext - Yop);
 
    V = sqrt((Vo*cos(alpha)*Vo*cos(alpha)) + (Vo*sin(alpha)*Vo*sin(alpha)));
 
  
    fprintf(Coord, "%.3lf \t %.3lf\n", X, Y);
+
[[:File:graphAP.png]]
  
    Xprev = X;
+
Для тела с массой 1 кг,сопротивлением воздуха 0.001, угол бросания 60°, начальная скорость 50 м/с, ускорение свободного падения 9.8 м/c^2, шаг 0.00001;
    X = Xnext;
 
    Yprev = Y;
 
    Y = Ynext;
 
  
 +
# "MyFile.txt" using 1 : 2 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
# "MyFile.txt" using 3 : 4 -  Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# "MyFile.txt" using 5 : 6 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# "MyFile.txt" using 7 : 8 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости.
  
    while (Y >= Yo)
 
    {
 
    Xnext = 2.0*X - Xprev - (R/m)*Vx*(dt*dt);
 
    Vx = (1.0/(2.0*dt))*(Xnext - Xprev);
 
    Ynext = 2.0*Y - Yprev - (g +(R/m)*Vy)*(dt*dt);
 
    Vy =  (1.0/(2.0*dt))*(Ynext - Yprev);
 
  if (Ynext > Yo )
 
        fprintf(Coord, "%.3lf \t %.3lf\n", Xnext, Ynext);
 
    else
 
      fprintf(Coord, "%.3lf \t %.3lf\n", Xnext, 0.000);
 
  
    Xprev = X;
 
    X = Xnext;
 
    Yprev = Y;
 
    Y = Ynext;
 
    }
 
  
}
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
+
#include <iostream>
int main()
+
#include <fstream>
 +
#include "math.h"
 +
#include <iomanip>
 +
using namespace std;
 +
class func
 
{
 
{
  double alpha, Vo, dt, R, m , t = 0, Yo = 0, Xo = 0; // Объявляем переменные: alpha - угол броска; Vo - начальная скорость; dt - шаг по времени; R- коэф. сопротивления; m- масса тела;
 
                                                      // t = 0 - начало отсчета времени с 0; Yo = 0, Xo = 0 - координаты начала
 
  int i = 0; // переменная для оператора switch
 
  
  cout << "Enter start speed:\n";
+
private:
   cin >> Vo; // Вводим с клавиатуры начальную скорость
+
    double speed0, angle0, step ;
   cout << "Enter angle in grades ( from 0 to 180 ):\n";
+
   double time;
  cin >> alpha; // Вводим с клавиатуры угол броска в градусах
+
 
  alpha = alpha*Pi / 180; // переводим угол броска из градусов в радианы
+
   public:
  cout << "Enter mass:\n";
+
      double const g=9.8, n=0.001, m=1;///постоянная g, n-коэфициент сопротивления воздухаб m-масса
  cin >> m; // Вводим с клавиатуры массу
+
      double t, amount;
  cout << "Enter precision:\n";
+
      int amountint;
  cin >> dt; // Вводим с клавиатуры шаг по времени
+
    func ( double _speed0, double _angle0, double _step ):speed0(_speed0), angle0(_angle0), step(_step)
  cout << "Enter resistance:\n";
+
    {
  cin >> R; // Вводим сопротивление воздуха
+
        angle0=(3.14159*angle0) / 180 ; ///перевод угла в радианы
  cout << "Press 1 to draw graph without resistance\n\n"
 
          "Press 2 to draw graph in Exact form\n\n"
 
          "Press 3 to draw graph in VerleSq form\n\n"
 
          "Press 4 to draw graph in VerleL form\n\n"
 
          "Press 5 to draw all graphs at the same time\n\n"
 
          "Press 0 to quit\n\n";
 
  cin >> i;
 
  cout << "\nPress any button\n";
 
  
 +
        time = ( 2*speed0*sin(angle0) ) / g;///подсчет полного времени полета
 +
        amount = (time/step) + 1;///количество точек для траектории
 +
        amountint =  static_cast<int> (amount) ;
  
    FILE *Gnu;
 
    Gnu = fopen ("Throws.gp", "w"); // Создаем файл формата gp, который будем открывать программой gnuplot для того, чтобы построить наш график/ки по точкам
 
  
switch ( i )
+
    }
{
+
 
case 1:
+
 
    {
+
 
    WoutR(alpha,dt,t,Yo,Vo);
+
      void SaveFile(char filename[])
     fprintf(Gnu, "plot \"Throws Without Resistance.txt\" using 1:2 w l");
+
     {
    break;
+
        double x0=0, y0=0;
    }
+
        double xv1=0, x1=0, y1=0, Vx1=speed0*cos(angle0),Vy1=speed0*sin(angle0), V1=speed0, yv1=0;
case 2:
+
        double xm1=x0-speed0*cos(angle0)*step, ym1=y0-speed0*sin(angle0)*step;
    {
+
        double xv2=0, x2=0, y2=0, Vx2=speed0*cos(angle0),Vy2=speed0*sin(angle0), V2=speed0, yv2=0;
    ExactForm(alpha,dt,t,Yo,Vo,R,m);
+
        double xm2=x0-speed0*cos(angle0)*step, ym2=y0-speed0*sin(angle0)*step;
    fprintf(Gnu, "plot \"ExactForm.txt\" using 1:2 w l");
+
        double x3,y3;
    break;
+
        std::ofstream fout(filename);
    }
+
        for (int i=0; (y0+(speed0*sin(angle0)*i*step - (g*i*i*step*step*0.5)))>=0; i++)
case 3:
+
        {
    {
+
            ///Верле линейная зависимость
    VerleSq(alpha,dt,t,Yo,Xo,Vo,R, m);
+
            x2=2*xv2-xm2-(n/m)*step*step*Vx2;
    fprintf(Gnu, "plot \"VerleSq.txt\" using 1:2 w l");
+
            y2=2*yv2-ym2-(g+(n/m)*Vy2)*step*step;
    break;
+
            Vx2=(x2-xm2) / (2.0*step);
    }
+
            Vy2=(y2-ym2) / (2.0*step);
case 4:
+
            xm2=xv2;
    {
+
            xv2=x2;
    VerleL(alpha,dt,t,Yo,Xo,Vo,R, m);
+
            ym2=yv2;
    fprintf(Gnu, "plot \"VerleL.txt\" using 1:2 w l");
+
            yv2=y2;
    break;
 
    }
 
case 5:
 
    {
 
  WoutR(alpha,dt,t,Yo,Vo);
 
  ExactForm(alpha,dt,t,Yo,Vo,R,m);
 
  VerleSq(alpha,dt,t,Yo,Xo,Vo,R, m);
 
  VerleL(alpha,dt,t,Yo,Xo,Vo,R, m);
 
  fprintf(Gnu, "plot \"Throws Without Resistance.txt\" using 1:2 w l, \"ExactForm.txt\" using 1:2 w l, \"VerleSq.txt\" using 1:2 w l, \"VerleL.txt\" using 1:2 w l"); // записываем в Throws.gp названия четырех файлов
 
  break;
 
    }                                                  // с координатами таким образом, чтобы программа gnuplot смогла их увидеть и прочесть
 
case 0:
 
    break;
 
default:
 
    break;
 
}
 
    return 0;
 
}
 
  
</syntaxhighlight>
+
            ///точное решение
</div>
+
            x3=x0+speed0*cos(angle0)*(m/n)*(1.0-exp(-(n/m)*i*step));
 +
            y3=y0+(m/n)*(speed0*sin(angle0) + g*(m/n))*(1.0-exp(-(n/m)*i*step))-g*(m/n)*i*step;
  
 +
            ///метод Верле, квадратичная зависимость
 +
            x1=2*xv1-xm1-(n/m)*step*step* Vx1 * V1;
 +
            y1=2*yv1-ym1-(g+(n/m)*V1*Vy1)*step*step;
 +
            Vx1=(x1-xm1) / (2.0*step);
 +
            Vy1=(y1-ym1) / (2.0*step);
 +
            V1=sqrt(Vx1*Vx1+Vy1*Vy1);
 +
            xm1=xv1;
 +
            xv1=x1;///запоминание предыдущего шага
 +
            ym1=yv1;
 +
            yv1=y1;
  
'''[[Иванова Яна]]'''
 
 
'''Описание программы''': в программе выполняются четыре метода подсчета координат тела, брошенного под углом к горизонту. Координаты записываются в файл, строятся четыре графика, иллюстрирующие поведение тела при полете. Код написан для определенных начальных условий (для примера), если Вы хотите выполнить расчет для другой конфигурации, внесите изменения в начальные данные программы в самом коде.
 
Начальная скорость: 40 м/с, угол бросания: 45 градусов, коэффициент сопротивления воздуха: 0.023, шаг по времени : 0.1 секунды.
 
  
Скачать программу можно [http://tm.spbstu.ru/File:main.zip здесь]
 
  
<div class="mw-collapsible-content">
+
fout<< setw(20) << (x0+(speed0*cos(angle0)*step*i)) << setw(20) << (y0+(speed0*sin(angle0)*i*step - (g*i*i*step*step*0.5)))<<setw(20) << x1 << setw(20) << y1 <<setw(20) << x2 << setw(20)<<y2<<setw(20) << x3 << setw(20) << y3<<" \n";
'''Визуализированный результат работы программы'''[[File:graph.png]]
 
  
[[:File:graph.png]]
+
        }
 +
        fout.close();
 +
    }
  
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
};
#include <iostream>
 
#include <math.h>
 
#include <iomanip>
 
#include <fstream>
 
#include <conio.h>
 
 
 
 
 
using namespace std;
 
 
 
ofstream outfile;
 
 
 
double perevod (double angle) //перевод из градусов в радианы
 
{
 
    return (angle * M_PI / 180 );
 
}
 
  
  
 
int main()
 
int main()
 
{
 
{
     //объявление переменных и задание начальных значений
+
     double V0, angle, step;
     double X, Xnext, Xprev, Y, Ynext, Yprev, Vx, Vy, V,
+
    cout << " enter V0 = ";///введите начальную скорость
     m = 1 , dt = 0.1 , g = 9.8,t = 0,
+
     cin >> V0;
     ugol = 45, alpha, R = 0.023, Xo = 0, Yo = 0, Vo = 40;
+
     cout << " enter an angle , 0 < angle <= 90, angle = " ;///введите угол в диапозоне от 0 до 90 градусов
 +
    cin >> angle;
 +
    cout << "\n enter step ";///введите шаг, с которым будут рассчитываться координаты
 +
    cin >> step; cout << endl;
 +
     func f1(V0,angle,step);///создание траектории
 +
    f1.SaveFile("Myfile.txt");///запись в файл
 +
 
  
     alpha = perevod (ugol);
+
     return 0;
 +
}
 +
</syntaxhighlight>
 +
</div>
  
    //точное решение для случая движения без сопротивления воздуха
 
    Y = Yo;
 
    X = Xo;
 
  
    outfile.open("1.txt");
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
'''[[Иванова Яна]]'''
  
    while (Y >= Yo)
+
'''Описание программы''': в программе выполняются четыре метода подсчета координат тела, брошенного под углом к горизонту. Координаты записываются в файл, строятся четыре графика, иллюстрирующие поведение тела при полете. Код написан для определенных начальных условий (для примера), если Вы хотите выполнить расчет для другой конфигурации, внесите изменения в начальные данные программы в самом коде.
    {
+
Начальная скорость: 40 м/с, угол бросания: 45 градусов, коэффициент сопротивления воздуха: 0.023, шаг по времени : 0.1 секунды.
        X = Xo + Vo * cos(alpha) * t;
 
        Vx = Vo * cos(alpha);
 
        Y = Yo + Vo * sin(alpha) * t  - 0.5 * g * t * t;
 
        Vy = Vo * sin(alpha) - g * t;
 
        t += dt;
 
  
        outfile << X << ' ' << Y << endl;
+
Скачать программу можно [http://tm.spbstu.ru/File:main.zip здесь]
    }
 
    outfile.close();
 
  
    //начальные условия для квадратичной зависимости (метод Верле)
+
<div class="mw-collapsible-content">
    Yprev = Yo - Vo*sin(alpha)*dt;
+
'''Визуализированный результат работы программы'''[[File:graph.png]]
    Xprev = Xo - Vo*cos(alpha)*dt;
+
 
    X = Xo;
+
[[:File:graph.png]]
    Y = Yo;
+
 
    V = Vo;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    Vx = Vo * cos(alpha);
+
#include <iostream>
    Vy = Vo * sin(alpha);
+
#include <math.h>
 +
#include <iomanip>
 +
#include <fstream>
 +
#include <conio.h>
  
    outfile.open("2.txt");
 
  
    while (Y >= Yo)
+
using namespace std;
    {
 
        Xnext = 2.0 * X - Xprev - (R / m) * V * Vx * (dt * dt);
 
        Vx = ( Xnext - Xprev )/ (2.0 * dt);
 
        Ynext = 2.0 * Y - Yprev - (g + (R / m) * V * Vy) * (dt * dt);
 
        Vy =  (Ynext - Yprev)/ (2.0 * dt);
 
        V = sqrt(Vy*Vy + Vx*Vx );
 
        outfile << X << ' ' << Y << endl;
 
  
        Xprev = X;
+
ofstream outfile;
        X = Xnext;
 
        Yprev = Y;
 
        Y = Ynext;
 
    }
 
    outfile.close();
 
  
    //начальные условия для линейной зависимости (метод Верле)
+
double perevod (double angle) //перевод из градусов в радианы
    Yprev = Yo - Vo*sin(alpha)*dt;
+
{
     Xprev = Xo - Vo*cos(alpha)*dt;
+
     return (angle * M_PI / 180 );
    X = Xo;
+
}
    Y = Yo;
 
    V = Vo;
 
    Vx = Vo * cos(alpha);
 
    Vy = Vo * sin(alpha);
 
  
    outfile.open("3.txt");
 
  
    while (Y >= Yo)
+
int main()
     {
+
{
        Xnext = 2.0 * X - Xprev - (R / m) * Vx * (dt * dt);
+
     //объявление переменных и задание начальных значений
        Vx = ( Xnext - Xprev )/ (2.0 * dt);
+
    double X, Xnext, Xprev, Y, Ynext, Yprev, Vx, Vy, V,
        Ynext = 2.0 * Y - Yprev - (g + (R / m) * Vy) * (dt * dt);
+
    m = 1 , dt = 0.1 , g = 9.8,t = 0,
        Vy = (Ynext - Yprev)/ (2.0 * dt);
+
    ugol = 45, alpha, R = 0.023, Xo = 0, Yo = 0, Vo = 40;
        V = sqrt(Vy*Vy + Vx*Vx );
 
        outfile << X << ' ' << Y << endl;
 
  
        Xprev = X;
+
    alpha = perevod (ugol);
        X = Xnext;
 
        Yprev = Y;
 
        Y = Ynext;
 
    }
 
    outfile.close();
 
  
     //точное решения для линейной зависимости
+
     //точное решение для случая движения без сопротивления воздуха
 
     Y = Yo;
 
     Y = Yo;
 
     X = Xo;
 
     X = Xo;
    t = 0;
 
  
     outfile.open("4.txt");
+
     outfile.open("1.txt");
  
 
     while (Y >= Yo)
 
     while (Y >= Yo)
 
     {
 
     {
 +
        X = Xo + Vo * cos(alpha) * t;
 
         Vx = Vo * cos(alpha);
 
         Vx = Vo * cos(alpha);
         Vy = Vo * sin(alpha);
+
         Y = Yo + Vo * sin(alpha) * t  - 0.5 * g * t * t;
        X = (m * Vx / R)* (1 - exp(-1 * R * t / m));
+
         Vy = Vo * sin(alpha) - g * t;
         Y = (m/R)*((Vy + g * m / R)*(1 - exp(-1 * R * t / m)) - g * t);
 
 
         t += dt;
 
         t += dt;
 +
 
         outfile << X << ' ' << Y << endl;
 
         outfile << X << ' ' << Y << endl;
 
     }
 
     }
 
     outfile.close();
 
     outfile.close();
  
     return 0;
+
     //начальные условия для квадратичной зависимости (метод Верле)
 +
    Yprev = Yo - Vo*sin(alpha)*dt;
 +
    Xprev = Xo - Vo*cos(alpha)*dt;
 +
    X = Xo;
 +
    Y = Yo;
 +
    V = Vo;
 +
    Vx = Vo * cos(alpha);
 +
    Vy = Vo * sin(alpha);
  
}
+
    outfile.open("2.txt");
  
</syntaxhighlight>
+
    while (Y >= Yo)
</div>
+
    {
 +
        Xnext = 2.0 * X - Xprev - (R / m) * V * Vx * (dt * dt);
 +
        Vx = ( Xnext - Xprev )/ (2.0 * dt);
 +
        Ynext = 2.0 * Y - Yprev - (g + (R / m) * V * Vy) * (dt * dt);
 +
        Vy =  (Ynext - Yprev)/ (2.0 * dt);
 +
        V = sqrt(Vy*Vy + Vx*Vx );
 +
        outfile << X << ' ' << Y << endl;
  
<div>
+
        Xprev = X;
 +
        X = Xnext;
 +
        Yprev = Y;
 +
        Y = Ynext;
 +
    }
 +
    outfile.close();
  
'''[[Капитанюк Светлана]]'''
+
    //начальные условия для линейной зависимости (метод Верле)
 
+
    Yprev = Yo - Vo*sin(alpha)*dt;
'''Описание программы''' : программа записывает в четыре файла результаты вычисления:
+
    Xprev = Xo - Vo*cos(alpha)*dt;
 +
    X = Xo;
 +
    Y = Yo;
 +
    V = Vo;
 +
    Vx = Vo * cos(alpha);
 +
    Vy = Vo * sin(alpha);
  
Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
+
    outfile.open("3.txt");
Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
  
Скачивать [http://tm.spbstu.ru/File:Point_03.zip тут]
+
    while (Y >= Yo)
 +
    {
 +
        Xnext = 2.0 * X - Xprev - (R / m) * Vx * (dt * dt);
 +
        Vx = ( Xnext - Xprev )/ (2.0 * dt);
 +
        Ynext = 2.0 * Y - Yprev - (g + (R / m) * Vy) * (dt * dt);
 +
        Vy =  (Ynext - Yprev)/ (2.0 * dt);
 +
        V = sqrt(Vy*Vy + Vx*Vx );
 +
        outfile << X << ' ' << Y << endl;
  
</div>
+
        Xprev = X;
 +
        X = Xnext;
 +
        Yprev = Y;
 +
        Y = Ynext;
 +
    }
 +
    outfile.close();
  
<div>
+
    //точное решения для линейной зависимости
'''[[Киселёв Лев]]'''
+
    Y = Yo;
 +
    X = Xo;
 +
    t = 0;
  
'''Описание программы''': программа рассчитывает координаты точки при следующих случаях
+
    outfile.open("4.txt");
#  Полет тела без сопротивления воздуха;
 
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются точным методом;
 
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
 
#  Полет тела при квадратичной зависимости силы сопротивлении воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
 
  
Скачать можно [[http://mech.spbstu.ru/File:3zadanie.rar тут]]
+
    while (Y >= Yo)
 +
    {
 +
        Vx = Vo * cos(alpha);
 +
        Vy = Vo * sin(alpha);
 +
        X = (m * Vx / R)* (1 - exp(-1 * R * t / m));
 +
        Y = (m/R)*((Vy + g * m / R)*(1 - exp(-1 * R * t / m)) - g * t);
 +
        t += dt;
 +
        outfile << X << ' ' << Y << endl;
 +
    }
 +
    outfile.close();
 +
 
 +
    return 0;
 +
 
 +
}
 +
 
 +
</syntaxhighlight>
 
</div>
 
</div>
 +
  
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
'''[[Лебедев Станислав]]'''  
+
'''[[Уманский Александр]]'''  
  
 
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
 
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
Строка 902: Строка 912:
 
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
Скачать можно  [http://tm.spbstu.ru/Файл:Шарик.rar тут].
+
<div class="mw-collapsible-content">
  
<div class="mw-collapsible-content">
+
[[File:Methods.rar|Скачать архив]]
  
 
[[File:1.png]]
 
[[File:1.png]]
  
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
  
'''Визуализированный результат работы программы'''
+
</syntaxhighlight>
[[File:graph.png]]
+
</div>
  
# o1 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 
# o2 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
# o3 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
# o4 - координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
  
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
'''[[Лосева Татьяна ]]'''
  
Для тела с массой 10,сопротивлением воздуха 1, угол бросания 30°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2;
+
'''Описание:''' Пользователя попросят ввести начальную скорость,угол бросания,массу тела и коэф.сопротивления воздуха,тогда программа запишет в 4 разных файла результаты следующих вычислений:
 +
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 +
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
 
 +
<div class="mw-collapsible-content">
 +
 
 +
''Графики полученные при скорости =10 m/c;угле = 30 градусам;массе=10 кг;коэф.сопротивления=1;''
  
''Примечание: графики o1 и o2 намеренно посчитаны с малой точностью, чтобы графики не сливались.''
+
[[File:загружено (1).png]][[:File:загружено (1).png]]
  
Файл "'''main.cpp'''"
 
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
#include <iostream>
+
#include<iostream>
#include <math.h>
+
using namespace std;
#include "Vector.h"
+
#define N 1
#include <cstring>
+
#define PI 3.14159265
#include <cmath>
 
#include <malloc.h>
 
 
#include <fstream>
 
#include <fstream>
 +
#include<cmath>
 +
double g=9.8;
 +
double step=0.01;
 +
#include<math.h>
  
using namespace std;
+
void Func(double v,double r)//1.Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 
 
int n = 100;
 
ofstream outfile;
 
  
class Ball                                          //класс бросаемого тела
 
 
{
 
{
    private:
+
double x,y;
        double angle,m,k;                           //угол броска,масса,коэффицент сопротивления воздуха
+
        Vector3D r,v,a;                             //радиус-вектор,вектор скорости,ускорения
+
ofstream fout;//открытие файла
    public:
+
  fout.open("C:\\Users\\Light\\Desktop\\1.txt");//указываем путь записи
 +
cout<<"method1"<<endl;
  
        //задание начальных параметров через угол,начальное положение,скорость и ускорение,с которым движется тело. Без сопротивления воздуха
+
  for(double t=0.01;t<N;t=t+0.01)
        Ball(double _angle, Vector3D _r, Vector3D _v, Vector3D _a)
+
{
        {
+
y=v*t*sin(r*PI/ 180)-g*t*t/2;//координата y
            angle = _angle;
+
x=v*t*cos(r*PI / 180);//координата х
            r     = _r;
+
 
            v    = _v;
+
fout<<x<<"  ";//запись в файл х
            a    = _a;
+
cout<<"X="<<x<<endl;//вывод на экран
        }
+
    fout<<y<<"    ";//запись в файл
 +
cout<<"Y="<<y<<endl<<endl;//вывод на экран
 +
fout<<endl;
 +
  }
 +
}
 +
 
 +
void Verle1( double n,double m ,double v0,double r)//Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
  
        //задание начальных параметров через угол,начальное положение,скорость и ускорение,с которым движется тело. Без сопротивления воздуха
+
{
        Ball(double _angle, double _m, double _k, Vector3D _r, Vector3D _v, Vector3D _a)
+
double x,y,x0=0,y0=0,xn_1,yn_1;//x0,y0=Xn,Yn начальные значения;xn_1=X(n-1);yn_1=Y(n-1);
        {
 
            angle = _angle;
 
            r    = _r;
 
            v    = _v;
 
            a    = _a;
 
            m    = _m;
 
            k    = _k;
 
        }
 
  
        //точная формула зависимости координаты от времени
+
double vx=v0*cos(r*PI / 180);//рассчитваем Vn для первого случая n=0 для x
        Vector3D positionReal(double t)
+
  double vy=v0*sin(r*PI/ 180)-g*step;//рассчитваем Vn для первого случая n=0 для y
        {
 
            double c1 = m/k,c2 = fabs(a.y)*c1, c3 = exp(-t/c1), c4 = c2*t;
 
            return MakeVector(v.x*c1*(1 - c3), c1*(v.y + c2)*(1 - c3) - c4 , 0 );
 
        }
 
  
         //вывод положения на экран
+
  xn_1=x0-vx*step;//X(n-1) для первого случая n=0
         void writePosToScreen()
+
  yn_1=y0-vy*step;//Y(n-1) для первого случая n=0
        {
+
  ofstream fout;//открытие файла
            cout << r.x << "   " << r.y << "   " << r.z << endl;
+
fout.open("C:\\Users\\Light\\Desktop\\2.txt");//путь записи в файл
        }
+
cout<<"Verle1"<<endl<<endl;
 +
for(double t=0.02;t<N;t=t+step)
 +
{
 +
x=2*x0-xn_1-(n*vx*step*step)/m;//считаем Хn+1
 +
vx=(x-xn_1)/(2*step);
 +
         xn_1=x0;//для следущего шага Xn-1=Xn
 +
         x0=x;//для следущего шага Xn=Xn+1
 +
 +
y=2*y0-yn_1-(g+(n*vy)/m)*step*step;//Yn+1
 +
vy=(y-yn_1)/(2*0.01);//скорость
 +
yn_1=y0;//для следущего шага Yn-1=Yn
 +
y0=y;//для следущего шага Yn=Yn+1
 +
    cout<<"X="<<x<<endl;
 +
cout<<"Y="<<y<<endl<<endl;
 +
    fout<<x<<" ";
 +
fout<<y<<"  ";
 +
fout<<endl;  
 +
  
        //вывод положения в файл
+
}
        void writePosToFile(char s[])
+
}
        {
 
            outfile.open(s,ios :: app);
 
            outfile << r.x << "          " << r.y << endl;
 
            outfile.close();
 
        }
 
  
        //вывод произвольного вектора на экран
+
void Verle2( double n,double m ,double v0,double r)//3.Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
        void WVTS(Vector3D v)
 
        {
 
            cout.width(15);
 
            cout << v.x;
 
            cout.width(15);
 
            cout << v.y;
 
            cout.width(15);
 
            cout << v.z << endl;
 
        }
 
  
        //вывод произвольного вектора в файл
+
{
        void WVTF(Vector3D v,char s[])
+
double x,y,x0=0,y0=0,xn_1,yn_1,v;//x0,y0=Xn,Yn начальные значения;xn_1=X(n-1);yn_1=Y(n-1);
        {
 
            outfile.open(s,ios :: app);
 
            outfile << v.x << "          " << v.y << endl;
 
            outfile.close();
 
        }
 
  
        //"пересчет" координаты по Верле(Линейная зависмость)
+
double vx=v0*cos(r*PI / 180);//рассчитваем Vn для первого случая n=0 для x
        void changeR(Vector3D r1, double dt)
+
  double vy=v0*sin(r*PI/ 180)-g*step;//рассчитваем Vn для первого случая n=0 для y
        {
 
            r = MakeVector(2 * r.x -  r1.x - k/m*v.x*dt*dt,2*r.y - r1.y - (abs(a.y) + k/m*v.y)*dt*dt, 0 );
 
        }
 
  
        //"пересчет" координаты по Верле(Квадратичная зависимость)
+
  xn_1=x0-vx*step;//X(n-1) для первого случая n=0
        void changeRSQ(Vector3D r1, double dt)
+
  yn_1=y0-vy*step;//Y(n-1) для первого случая n=0
        {
+
  ofstream fout;//открытие файла
            r = MakeVector(2 * r.x -  r1.x - k/m*Length(v)*v.x*dt*dt,2*r.y - r1.y - (abs(a.y) + k/m*Length(v)*v.y)*dt*dt, 0 );
+
  fout.open("C:\\Users\\Light\\Desktop\\3.txt");//путь записи
        }
+
cout<<"Verle2"<<endl<<endl;
        //пересчет скорости по Верле
+
for(double t=0.02;t<N;t=t+step)
        void changeV(Vector3D r1,double dt)
+
{
        {
 
            v =VS((VmV(r,r1)),1/(2*dt));
 
        }
 
  
        //рассчет предыдущегт к 0ому элементу
+
  v=sqrt(vx*vx+vy*vy);//скорость V
        Vector3D MR1(double dt)
 
        {
 
            return MakeVector(r.x - v.x * dt,r.y - v.y * dt,0);
 
        }
 
  
        //возращает координату тела
+
x=2*x0-xn_1-(n*v*vx*step*step)/m;//Xn+1
        Vector3D getR()
+
vx=(x-xn_1)/(2*step);//скорость Vx
         {
+
         xn_1=x0;//для следущего шага Xn-1=Xn
            return r;
+
x0=x;//для следущего шага Xn=Xn+1
        }
+
 
+
y=2*y0-yn_1-(g+(n*vy*v)/m)*step*step;//Yn+1
        //рассчет времени полета
+
vy=(y-yn_1)/(2*0.01);//скорость Vy
        double TimeOfFly()
+
yn_1=y0;//для следущего шага Yn-1=Yn
        {
+
y0=y;//для следущего шага Yn=Yn+1
            return (2*Length(v)*sin(angle)/Length(a));
+
cout<<"X="<<x<<endl;
        }
+
cout<<"Y="<<y<<endl<<endl;
 +
fout<<x<<" ";
 +
fout<<y<<"  ";
 +
fout<<endl;  
 +
}
 +
 +
}
  
        //рассчет координаты по точной формуле. без сопротивления воздуха.
+
void method4(double n,double m ,double v0,double r)//Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
        Vector3D position(double t)
 
        {
 
            return MakeVector(r.x + v.x*t + a.x*t*t/2,r.y + v.y*t + a.y*t*t/2,r.z + v.z*t + a.z*t*t/2);
 
        }
 
 
 
};
 
 
 
int main()
 
 
{
 
{
    //задание начальных параметров
+
double x,y,x0=0,y0=0;//x0,y0 начальные значения;
    Vector3D g = {0,-9.8,0};
 
    double a,dt = 0;
 
    char s[20];
 
  
//    cin >> dt;
+
double vx=v0*cos(r*PI / 180);//рассчитваем Vx
 +
  double vy=v0*sin(r*PI/ 180)-g*step;//рассчитваем Vy
 +
 
 +
   ofstream fout;//открытие файла
 +
  fout.open("C:\\Users\\Light\\Desktop\\4.txt");
 +
cout<<"4"<<endl<<endl;
 +
for(double t=0.01;t<N;t=t+step)
 +
{
 +
x=x0+m*vx*(1-(exp((-1*n)*t/m)))/n;//координата х
 +
 +
y = y0+(m/n)*((vy + g * m / n)*(1 - exp(-1 * n * t / m))) - g * t*m/n;//координата у
  
    dt = 0.1;
+
//вывод в файл  и на экран
    a = (M_PI * 30)/180;
+
    cout<<"X="<<x<<endl;
    Ball b1(a, MakeVector(0,0,0),MakeVector(30,a),g);
+
cout<<"Y="<<y<<endl<<endl;
 +
fout<<x<<" ";
 +
fout<<y<<" ";
 +
fout<<endl;  
  
    double tof = b1.TimeOfFly()+1;  //единичка прибавлена,чтобы график красивым был
+
}
 +
}
 +
 
 +
int main(void)
 +
{
  
    //Без сопротивления возлуха
+
double v0,r,m,n;//v0-начальная скорость,r-угол в градусах,m-масса;n-коэф.сопротивления ветра
    strcpy(s,"");
+
 
    strcat(s, "o1.txt");
+
cout<<"Enter  start speed:"<<endl;
    outfile.open(s, ios :: trunc);
+
cin>>v0;
    outfile.close();
+
cout<<"Enter angle less than 90 deg:"<<endl;
    for (double i = 0; i <= tof; i += dt)
+
cin>>r;
    {
+
cout<<"Enter mass:"<<endl;
        b1.WVTS(b1.position(i));
+
cin>>m;
        b1.WVTF(b1.position(i), s);
+
cout<<"Coefficient of resistance:"<<endl;
    }
+
cin>>n;
 +
 +
Func(v0,r);
 +
Verle1(n,m,v0,r);
 +
Verle2(n,m,v0,r);
 +
method4(n,m,v0,r);
  
  
    //Верле(Линейная зависимость)
 
    dt = 0.1;
 
    a = (M_PI * 30)/180;
 
    Ball b2(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
 
 
    strcpy(s,"");
 
    strcat(s, "o2.txt");
 
    outfile.open(s,ios :: trunc);
 
    outfile.close();
 
    Vector3D r1 = b2.MR1(dt),rp;
 
    for (double i = 0; i <= 20; i += dt)
 
    {
 
        rp = b2.getR();
 
        b2.writePosToFile(s);
 
        b2.writePosToScreen();
 
        b2.changeR(r1,dt);
 
        b2.changeV(r1,dt);
 
        r1.x = rp.x;
 
        r1.y = rp.y;
 
    }
 
  
    //Точное решение (Линейная зависимость)
+
int k;
    dt = 0.1;
+
cin>>k;
    a = (M_PI * 30)/180;
+
return 0;
    Ball b3(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
+
}
  
    strcpy(s,"");
+
</syntaxhighlight>
    strcat(s, "o3.txt");
+
</div>
    outfile.open(s, ios :: trunc);
 
    outfile.close();
 
    for (double i = 0; i <= 20; i += dt)
 
    {
 
        b3.WVTS(b3.positionReal(i));
 
        b3.WVTF(b3.positionReal(i), s);
 
    }
 
  
 +
Скачать можно  [http://tm.spbstu.ru/Файл:Verle.rar  тут].
  
    //Верле (Квадратичная зависимость)
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    dt = 0.1;
+
'''[[Степанянц Степан]]'''
    a = (M_PI * 30)/180;
 
    Ball b4(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
 
  
    strcpy(s,"");
+
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
    strcat(s, "o4.txt");
+
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
    outfile.open(s, ios :: trunc);
+
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
    outfile.close();
+
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
    r1 = b4.MR1(dt);
+
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
    for (double i = 0; i <= 20; i += dt)
 
    {
 
        rp = b4.getR();
 
        b4.writePosToFile(s);
 
        b4.writePosToScreen();
 
        b4.changeRSQ(r1,dt);
 
        b4.changeV(r1,dt);
 
        r1.x = rp.x;
 
        r1.y = rp.y;
 
    }
 
  
    return 0;
+
Скачать можно  [http://tm.spbstu.ru/%D0%A4%D0%B0%D0%B9%D0%BB:Mainpr.rar тут].
}
 
</syntaxhighlight>
 
  
Файл "'''Vector.h'''"
+
<div class="mw-collapsible-content">
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
[[File:graph239.png]]
#ifndef VECTOR_H_INCLUDED
 
#define VECTOR_H_INCLUDED
 
  
struct Vector3D
+
Для тела с массой 1,сопротивлением воздуха 0.05, угол бросания 30°, начальная скорость 40 м/с, ускорение свободного падения 9.8 м/c^2;
{
 
  double x,y,z;
 
};
 
  
Vector3D VmV(Vector3D v1,Vector3D v2)              //векторное вычитание
 
{
 
    Vector3D v = {v1.x - v2.x,v1.y - v2.y,v1.z - v2.z };
 
    return v;
 
};
 
Vector3D VpV(Vector3D v1,Vector3D v2)              //векторное сложение
 
{
 
    Vector3D v = {v1.x + v2.x,v1.y + v2.y,v1.z + v2.z };
 
    return v;
 
}
 
  
double VV(Vector3D v1,Vector3D v2)              //скалярное умножение
 
{
 
  return (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
 
}
 
  
Vector3D VxV(Vector3D v1,Vector3D v2)               //векторное умножение
+
Файл "'''main.cpp'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <iostream>
 +
#include <locale.h>
 +
#include <math.h>
 +
#include <fstream>
 +
#include<iomanip>
 +
#include <cmath>
 +
using namespace std;
 +
main ()
 
{
 
{
  Vector3D v = {v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z,v1.x*v2.y - v1.y*v2.x};
+
    ofstream F;
  return v;
+
int u0=50;
}
+
double x,y,t,a,a1=30,dt=0.1,y0=0,x0=0,g=9.8,r=0.05,m=1,ux,uy,ypr,xpr,ysl,xsl,u,yt;
 +
a=a1*M_PI/180; //Градусы в радианы
 +
t=0;
  
bool Kol(Vector3D v1,Vector3D v2)
+
//Движение без сопротивления воздуха
 +
F.open("C:\\1.txt",ios::out);
 +
while(y>=0)
 
{
 
{
  return ((v1.x/v2.x == v1.y/v2.y)&&(v1.z/v2.z == v1.y/v2.y))? true:false;
+
    x=x0+u0*cos(M_PI/6)*t;
 +
    y=y0+u0*sin(M_PI/6)*t - 0.5 * g * t * t;
 +
  F<<x<<" "<<y<<endl;
 +
  t=t+dt;
 +
 
 
}
 
}
  
Vector3D VS(Vector3D v1, double s)
+
F.close();
 +
//Точное решение для линейной зависимости
 +
F.open("C:\\2.txt",ios::out);
 +
y=y0;
 +
x=x0;
 +
t=0;
 +
while(y>=0)
 
{
 
{
    Vector3D v = {v1.x*s, v1.y*s, v1.z*s};
+
        ux = u0 * cos(a);
    return v;
+
        uy = u0 * sin(a);
}
+
        x = x0+ (m * ux / r)* (1 - exp(-1 * r * t / m));
 +
        y = y0+(m/r)*((uy + g * m / r)*(1 - exp(-1 * r * t / m)) - g * t);
 +
        t = t + dt;
 +
 
 +
      F << x << ' ' << y << endl;
  
double Length(Vector3D v1)
 
{
 
    return sqrt(VV(v1,v1));
 
}
 
  
Vector3D MakeVector(double x,double y,double z)
 
{
 
    Vector3D v = {x,y,z};
 
    return v;
 
}
 
  
Vector3D MakeVector(double length,double angle)
 
{
 
    Vector3D v = {length * cos(angle), length * sin(angle),0};
 
    return v;
 
 
}
 
}
 +
  F.close();
 +
//метод Верле 1
 +
ypr = y0 - u0*sin(a)*dt;
 +
yt=ypr;
 +
    xpr = x0 - u0*cos(a)*dt;
 +
    x = x0;
 +
    y = y0;
 +
    u = u0;
 +
    ux = u0 * cos(a);
 +
    uy = u0 * sin(a);
 +
F.open("C:\\3.txt",ios::out);
  
double Proection(Vector3D base, Vector3D dir)
+
    while (y >= y0)
{
+
    {
    return (VV(base,dir)/Length(base));
+
        xsl = 2 * x - xpr - (r / m) * u * ux * (dt * dt);
}
+
        ux = ( xsl - xpr )/ (2 * dt);
#endif // VECTOR_H_INCLUDED
+
        ysl = 2 * y - ypr - (g + (r / m) * u * uy) * (dt * dt);
</syntaxhighlight>
+
        uy =  (ysl - ypr)/ (2 * dt);
</div>
+
        u = sqrt(uy*uy + ux*ux );
 +
        F << x << ' ' << y << endl;
  
 +
        xpr = x;
 +
        x = xsl;
 +
        ypr = y;
 +
        y = ysl;
 +
    }
 +
    F.close();
 +
    //Метод Верле 2
 +
    ypr = y0 - u0*sin(a)*dt;
 +
yt=ypr;
 +
    xpr = x0 - u0*cos(a)*dt;
 +
    x = x0;
 +
    y = y0;
 +
    u = u0;
 +
    ux = u0 * cos(a);
 +
    uy = u0 * sin(a);
 +
F.open("C:\\4.txt",ios::out);
 +
 +
    while (y >= y0)
 +
    {
 +
        xsl = 2 * x - xpr - (r / m) * ux * (dt * dt);
 +
        ux = ( xsl - xpr )/ (2 * dt);
 +
        ysl = 2 * y - ypr - (g + (r / m) * uy) * (dt * dt);
 +
        uy =  (ysl - ypr)/ (2 * dt);
 +
        u = sqrt(uy*uy + ux*ux );
 +
        F << x << ' ' << y << endl;
  
<div>
+
        xpr = x;
'''[[Лобанов Илья]]'''
+
        x = xsl;
 
+
        ypr = y;
'''Описание программы''' : программа записывает в четыре файла результаты вычисления:
+
        y = ysl;
 
+
    }
Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
+
    F.close();
Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
 
 
  
'''Краткая инструкция''':
 
  
В окне консоли пользователю предлагается вывести следующие значения: начальную скорость , угол и шаг.
+
return 0;
После этого полученные в результате работы программы данные выводятся в файл.
 
  
Скачивать [[http://tm.spbstu.ru/File:Air.rar тут]]
 
[[http://tm.spbstu.ru/File:phys.rar тут]]
 
  
</div>
+
}
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''[[Лосева Татьяна ]]'''
 
  
'''Описание:''' Пользователя попросят ввести начальную скорость,угол бросания,массу тела  и коэф.сопротивления воздуха,тогда программа запишет в 4 разных файла результаты следующих вычислений:
+
</syntaxhighlight>
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
+
</div>
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
  
<div class="mw-collapsible-content">
 
  
''Графики полученные при скорости =10 m/c;угле = 30 градусам;массе=10 кг;коэф.сопротивления=1;''
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
+
'''[[Александр Сюрис]]'''
[[File:загружено (1).png]][[:File:загружено (1).png]]
 
  
 +
'''Описание программы''':
 +
Программа записывает в текстовый файл результаты вычисления координат по x и y с шагом в 0.1 секунду(возможно изменить) четырьмя различными способами:
 +
#Координаты, рассчитанные по формуле, при движении без сопротивления воздуха
 +
#Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении          воздуха от скорости
 +
#Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости
 +
#Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости
 +
Скачать можно  [http://mech.spbstu.ru/File:%D0%9F%D0%BE%D0%BB%D0%B5%D1%82_%D1%82%D0%B5%D0%BB%D0%B0(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%A1%D1%8E%D1%80%D0%B8%D1%81).zip тут].
 +
<div class="mw-collapsible-content">
 +
[[File:Снимок.PNG]]
 +
Для тела с массой 1,сопротивлением воздуха 0.05, угол бросания 45°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2;
 +
Файл "'''main.cpp'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
#include<iostream>
+
#include <iostream>
 +
#include <fstream>
 +
#include <math.h>
 +
#include <cmath>
 
using namespace std;
 
using namespace std;
#define N 1
+
int o;
#define PI 3.14159265
+
double v,a,m,k;
#include <fstream>
+
ofstream fout("file.txt");//создаем объект, сяванный с файлом file.txt
#include<cmath>
+
 
double g=9.8;
 
double step=0.01;
 
#include<math.h>
 
  
void Func(double v,double r)//1.Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 
  
 +
int rez_1(double v, double a)
 
{
 
{
double x,y;
+
    fout<<"---------------Первый режим-------------------------"<<endl;
+
    fout<<" T=0 x=0 y=0";
ofstream fout;//открытие файла
+
    fout<<endl;
  fout.open("C:\\Users\\Light\\Desktop\\1.txt");//указываем путь записи
+
    double x=0,y=0,t=0.1, V0x, V0y, g=9.8,t1, T=0.1, Ty;
cout<<"method1"<<endl;
+
    V0x=v*cos(a/180*M_PI);//рассчет проекций начальных скоростей на оси x и y с переводом угла в радианы
 +
    V0y=v*sin(a/180*M_PI);
 +
    Ty=2*V0y/g;//время полета
 +
    while (y>0 || x==0)//условие: пока тело не упадет на землю(те y=0, при этом не учитывая начало полета
 +
    {
 +
        x=x+V0x*t;              //ф-лы для рассчета x и y в данный момент времени
 +
        y=y+V0y*t-g*pow(t,2)/2;
 +
 
 +
        if (y<0) //если y<0
 +
            {
 +
                t1=Ty-T; //рассчитываем время,которое осталось лететь телу до земли
 +
                x=x+V0x*t1;//используя это время находим координату по х
 +
                fout<<" T="<<Ty<<" x="<<x<<" y=0"<<endl;//ввод в текстовый файл
 +
                break;
 +
            }
 +
            else
 +
                {
 +
                    V0y=V0y-g*t;// иначе находим новую скорость по y (по x не меняется)
 +
                    fout<<" T="<<T<<" x="<<x<<" y="<<y<<endl;
 +
                    T=T+t;//увел время на шаг
 +
                }
 +
    }
 +
 
  
  for(double t=0.01;t<N;t=t+0.01)
 
{
 
y=v*t*sin(r*PI/ 180)-g*t*t/2;//координата y
 
x=v*t*cos(r*PI / 180);//координата х
 
 
 
fout<<x<<"  ";//запись в файл х
 
cout<<"X="<<x<<endl;//вывод на экран
 
    fout<<y<<"    ";//запись в файл
 
cout<<"Y="<<y<<endl<<endl;//вывод на экран
 
fout<<endl;
 
  }
 
 
}
 
}
 
 
void Verle1( double n,double m ,double v0,double r)//Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
  
{
 
double x,y,x0=0,y0=0,xn_1,yn_1;//x0,y0=Xn,Yn начальные значения;xn_1=X(n-1);yn_1=Y(n-1);
 
  
double vx=v0*cos(r*PI / 180);//рассчитваем Vn для первого случая n=0 для x
+
int rez_2(double v, double a, double k, double m)
  double vy=v0*sin(r*PI/ 180)-g*step;//рассчитваем Vn для первого случая n=0 для y
+
{
 +
    fout<<"---------------Второй режим работы-------------------------"<<endl;
 +
    fout<<" T=0 x=0 y=0";
 +
    fout<<endl;
 +
    double t=0.1, Vx=v*cos(a/180*M_PI), Vy=v*sin(a/180*M_PI),y,x,T=0.1,g=9.8;
 +
    x=(m*Vx/k)*(1-exp(-1*k*T/m));           //ф-лы для рассчета x и y в данный момент времени
 +
    y =(m/k)*((Vy+g*m/k)*(1-exp(-1*k*T/m))-g*T);  //точное решение при лин завсисимости
 +
    while (y>0)
 +
    {
 +
        x=(m*Vx/k)*(1-exp(-1*k*T/m));
 +
        y =(m/k)*((Vy+g*m/k)*(1-exp(-1*k*T/m))-g*T);
 +
        fout<<" T="<<T<<" x="<<x<<" y="<<y<<endl;
 +
        T=T+t;
 +
    }
 +
 
 +
 
 +
}
  
  xn_1=x0-vx*step;//X(n-1) для первого случая n=0
 
  yn_1=y0-vy*step;//Y(n-1) для первого случая n=0
 
  ofstream fout;//открытие файла
 
fout.open("C:\\Users\\Light\\Desktop\\2.txt");//путь записи в файл
 
cout<<"Verle1"<<endl<<endl;
 
for(double t=0.02;t<N;t=t+step)
 
{
 
x=2*x0-xn_1-(n*vx*step*step)/m;//считаем Хn+1
 
vx=(x-xn_1)/(2*step);
 
        xn_1=x0;//для следущего шага Xn-1=Xn
 
        x0=x;//для следущего шага Xn=Xn+1
 
 
y=2*y0-yn_1-(g+(n*vy)/m)*step*step;//Yn+1
 
vy=(y-yn_1)/(2*0.01);//скорость
 
yn_1=y0;//для следущего шага Yn-1=Yn
 
y0=y;//для следущего шага Yn=Yn+1
 
    cout<<"X="<<x<<endl;
 
cout<<"Y="<<y<<endl<<endl;
 
    fout<<x<<" ";
 
fout<<y<<"  ";
 
fout<<endl;
 
 
  
}
 
}
 
  
void Verle2( double n,double m ,double v0,double r)//3.Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
+
int rez_3(double v, double a, double k, double m)
 +
{
 +
  fout<<"---------------Третий режим работы-------------------------"<<endl;
 +
    fout<<" T=0 x=0 y=0";
 +
    fout<<endl;
 +
    double t=0.1, Vxn=v*cos(a/180*M_PI), Vyn=v*sin(a/180*M_PI),
 +
    x3=0,x2=0,x1=x2-Vxn*t,  y3=0,
 +
    y2=0, y1=y2-Vyn*t, g=9.8, t1, T=0.1;//шаг, скорость по х в момент времени T, -\\- по y в момент времени Т
 +
    //координата по х в в момент времени T, -\\- в n-1 шаг, -\\- в n шаге, аналогично для y,
  
{
 
double x,y,x0=0,y0=0,xn_1,yn_1,v;//x0,y0=Xn,Yn начальные значения;xn_1=X(n-1);yn_1=Y(n-1);
 
  
double vx=v0*cos(r*PI / 180);//рассчитваем Vn для первого случая n=0 для x
+
    x3=2*x2-x1-k/m*Vxn*pow(t,2);  //координаты в момент времени T
  double vy=v0*sin(r*PI/ 180)-g*step;//рассчитваем Vn для первого случая n=0 для y
+
    y3=2*y2-y1-(g-+k/m*Vyn)*pow(t,2);
 +
    Vxn=(x3-x1)/(2.0*t); //скорость в момент времени T
 +
    Vyn=(y3-y1)/(2.0*t);
 +
    x1=x2;// приравнивание к координате на n-1 шаге значение координаты в n шаге
 +
    y1=y2;
 +
    x2=x3;//-//- к координате в n шаге значение в момент времени T
 +
    y2=y3;
 +
    while (y2>0)
 +
    {
 +
        x3=2*x2-x1-k/m*Vxn*pow(t,2);
 +
        y3=2*y2-y1-(g+k/m*Vyn)*pow(t,2);
 +
        Vxn=(x3-x1)/(2.0*t);
 +
        Vyn=(y3-y1)/(2.0*t);
 +
        fout<<" T="<<T<<" x="<<x2<<" y="<<y2<<endl;
 +
 
 +
        if (y3<0)
 +
        {
 +
            t1=sqrt(abs((-y1+2*y2)/(g+k/m*Vyn)));
 +
            x3=2*x2-x1-k/m*Vxn*pow((t+t1),2);
 +
            fout<<" T="<<T+t1<<" x="<<x3<<" y="<<0<<endl;
 +
        }
  
  xn_1=x0-vx*step;//X(n-1) для первого случая n=0
+
        T=T+t;
  yn_1=y0-vy*step;//Y(n-1) для первого случая n=0
+
        x1=x2;
  ofstream fout;//открытие файла
+
        y1=y2;
  fout.open("C:\\Users\\Light\\Desktop\\3.txt");//путь записи
+
        x2=x3;
cout<<"Verle2"<<endl<<endl;
+
        y2=y3;
for(double t=0.02;t<N;t=t+step)
 
{
 
  
  v=sqrt(vx*vx+vy*vy);//скорость V
+
    }
  
x=2*x0-xn_1-(n*v*vx*step*step)/m;//Xn+1
 
vx=(x-xn_1)/(2*step);//скорость Vx
 
        xn_1=x0;//для следущего шага Xn-1=Xn
 
x0=x;//для следущего шага Xn=Xn+1
 
 
y=2*y0-yn_1-(g+(n*vy*v)/m)*step*step;//Yn+1
 
vy=(y-yn_1)/(2*0.01);//скорость Vy
 
yn_1=y0;//для следущего шага Yn-1=Yn
 
y0=y;//для следущего шага Yn=Yn+1
 
cout<<"X="<<x<<endl;
 
cout<<"Y="<<y<<endl<<endl;
 
fout<<x<<" ";
 
fout<<y<<"  ";
 
fout<<endl;
 
}
 
 
 
}
 
}
  
void method4(double n,double m ,double v0,double r)//Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
+
 
 +
int rez_4(double v, double a, double k, double m)
 
{
 
{
double x,y,x0=0,y0=0;//x0,y0 начальные значения;
+
  fout<<"---------------Четвертый режим работы-------------------------"<<endl;
 +
    fout<<" T=0 x=0 y=0";
 +
    fout<<endl;
 +
    double t=0.1, Vxn=v*cos(a/180*M_PI), Vyn=v*sin(a/180*M_PI),
 +
    x3=0,x1=0, x2=x1+Vxn*t, y3=0, y1=0,
 +
    y2=y1+Vyn*t, g=9.8, t1, T=0.1, V=v;//шаг, скорость по х в момент времени T, -\\- по y в момент времени Т
 +
    //координата по х в в момент времени T, -\\- в n-1 шаг, -\\- в n шаге, аналогично для y,
  
double vx=v0*cos(r*PI / 180);//рассчитваем Vx
 
  double vy=v0*sin(r*PI/ 180)-g*step;//рассчитваем Vy
 
 
 
  ofstream fout;//открытие файла
 
  fout.open("C:\\Users\\Light\\Desktop\\4.txt");
 
cout<<"4"<<endl<<endl;
 
for(double t=0.01;t<N;t=t+step)
 
{
 
x=x0+m*vx*(1-(exp((-1*n)*t/m)))/n;//координата х
 
 
y = y0+(m/n)*((vy + g * m / n)*(1 - exp(-1 * n * t / m))) - g * t*m/n;//координата у
 
  
//вывод в файл  и на экран
+
    x3=2.0*x2-x1-(k/m)*V*Vxn*pow(t,2);
    cout<<"X="<<x<<endl;
+
    y3=2.0*y2-y1-(g+(k/m)*V*Vyn)*pow(t,2);
cout<<"Y="<<y<<endl<<endl;
+
    Vxn=(x3-x1)/(2.0*t);
fout<<x<<" ";
+
    Vyn=(y3-y1)/(2.0*t);
fout<<y<<" ";
+
    V=sqrt(pow(Vxn,2)+pow(Vyn,2.0));
fout<<endl;  
+
    x1=x2;
 +
    y1=y2;
 +
    x2=x3;
 +
    y2=y3;
 +
    while (y2>0)
 +
    {
 +
        x3=2.0*x2-x1-(k/m)*Vxn*V*pow(t,2);
 +
        y3=2.0*y2-y1-(g+(k/m)*Vyn*V)*pow(t,2);
 +
        Vxn=(x3-x1)/(2.0*t);
 +
        Vyn=(y3-y1)/(2.0*t);
 +
        V=sqrt(pow(Vxn,2)+pow(Vyn,2));
 +
        fout<<" T="<<T<<" x="<<x2<<" y="<<y2<<endl;
  
}
+
        if (y3<0)
}
+
        {
 
+
            t1=sqrt(abs((-y1+2.0*y2)/(g+(k/m)*Vyn*V)));
int main(void)
+
            x3=2.0*x2-x1-(k/m)*Vxn*V*pow((t+t1),2);
{
+
            fout<<" T="<<T+t1<<" x="<<x3<<" y="<<0<<endl;
 +
        }
  
double v0,r,m,n;//v0-начальная скорость,r-угол в градусах,m-масса;n-коэф.сопротивления ветра
 
 
cout<<"Enter  start speed:"<<endl;
 
cin>>v0;
 
cout<<"Enter angle less than 90 deg:"<<endl;
 
cin>>r;
 
cout<<"Enter mass:"<<endl;
 
cin>>m;
 
cout<<"Coefficient of resistance:"<<endl;
 
cin>>n;
 
 
Func(v0,r);
 
Verle1(n,m,v0,r);
 
Verle2(n,m,v0,r);
 
method4(n,m,v0,r);
 
  
 +
        T=T+t;
 +
        x1=x2;
 +
        y1=y2;
 +
        x2=x3;
 +
        y2=y3;
  
 +
    }
  
int k;
 
cin>>k;
 
return 0;
 
 
}
 
}
  
</syntaxhighlight>
 
</div>
 
  
Скачать можно  [http://tm.spbstu.ru/Файл:Verle.rar  тут].
+
int main()
 +
{
  
<div>
+
setlocale(LC_ALL, "rus");
 +
cout<<"Введите скорость тела и угол"<<endl;
 +
cin>>v>>a;
  
'''[[Ляжков Сергей]]'''
+
while (1>0){
 +
cout<<"Выберите режим работы программы:"<<endl;
 +
cout<<"1 - Координаты, рассчитанные по формуле, при движении без сопротивления воздуха"<<endl;
 +
cout<<"2 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости"<<endl;
 +
cout<<"3- Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости"<<endl;
 +
cout<<"4 - Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости"<<endl;
 +
cout<<"5 - Выйти";
 +
cin>>o;
  
'''Описание программы''': Программа рассчитывает координаты полета тела по х и у. Как и в программе шахмат и интерполяции, здесь представлено меню выбора функций. Вы вводите начальные координаты, начальную скорость и угол полета(например, мяча или снаряда)(Нет смысла вводить величину скорости света, так как парабола вряд ли получится).
+
if (o==1)
Затем Вы выбираете в меню "вариант" сопротивления воздуха, после чего вводите массу тела и коэффициент сопротивления среды(без сопротивления воздуха этим можно пренебречь). Программа выводит массив точек и сохраняет их в текстовый файл. Эти точки - координаты полета до тех пор, пока значения y не станет ОТРИЦАТЕЛЬНЫМИ...
+
    rez_1(v,a);
Это мой первый проект по моделированию, спасибо за предоставленную возможность попрактиковаться.
+
if (o==2)
Скачать можно [[http://mech.spbstu.ru/File:Полет.zip тут]]
+
    {
 +
    cout<<"Введите массу тела и коэф сопротивления воздуха:"<<endl;
 +
    cin>>m>>k;
 +
    rez_2(v,a,k,m);
 +
    }
 +
 
 +
if (o==3)
 +
    {
 +
    cout<<"Введите массу тела и коэф сопротивления воздуха:"<<endl;
 +
    cin>>m>>k;
 +
    rez_3(v,a,k,m);
 +
    }
 +
  if (o==4)
 +
    {
 +
    cout<<"Введите массу тела и коэф сопротивления воздуха:"<<endl;
 +
    cin>>m>>k;
 +
    rez_4(v,a,k,m);
 +
    }
 +
  if (o==5)
 +
        break;
 +
 
 +
            }
 +
}
 +
 
 +
 
 +
</syntaxhighlight>
 
</div>
 
</div>
  
<br>'''[[Нарядчиков Александр]]'''<br>
+
 
'''Инструкция:''' Пользователю достаточно просто запустить программу.<br>
 
'''Описание программы:''' В комнате скачут 4 мячика, первый двигается без сопротивления воздуха, второй двигается с квадратичной зависимостью сопротивления воздуха от скорости (Метод Верле), третий двигается с линейной зависимостью сопротивления воздуха от скорости (точное решение), четвертый двигается с линейной зависимостью сопротивления воздуха от скорости (Метод Верле).<br>
 
'''Описание алгоритма:''' Программа реализована с помощью системы анимации(class anim), используя библиотеки OpenGl и GLUT. Изменения координат мячей проходят в режиме реального времени в векторной форме.<br>
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
"'''T06BALL.CPP'''"
+
'''[[Тимошенко Валентина]]'''  
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: T06BALL.CPP
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include "ANIM.H"
+
'''Описание программы''': при запуске пользователь вводит шаг функции, угол, под которым бросают тело, массу тела, сопротивление воздуха и скорость.
#include "SAMPLE.H"
+
Программа записывает в четыре файла результаты вычисления:
 +
#Координаты, рассчитанные по формуле для движения без сопротивления воздуха;
 +
#Координаты, рассчитанные по формуле для движения с учетом сопротивления воздуха;
 +
#Координаты, полученные методом Верле при квадратичной зависимости силы сопротивления воздуха от скорости.
 +
#Координаты, полученные методом Верле при линейной зависимости силы сопротивления воздуха от скорости;
  
/* Main function */
+
Скачать можно  [http://tm.spbstu.ru/Файл:motion.zip тут.]
void main( void )
 
{
 
// Получение единственного экземпляра класса анимации
 
sagl::anim &My = sagl::anim::Get();
 
 
 
// Шар, летящий без сопротивлением воздуха
 
        for (int i = 0; i < 1; i++)
 
                My << new ball(Pi / 6, 10 + i);
 
  
// Шар, летящий с сопротивлением воздуха
+
<div class="mw-collapsible-content">
// Координаты получены методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости
 
for (int i = 0; i < 1; i++)
 
My << new ball_air(Pi / 6, 10 + i, 10, 0.01);
 
  
// Шар, летящий с сопротивлением воздуха
+
'''Визуализированный результат работы программы'''
// Координаты получены из точного решения при линейной зависимости силы сопротивлении воздуха от скорости
+
[[File:Grafics.png]]
for (int i = 0; i < 1; i++)
 
My << new ball_air_2(Pi / 6, 10 + i, 10, 0.01);
 
  
// Шар, летящий с сопротивлением воздуха
+
Графики приведены для движения тела массой 1, со скоростью 50, под углом 45 градусов. Сопротивление воздуха принято равным 0.0001, шаг 0,1.
// Координаты получены методом Верле при линейной зависимости силы сопротивлении воздуха от скорости
 
for (int i = 0; i < 1; i++)
 
My << new ball_air_3(Pi / 6, 10 + i, 10, 0.01);
 
  
// Запуск главного цикла
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
  My.Run();
 
} // End of 'main' function
 
  
// END OF 'T43ANIM.CPP' FILE
+
#include <iostream> ///программа, подсчитывающая и записывающая в файл координаты движения тела для двух вариантов метода Верле
</syntaxhighlight>
+
#include <fstream> /// и для движений с учётом сопротивления и без его учёта
"'''ANIM.CPP'''"
+
#include <math.h>
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
#include<stdlib.h>
/* FILENAME: ANIM.CPP
+
using namespace std;
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include <stdio.h>
+
int main()
#include <stdlib.h>
+
{
#include <time.h>
+
    double a, step, Pi, g, Vo, m, r;
 +
    ///а - угол, под которым движется тело, step - шаг функции, Vo - начальная скорость тела, m - масса тела, r - величина сопротивления
  
#include "ANIM.H"
+
    double x, y, x_0, y_0, x0, y0, Vx, Vy;
 +
    ///переменные для движения точки без учёта сопротивления и с его учётом
 +
    ///х - изменяющаяся пошагово координата тела по оси Ох, у - изменяющаяся пошагово координата тела по оси Оу,
 +
    ///х0 - начальная координата тела по оси Ох, у0 - начальная координата тела по оси Оу
 +
    ///Vx - скорость тела по оси Ох, Vу - скорость тела по оси Оу
 +
    ///x_0 - изменяющаяся пошагово координата тела по оси Ох с учётом сопротивления, у_0 - изменяющаяся пошагово координата тела по оси Оу с учётом сопротивления
  
// Единственный экземпляр класса
+
    double Vy0, Vx0, x1, x2, x3, y1, y2, y3, Vxn, Vyn, Vn;
sagl::anim sagl::anim::Instance;
+
    ///переменные для 1го варианта метода Верле
 +
    ///х1 - координата тела по оси Ох на (n-1) шаге, х2 - координата тела по оси Ох на (n) шаге, х3 - координата тела по оси Ох на (n+1) шаге
 +
    ///у1 - координата тела по оси Оу на (n-1) шаге, у2 - координата тела по оси Оу на (n) шаге, у3 - координата тела по оси Оу на (n+1) шаге
 +
    ///Vx0 - начальная скорость тела по оси Ох, Vy0 - начальная скорость тела по оси Оу
 +
    ///Vxn - скорость тела в данный момент времени по оси Ох, Vyn - скорость тела в данный момент времени по оси Оу
  
/* Reshape function */
+
    double Vxn2, Vyn2, x_1, x_2, x_3, y_1, y_2, y_3;
// Стандартная функция, вызываемая при изменении размеров окна
+
    ///переменные для 2го варианта метода Верле
void sagl::anim::Reshape( int W, int H )
+
    ///х_1 - координата тела по оси Ох на (n-1) шаге, х_2 - координата тела по оси Ох на (n) шаге, х_3 - координата тела по оси Ох на (n+1) шаге
{
+
    ///у_1 - координата тела по оси Оу на (n-1) шаге, у_2 - координата тела по оси Оу на (n) шаге, у_3 - координата тела по оси Оу на (n+1) шаге
  // Установка области просмотра - все окно
+
     ///Vxn2 - скорость тела в данный момент времени по оси Ох, Vyn2 - скорость тела в данный момент времени по оси Оу
glViewport(0, 0, W, H);
+
 
  Instance.WinW = W;
+
    g=10; ///значение ускорения свободного падения
  Instance.WinH = H;
+
    Pi=3.14159265; /// значение числа П, используем для перевода радиан в градусы
  double ratio_x = 1, ratio_y = 1;
 
  if (W > H)
 
    ratio_x = (double)W / H;
 
  else
 
     ratio_y = (double)H / W;
 
  double Size = 1, Near = 1, Far = 500;
 
  // Установка системы координат "камеры"
 
glMatrixMode(GL_PROJECTION);
 
  glLoadIdentity();
 
  glFrustum(-Size * ratio_x, Size * ratio_x,
 
            -Size * ratio_y, Size * ratio_y,
 
            Near, Far);
 
// Установка "мировой" СК в состояние без преобразований
 
  glMatrixMode(GL_MODELVIEW);
 
} // End of 'Reshape' function
 
  
/* Timer function */
+
    do ///цикл, запрашивающий ввод пользователем значения шага функции
// Подсчет времени
+
    {
void sagl::anim::Timer( void )
+
        cout << "Input the step, it must be less than 1" << endl; ///ввод с клавиатуры шага(то же самое, что дельта t), шаг должен быть маленьким (меньше 1)
{
+
        cin >> step; ///вывод величины шага на экран
  long Time = clock();
+
    }
 
+
     while (step>=1); ///выход из цикла не будет обеспечен, пока пользователь не введет число, меньшее 1
  if (IsPause)
 
    DeltaTime = 0, PauseTime += Time - OldTime;
 
  else
 
     DeltaTime = (Time - OldTime) / (double)CLOCKS_PER_SEC;
 
  OldTime = Time;
 
  
  SyncTime = (Time - PauseTime - StartTime) / (double)CLOCKS_PER_SEC;
+
    cout << '\n' << "Input the corner in degrees,the corner is in the range from 0 to 90 degrees" << endl; ///ввод с клавиатуры угла в радианах (угол от 0 до 90 градусов)
} /* End of 'Timer' function */
+
    cin >> a; ///вывод значение угла на экран
 +
    a=(Pi*a)/180.0;
 +
    cout << '\n' << "Input the weight" << endl; ///ввод с клавиатуры значения массы
 +
    cin >> m; ///вывод величины массы на экран
  
/* Display function */
+
    do ///цикл, запрашивающий ввод пользователем значения сопротивления воздуха
// Стандартная функция, вызываемая при перерисовке окна
+
    {
void sagl::anim::Display( void )
+
        cout << '\n' << "Input the value of the resistance, it must be less than 1" << endl; ///ввод с клавиатуры величины сопротивления
{
+
        cin >> r; ///вывод значения сопротивления на экран
// Запуск времени
+
    }
Instance.Timer();
+
    while (r>=1); ///выход из цикла не будет обеспечен, пока пользователь не введет число, меньшее 1
// Очищаем цветовой буфер для создания нового изображения
 
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
  
  glLoadIdentity();
+
    cout << '\n' << "Input the speed" << endl; ///ввод с клавиатуры значения начальной скорости
  // Позиционирование СК
+
    cin >> Vo; ///вывод значения скорости на экран
gluLookAt(-40, 0, 0, 0, 0, 0, 0, 1, 0);
 
  
// Отрисовка объектов
+
    ///для движения без учёта сопротивления
  Instance.Render();
+
    x0=0; ///обнуление переменных
 +
    y0=0;
 +
    x=0;
 +
    y=0;
 +
 
 +
    ///для движения с учётом сопротивления
 +
    x_0=0; ///обнуление переменных
 +
    y_0=0;
  
  glFinish();
+
    ///для 1го варианта метода Верле
// Копируем вторичный буфер в окно
 
glutSwapBuffers();
 
// Вызываем функцию обновления кадра
 
glutPostRedisplay();
 
} // End of 'Display' function
 
  
/* Keyboard function */
+
    Vx0=Vo*cos(a); ///расчет проекции начальной скорости по оси Ох
// Стандартная функция, вызываемая при нажатие клавиш на клавиатуре
+
     Vy0=Vo*sin(a); ///расчет проекции начальной скорости по оси Оу
void sagl::anim::Keyboard( unsigned char Key, int X, int Y )
 
{
 
// Выход из программы
 
if (Key == 27)
 
     exit(0);
 
// Открытие программы в полном экране
 
else if (Key == 'f')
 
    glutFullScreen();
 
  // Пауза
 
else if (Key == 'p' || Key == 'P')
 
    Instance.IsPause = !Instance.IsPause;
 
} // End of 'Keyboard' function
 
  
sagl::anim::anim( void ) : IsPause(false), SyncTime(0), DeltaTime(0),
+
    x2=0; ///обнуление переменных
  StartTime(clock()), OldTime(StartTime), PauseTime(0), StockSize(0)
+
    y2=0;
{
+
    x3=0;
// Инициализации OpenGL и GLUT
+
    y3=0;
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
 
 
 
// Задача размеров и позиции окна
 
glutInitWindowPosition(0, 0);
 
  glutInitWindowSize(700, 700);
 
// Создание окна
 
glutCreateWindow("T06BALL");
 
  
// Установка функций 'обратного вызова'
+
    y1=y2-Vy0*step; ///расчет начального значения координаты по оси Оу
  glutDisplayFunc(Display);
+
    x1=x2-Vx0*step; ///расчет начального значения координаты по оси Ох
  glutKeyboardFunc(Keyboard);
 
  glutReshapeFunc(Reshape);
 
  
// Установка цвета закраски фона
+
    ///для 2го варианта метода Верле
  glClearColor(0.3, 0.5, 0.7, 1);
 
  // Включение буфера глубины
 
glEnable(GL_DEPTH_TEST);
 
  // Включение режима вычисления цвета согласно освещенности от источников света
 
glEnable(GL_LIGHTING);
 
// Включение источника света
 
  glEnable(GL_LIGHT0);
 
// Включение упрощенного режима освещенности для простого способа описания свойств поверхности
 
  glEnable(GL_COLOR_MATERIAL);
 
// Приведение нормалей к единичной длине
 
  glEnable(GL_NORMALIZE);
 
}
 
  
// Деструктор
+
    x_2=0; ///обнуление переменных
sagl::anim::~anim( void )
+
    y_2=0;
{
+
    x_3=0;
  // Чистка памяти
+
     y_3=0;
for (int i = 0; i < StockSize; i++)
 
     delete Stock[i];
 
}
 
  
/* Render function */
+
    Vxn2=Vo*cos(a); ///расчет скорости тела на начальный момент времени по оси Ох
// Отрисовка объектов
+
    Vyn2=Vo*sin(a); ///расчет скорости тела на начальный момент времени по оси Оу
void sagl::anim::Render( void )
 
{
 
for (int i = 0; i < StockSize; i++)
 
Stock[i]->Render(*this);
 
} // End of 'Render' function
 
  
/* Run function */
+
    y_1=y_2-Vo*sin(a)*step; ///расчет начального значения координаты на (п-1) шаге по оси Оу
// Запуск главного цикла
+
    x_1=-Vo*cos(a)*step;   ///расчет начального значения координаты на (п-1) шаге по оси Ох
void sagl::anim::Run( void )
 
{
 
// Запуск основного цикла построения
 
glutMainLoop();
 
} // End of 'Run' function
 
  
// END OF 'ANIM.CPP' FILE
+
    ofstream out("For method without resistance.txt");
</syntaxhighlight>
+
    ///запись в файл значений координат по осям Ох и Оу для движения без сопротивления
"'''ANIM.H'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: ANIM.H
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#ifndef __ANIM_H_
+
    for (int i=0; y>=0; ++i) ///цикл для подсчета координат при движении тела без учёта сопротивления
#define __ANIM_H_
+
    {
 +
        x=Vo*step*i*cos(a); ///расчет координаты тела по оси х
 +
        y=Vo*sin(a)*i*step-(g*i*step*i*step)*0.5; ///расчет координаты тела по оси y
 +
 
 +
        out << x << "    " << y <<'\n';  ///вывод всех значений координат по оси х и по оси у при движении тела без учёта сопротивления
 +
    }
 +
    out.close();
  
#include <stdio.h>
+
    ofstream out1 ("For method with resistance.txt");
#include <stdlib.h>
+
    ///запись в файл значений координат по осям Ох и Оу для движения с учётом сопротивления
#include <time.h>
 
  
#include <GL\glut.h>
+
    for (int i=0; y_0>=0; ++i) ///цикл для подсчета координат при движении тела с учётом сопротивления
 +
    {
 +
        Vx=Vo*cos(a); ///расчет скорости тела по оси Ох
 +
        Vy=Vo*sin(a); ///расчет скорости тела по оси Оу
 +
        x_0=x0+(m/r)*Vx*(1.0 - exp((-r*i*step)/m)); ///расчет координаты тела по оси х
 +
        y_0=y0+(m/r)*(Vy+g*(m/r))*(1.0 - exp((-r*i*step)/m))-g*i*step*(m/r); ///расчет координаты тела по оси y
  
#include "VEC.H"
+
        out1 << x_0 << "   " << y_0 <<'\n';  ///вывод всех значений координат по оси х и по оси у при движении c учётом сопротивления
 +
    }
 +
    out1.close();
  
// Константы
+
    ofstream out2 ("For method Verle 1.txt");
#define Pi 3.14159265358979323846
+
    ///запись в файл значений координат по осям Ох и Оу для 1го варианта метода Верле
#define E 2.71828182845904523536
 
  
// Собственное пространство имен 'sagl'
+
    for (int i=0; y3>=0; ++i) ///цикл для подсчета координат и скорости по времени для 1го варианта метода Верле
namespace sagl
+
    {
{
+
        x3=2*x2-x1-(r/m)*Vn*Vxn*step*step; ///расчет координаты в данный момент времени по оси Ох
  // Объявления класса анимации наперед
+
        y3=2*y2-y1-(g+(r/m)*Vn*Vyn)*step*step; ///расчет координаты в данный момент времени по оси Оу
class anim;
+
        Vxn=(x3-x1)/(2.0*step); ///расчет скорости в данный момент времени по оси Оу
 
+
        Vyn=(y3-y1)/(2.0*step); /// расчет скорости в данный момент времени по оси Ох
// Функции получения случайных чисел
+
        Vn=sqrt(Vxn*Vxn+Vyn*Vyn); ///расчет скорости тела по модулю
inline double r0( void )
+
 
  {
+
        x1=x2; ///присваивание значению координаты х1 на (n-1) шаге значение координаты х2 на n шаге
    return rand() / (double)RAND_MAX;
+
        x2=x3; ///присваивание значению координаты х2 на (n) шаге значение координаты х3 на (n+1) шаге
  }
+
        y1=y2; ///присваивание значению координаты у1 на (n-1) шаге значение координаты у2 на n шаге
  inline double r1( void )
+
        y2=y3; ///присваивание значению координаты у2 на (n) шаге значение координаты у3 на (n+1) шаге
  {
+
 
    return 2.0 * rand() / RAND_MAX - 1;
+
        out2 << x3 << "  " << y3 <<'\n'; ///вывод всех значений координат по оси Ох и по оси Оу на экран для 1го варианта метода Верле
  }
 
 
 
// Класс объектов
 
class object
 
  {
 
  public:
 
    // Вектора перемещения и скоростей
 
vec P, V, AbsV;
 
   
 
// Конструктор
 
object( void ) : P(vec::Rnd1()), V(vec::Rnd()), AbsV(V)
 
    {
 
 
     }
 
     }
+
    out2.close();
// Отрисовка объектов
+
 
virtual void Render( anim &Ani )
+
    ofstream out3 ("For method Verle 2.txt");
 +
    ///запись в файл значений координат по осям Ох и Оу для 2го варианта метода Верле
 +
 
 +
    for (int i=0; y_3>=0; ++i) ///цикл для подсчета координат и скорости по времени для 2го варианта метода Верле
 
     {
 
     {
    } // End of 'Render' function
+
        x_3=2*x_2-x_1-(r/m)*Vxn2*step*step; ///расчет координаты в данный момент времени по оси Ох
  }; // end of 'object' class
+
        y_3=2*y_2-y_1-(g+(r/m)*Vyn2)*step*step; ///расчет координаты в данный момент времени по оси Оу
 
+
        Vxn2=(x_3-x_1)/(2.0*step); ///расчет скорости в данный момент времени по оси Оу
// Класс анимации
+
        Vyn2=(y_3-y_1)/(2.0*step); ///расчет скорости в данный момент времени по оси Ох
class anim
+
 
  {
+
        x_1=x_2; ///присваивание значению координаты х_1 на (n-1) шаге значение координаты х_2 на n шаге
  private:
+
        x_2=x_3; ///присваивание значению координаты х_2 на (n) шаге значение координаты х_3 на (n+1) шаге
    // Функции 'обратного вызова'
+
        y_1=y_2; ///присваивание значению координаты у_1 на (n-1) шаге значение координаты у_2 на n шаге
static void Display( void );
+
        y_2=y_3; ///присваивание значению координаты у_2 на (n-1) шаге значение координаты у_3 на (n+1) шаге
    static void Keyboard( unsigned char Key, int X, int Y );
+
 
    static void Reshape( int W, int H );
+
        out3 << x_3 << "  " << y_3 <<'\n'; ///вывод на экран всех значений координат по оси Ох и по оси Оу для 2го варианта метода Верле
  
     // Единственный экземпляр класса
+
     }
static anim Instance;
+
     out3.close();
   
 
     // Конструктор
 
anim( void );
 
  
// Максимальное количество объектов
+
     cout << '\n' << "All results are saved in files." << endl; ///вывод на экран сообщения о записи в файл всех результатов
     static const int Max = 100;
+
     cout << '\n' << "The program is finished." << endl; ///вывод на экран сообщения о завершении работы программы
    // 'Контейнер' объектов
+
    return 0;
object *Stock[Max];
+
}
    // Размер 'контейнера' объектов
+
</syntaxhighlight>
int StockSize;
+
</div>
   
 
// Переменные, хранящие время в секундах
 
     long StartTime, OldTime, PauseTime;
 
   
 
// Отрисовка объектов
 
void Render( void );
 
 
// Подсчет времени
 
void Timer( void );
 
  public:
 
    // Добавление объектов в 'контейнер'
 
anim & operator<<( object *Obj )
 
    {
 
      if (StockSize < Max )
 
        Stock[StockSize++] = Obj;
 
      else
 
        delete Obj;
 
     
 
return *this;
 
    }
 
   
 
// Ширина и высота окна
 
    int WinW, WinH;
 
  
// Переменные, хранящие время в секундах
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    double SyncTime, DeltaTime;
+
'''[[Савельева Ольга]]'''
  
    // Переменная, отвечающая за паузу
+
'''Описание:''' Пользователя попросят ввести начальную скорость, угол бросания, тогда программа запишет в файл результаты следующих вычислений:
bool IsPause;
+
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 +
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
  
    // Деструктор
+
<div class="mw-collapsible-content">
~anim( void );
 
   
 
// Запуск главного цикла
 
void Run( void );
 
   
 
    // Метод, возвращающий переменную - единственный экземпляр данного типа
 
static anim & Get( void )
 
    {
 
      return Instance;
 
    }
 
  }; // end of 'anim' class
 
} // end of 'sagl' namespace
 
 
 
#endif /*__ANIM_H_ */
 
  
// END OF 'ANIM.H' FILE
 
</syntaxhighlight>
 
"'''VEC.H'''"
 
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
/* FILENAME: VEC.H
+
#include <stdio.h>
* LAST UPDATE: 17.01.2016
+
#include <stdlib.h>
*/
+
#include <cmath>
  
#ifndef __VEC_H_
+
using namespace std;
#define __VEC_H_
 
  
#include <stdlib.h>
+
FILE *output;
#include <math.h>
 
  
// Собственное пространство имен 'sagl'
+
double e = 0.0000001; //точность
namespace sagl
+
double g = 9.8; //ускорение свободного падения
 +
double dt = 0.00001;  //шаг по времени
 +
double windageLinearCoefficient = 0.1;
 +
double windageSquareCoefficient = 0.00001;
 +
 
 +
struct Vector  //вектор
 
{
 
{
  // Класс векторов
+
     double x, y;
class vec
+
     Vector():x(0), y(0)
  {
+
    {}
  public:
+
    Vector(double x, double y):x(x), y(y)
     // Координаты вектора
+
    {}
double X, Y, Z;
+
    const Vector operator+(const Vector &v) const
      
 
// Конструктор
 
vec( void ) : X(0), Y(0), Z(0)
 
 
     {
 
     {
 +
        return Vector(this -> x + v.x, this -> y + v.y);
 
     }
 
     }
      
+
     const Vector operator-(const Vector &v) const
// Конструктор
 
vec( double A, double B, double C ) : X(A), Y(B), Z(C)
 
 
     {
 
     {
 +
        return Vector(this -> x - v.x, this -> y - v.y);
 
     }
 
     }
      
+
     const Vector operator*(const double k) const
// Функции получения случайных чисел
 
static double R0( void )
 
 
     {
 
     {
      return rand() / (double)RAND_MAX;
+
        return Vector(this -> x * k, this -> y * k);
 
     }
 
     }
      
+
     const Vector operator*(const int k) const
static double R1( void )
 
 
     {
 
     {
      return 2 * rand() / (double)RAND_MAX - 1;
+
        return Vector(this -> x * k, this -> y * k);
 
     }
 
     }
      
+
     const Vector operator/(const double k) const
// Функции получения случайных векторов
 
static vec Rnd( void )
 
 
     {
 
     {
      return vec(R0(), R0(), R0());
+
        return Vector(this -> x / k, this -> y / k);
 
     }
 
     }
   
+
};
static vec Rnd1( void )
+
 
    {
+
const Vector operator*(const double a, const Vector &v)
      return vec(R1(), R1(), R1());
+
{
    }
+
    return Vector(v.x * a, v.y * a);
+
}
vec operator+( vec V )
+
 
{
+
const Vector operator*(const int k, const Vector &v)
return vec(X + V.X, Y + V.Y, Z + V.Z);
+
{
}
+
    return Vector(v.x * k, v.y * k);
+
}
vec operator*( double t )
+
 
    {
+
double abs(const Vector &v)
      return vec(X * t, Y * t, Z * t);
+
{
    }
+
     return sqrt(v.x * v.x + v.y * v.y);
   
+
}
vec & operator+=( const vec &V )
 
    {
 
      X += V.X;
 
      Y += V.Y;
 
      Z += V.Z;
 
     
 
return *this;
 
     }
 
 
// Длина вектора
 
double operator!(void) const
 
{
 
return sqrt(X * X + Y * Y + Z * Z);
 
} /* end of 'operator!' function */
 
  }; // end of 'vec' class
 
} // end of 'sagl' namespace
 
  
#endif /*__VEC_H_ */
+
void printCoordinate(const char *description, const Vector &v)  //выводит координаты в более читаемом виде
 +
{
 +
    fputs(description, output);
 +
    fputs(": ", output);
 +
    fprintf(output, "%lf", v.x);
 +
    fputs(", ", output);
 +
    fprintf(output, "%lf\n", v.y);
 +
}
  
// END OF 'VEC.H' FILE
+
Vector getCoordinatesWithoutWindage(double velocity, double angle, double time = -1)
</syntaxhighlight>
+
{
"'''SAMPLE.H'''"
+
    double fallTime = 2 * velocity * sin(angle) / g;  //расчет времени падения
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
    if((time < 0) or (time > fallTime))
/* FILENAME: SAMPLE.H
+
        time = fallTime;
  * LAST UPDATE: 17.01.2016
+
    double x = velocity * cos(angle) * time;    // x = vx*t;
*/
+
    double y = velocity * sin(angle) * time - g * time * time / 2; // y = vy*t-(g*t^2)/2;
 +
    return Vector(x, y);
 +
}
  
#ifndef __SAMPLE_H_
+
Vector getCoordinatesVerletLinear(double velocity, double angle, double time = -1)
#define __SAMPLE_H_
 
 
 
#include <math.h>
 
 
 
#include "ANIM.H"
 
 
 
// Шар, летящий без сопротивлением воздуха
 
class ball : public sagl::object
 
 
{
 
{
private:
+
    double nowTime = dt;
  double angle, v; // угол вектора скорости к горизонту; модуль скорости
+
    Vector rsb(0, 0);
public:
+
    if((time >= 0) and (dt / 2 - time > 0)) //если время расчета дается слишком малого промежутка
  // Конструктор
+
        return rsb; //вернитесь в начальную точку
ball( void ) : angle(Pi / 3), v(1)
+
    Vector v(velocity * cos(angle), velocity * sin(angle)); //проекции начальной скорости
  {
+
    Vector r = v * dt;    //вторая точка
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
    Vector a = -windageLinearCoefficient * v; //ускорение в начальной точке
V.X = 0;
+
    a.y -= g;
V.Y = sin(angle) * v;
+
    v = v + a * dt; //скорость во второй точке
V.Z = cos(angle) * v;
+
    a = -windageLinearCoefficient * v; //ускорение во второй точке
  }
+
    a.y -= g;
+
    while((r.y > 0) or ((time > 0) and (nowTime <= time)))  //пока точка выше 0 или не достигла заданного времени
// Конструктор
+
    {
ball( double angle1, double v1 ) : angle(angle1), v(v1)
+
        Vector rn = 2 * r - rsb + a * dt * dt;  // r(t+dt) = 2*r(t)-r(t-dt)+a(t)*dt^2;
{
+
        v = (rn - rsb) / (2 * dt);  // v(t) = (r(t+dt)-r(t-dt))/(2*dt);
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
        rsb = r;    //обновление r(t-dt) and r(t)
V.X = 0;
+
        r = rn;
V.Y = sin(angle) * v;
+
        a = -windageLinearCoefficient * v;  //обновление a(t)
V.Z = cos(angle) * v;
+
        a.y -= g;
}
+
        nowTime += dt; //обновленное время
 
+
    }
// Отрисовка объекта
+
    return r;
void Render( sagl::anim &Ani )
+
}
  {
 
// Вектор ускорения свободного падения
 
sagl::vec g = sagl::vec(0, -9.8, 0);
 
// Размер комнаты
 
double Size = 120;
 
  
// Изменение вектора скорости
+
Vector calculateForTime(Vector &v, double time)
V += g * Ani.DeltaTime;
+
{
// Изменение вектора перемещения
+
    Vector r;
P += V * Ani.DeltaTime;
+
    // x = vx/k*(1-e^(-k*t));
 +
    r.x = v.x / windageLinearCoefficient * (1 - exp(-windageLinearCoefficient * time));
 +
    // y = ((vy+g/k)*(1-e^(-k*t))-g*t)/k;
 +
    r.y = ((v.y + g / windageLinearCoefficient) * (1 - exp(-windageLinearCoefficient * time)) - g * time) / windageLinearCoefficient;
 +
    return r;
 +
}
  
// Ограничения - стенки
+
Vector getCoordinatesAccurateLinear(double velocity, double angle, double time = -1)
if (P.X > Size / 4)
+
{
V.X = -fabs(V.X);
+
    if(windageLinearCoefficient < e)  //если коэффициент слишком близок к нулю
if (P.X < -Size / 4)
+
        return getCoordinatesWithoutWindage(velocity, angle, time);   //вычисляй будто это 0
V.X = fabs(V.X);
+
    Vector r;
 
+
    Vector v(velocity * cos(angle), velocity * sin(angle)); //проекции начальной скорости
if (P.Y > Size / 4)
+
    if(time >= 0)  //время данное
V.Y = -fabs(V.Y);
+
    {
if (P.Y < -Size / 4)
+
        r = calculateForTime(v, time);
      V.Y = fabs(V.Y);
+
        if(r.y >= 0)    //если объект в воздухе или только приземлился
 
+
            return r;   //затем верните координаты объекта
if (P.Z > Size / 4)
+
        else    //еще
V.Z = -fabs(V.Z);
+
            return getCoordinatesAccurateLinear(velocity, angle);   //верните координаты приземления
if (P.Z < -Size / 4)
+
    }
V.Z = fabs(V.Z);
+
    else
+
     {
     // Запоминание состояния изменения текущей СК
+
        double timer, timel, timem;
glPushMatrix();
+
        timer = v.y / g;
+
        timel = 0;
// Рисование стенок
+
        while(calculateForTime(v, timer).y > 0) //смотрим на некоторые значения времени, которые больше времени посадки
glutWireCube(Size / 2);
+
            timer *= 1.5;
// Задача перемещения мяча
+
        timem = timel + (timer - timel) / 2;
glTranslated(P.X, P.Y, P.Z);
+
        r = calculateForTime(v, timem);
    // Цвет мяча
+
        while(abs(r.y) > e)    //бинарный поиск времени посадки
glColor3d(0, 1, 0);
+
        {
// Рисование мяча
+
            if(r.y > 0)
glutSolidSphere(0.5, 30, 30);
+
                timel = timem;
   
+
            else
// Восстановление последнего запоминания состояния изменения текущей СК
+
                timer = timem;
glPopMatrix();
+
            timem = timel + (timer - timel) / 2;
  }
+
            r = calculateForTime(v, timem);
}; // end of 'ball' class
+
        }
 +
        return r;
 +
    }
 +
}
  
// Шар, летящий с сопротивлением воздуха
+
Vector getCoordinatesVerletSquare(double velocity, double angle, double time = -1)
// Координаты получены методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости
 
class ball_air : public sagl::object
 
 
{
 
{
private:
+
    double nowTime = dt;
double angle, v, m, n;
+
    Vector rsb(0, 0);
public:
+
    if((dt / 2 - time > 0)and(time >= 0))  //если время слишком малое для рсчета
// Конструктор
+
        return rsb; //вернитесь в начальную точку
ball_air( void ) : angle(Pi / 3), v(1), m(1), n(0.1)
+
    Vector v(velocity * cos(angle), velocity * sin(angle)); //проекции начальной скорости
{
+
    Vector r = v * dt;  //вторая точка
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
    Vector a = -abs(v) * v * windageSquareCoefficient;  //ускорение в начальной точке
V.X = 0;
+
    a.y -= g;
V.Y = sin(angle) * v;
+
    v = v + a * dt; //скорость во второй точке
V.Z = cos(angle) * v;
+
    a = -abs(v) * v * windageSquareCoefficient; //ускорение во второй точке
}
+
    a.y -= g;
+
    while((r.y > 0) or ((time > 0) and (nowTime <= time))) //когда точка выше нулевой отметки и не достигает заданного времени
// Конструктор
+
    {
ball_air( double angle1, double v1, double m1, double n1 ) : angle(angle1), v(v1), m(m1), n(n1)
+
        Vector rn = 2 * r - rsb + a * dt * dt;  // r(t+dt) = 2*r(t)-r(t-dt)+a(t)*dt^2;
{
+
        v = (rn - rsb) / (2 * dt);  // v(t) = (r(t+dt)-r(t-dt))/(2*dt);
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
        rsb = r;    //updating r(t-dt) and r(t)
V.X = 0;
+
        r = rn;
V.Y = sin(angle) * v;
+
        a = -abs(v) * v * windageSquareCoefficient; //новое a(t)
V.Z = cos(angle) * v;
+
        a.y -= g;
}
+
        nowTime += dt;  //новое a(t)
+
    }
// Отрисовка объекта
+
    return r;
void Render( sagl::anim &Ani )
+
}
{
+
 
// Вектор ускорения свободного падения и вектор полного ускорения
+
void err(const char *s) //печатает сообщение об ошибке и завершает работу
sagl::vec g = sagl::vec(0, -9.8, 0), a;
+
{
// Размер комнаты
+
    fputs(s, output);
double Size = 120;
+
    exit(1);
 +
}
 +
 
 +
int main(int argc, const char *argv[])
 +
{
 +
    double velocity, angle;
 +
    bool needRead = true;
 +
    if(argc==3) //если даны 2 аргумента
 +
    {
 +
        velocity = atof(argv[1]);  //истолкование его как скорости и угла
 +
        angle = atof(argv[2]);
 +
        needRead = false;
 +
    }
 +
    if(needRead)
 +
    {
 +
        puts("Enter initial velocity (m/s)");
 +
        scanf("%lf", &velocity);
 +
    }
 +
    if(velocity < 0)    //проверка, если скорость меньше 0
 +
        err("Initial velocity must be above 0");
 +
    if(needRead)
 +
    {
 +
        puts("Enter initial angle (0-180 degrees)");
 +
        scanf("%lf", &angle);
 +
    }
 +
    if((angle < 0) or (angle > 180))    //проверка, что угол в нужном интервале
 +
        err("Initial angle must be from 0 to 180");
 +
    angle = angle / 180 * M_PI; // a = a/180*pi; преобразование угла из градусов в радианы
 +
    output = fopen("Coordinates.txt", "w"); //открытие результативного файла
 +
    //вычисление и печать 4 значений
 +
    printCoordinate("Without windage", getCoordinatesWithoutWindage(velocity, angle));
 +
    printCoordinate("Verlet, linear dependence", getCoordinatesVerletLinear(velocity, angle));
 +
    printCoordinate("Accurate, linear dependence", getCoordinatesAccurateLinear(velocity, angle));
 +
    printCoordinate("Verlet, square dependence", getCoordinatesVerletSquare(velocity, angle));
 +
    fclose(output); //закрытие файла
 +
    return 0;
 +
}
 +
</syntaxhighlight>
 +
</div>
 +
Скачать можно [http://tm.spbstu.ru/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9A%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82%D1%8B.zip здесь]
  
// Изменение вектора ускорения
 
a = sagl::vec(0, g.Y - n / m * !V * V.Y, -n / m * !V * V.Z);
 
  
// Изменение вектора скорости
 
V += a * Ani.DeltaTime;
 
// Изменение вектора перемещения
 
P += V * Ani.DeltaTime;
 
 
// Ограничения - стенки
 
if (P.X > Size / 4)
 
V.X = -fabs(V.X);
 
if (P.X < -Size / 4)
 
V.X = fabs(V.X);
 
  
if (P.Y > Size / 4)
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
V.Y = -fabs(V.Y);
+
'''[[Рубинова Раиса]]'''
if (P.Y < -Size / 4)
+
 
V.Y = fabs(V.Y);
+
'''Описание программы''': программа состоит из четырех независимых друг от друга частей:
 +
#  Полет тела без сопротивления воздуха;
 +
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются точным методом;
 +
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
 +
#  Полет тела при квадратичной зависимости силы сопротивлении воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
  
if (P.Z > Size / 4)
+
Скачать можно [http://tm.spbstu.ru/File:Полет.rar тут].
V.Z = -fabs(V.Z);
 
if (P.Z < -Size / 4)
 
V.Z = fabs(V.Z);
 
 
// Запоминание состояния изменения текущей СК
 
glPushMatrix();
 
 
// Рисование стенок
 
glutWireCube(Size / 2);
 
// Задача перемещения мяча
 
glTranslated(P.X, P.Y, P.Z);
 
// Цвет мяча
 
glColor3d(1, 0, 0);
 
// Рисование мяча
 
glutSolidSphere(0.5, 30, 30);
 
 
// Восстановление последнего запоминания состояния изменения текущей СК
 
glPopMatrix();
 
}
 
}; // end of 'ball_air' class
 
  
// Шар, летящий с сопротивлением воздуха
+
<div class="mw-collapsible-content">
// Координаты получены из точного решения при линейной зависимости силы сопротивлении воздуха от скорости
+
 
class ball_air_2 : public sagl::object
+
[[File:Обычный.png]]
 +
[[File:Точный.png]]
 +
[[File:Верле2.png]]
 +
[[File:Верле1.png]]
 +
 
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
// Первый случай
 +
 
 +
#include <iostream>
 +
#include <math.h>
 +
#include <cstdlib>
 +
#include <fstream>
 +
 
 +
/// Программа, анализирующая полет тела;
 +
 
 +
using namespace std;
 +
double a,s,H,p1,p2,X,f;    /// Создание переменных, необходимых для работы:
 +
                                                                                /// a - угол к горизонту, под которым летит тело, вводится пользователем;
 +
                                                                                /// s - начальная скорость, с которой тело начинает лететь, вводится пользователем;
 +
                                                                                /// H - координата тела по оси Oy;
 +
                                                                                /// p1, p2 - промежуточные переменные, предназначенные для расчетов;
 +
                                                                                /// X - координата тела по оси Oy;
 +
                                                                                /// f - шаг по времени;
 +
 
 +
int main()
 
{
 
{
private:
+
    cout << "Enter speed and angle and step of time" << endl;  /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту и шаг по времени;
double angle, v, m, n;
+
    cin >> s >> a >> f;    /// Считывание данных, введенных пользователем, в переменные;
public:
+
    double t=s*sin(a*3.14159/180.0)/9.8;        /// Создание новой переменной t, хранящей значение времени полета тела вверх (вычисленное через уравнение скорости по оси Oy);
// Конструктор
+
    for (double i=f; i<(2*t+f); i+=f)       /// Для вычисления координат тела в n-ом количестве точек мы создаем цикл, который повторяется то количество раз, сколько раз шаг по времени, введенным пользователем, вмещается во время полета всего тела;
ball_air_2( void ) : angle(Pi / 3), v(1), m(1), n(0.1)
+
    {
{
+
        p1=s*sin(a*3.14159/180)*i;      /// Вычисление первой компоненты координаты тела по оси Oy, представляемй как произведение скорости по этой оси на время (выражено из уравнения равноускоренного прямолинейного движения);
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
        p2=4.9*i*i;        /// Вычисление второй компоненты координаты тела по оси Oy, представляемой как произведение квадрата времени на половину укорения свободного падения (выражено из уравнения РУПД);
V.X = 0;
+
        H=double(p1)-p2;    /// Вычисление координаты тела по оси Oy;
V.Y = sin(angle) * v;
+
        X=s*cos(a*3.14159/180)*i;      /// Вычисление координаты тела по оси Ox как произведение скорости по оси Ox на время (выражено из уравнения равномерного движения);
V.Z = cos(angle) * v;
+
        cerr << X << " ";      /// Вывод на экран значения по оси Ox
}
+
        cerr << H << endl;      /// и по оси Oy;
+
    }
// Конструктор
+
    ofstream out("zap.txt");        /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
ball_air_2( double angle1, double v1, double m1, double n1 ) : angle(angle1), v(v1), m(m1), n(n1)
+
    for (double i=0; i<(2*t+f); i+=f)       /// Для вычисления координат тела в n-ом количестве точек мы создаем цикл, который повторяется то количество раз, сколько раз шаг по времени, введенным пользователем, вмещается во время полета всего тела;
{
+
    {
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
        p1=s*sin(a*3.14159/180)*i;      /// Вычисление первой компоненты координаты тела по оси Oy, представляемй как произведение скорости по этой оси на время (выражено из уравнения равноускоренного прямолинейного движения);
V.X = 0;
+
        p2=4.9*i*i;            /// Вычисление второй компоненты координаты тела по оси Oy, представляемой как произведение квадрата времени на половину укорения свободного падения (выражено из уравнения РУПД);
V.Y = sin(angle) * v;
+
        H=double(p1)-p2;        /// Вычисление координаты тела по оси Oy;
V.Z = cos(angle) * v;
+
        X=s*cos(a*3.14159/180)*i;       /// Вычисление координаты тела по оси Ox как произведение скорости по оси Ox на время (выражено из уравнения равномерного движения);
}
+
        out << X << " ";        /// Запись в файл значения по оси Ox
+
        out << H << endl;      /// и по оси Oy;
// Отрисовка объекта
+
    }
void Render( sagl::anim &Ani )
+
    out.close();        /// Закрываем файл, с которым работали в течение программы;
{
+
    return 0;          /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
// Вектор ускорения свободного падения и вектор полного ускорения
+
}
sagl::vec g = sagl::vec(0, -9.8, 0), a;
 
// Размер комнаты
 
double Size = 120;
 
  
// Изменение вектора скорости
+
// Второй случай
V.Z = V.Z * exp(-n / m * Ani.DeltaTime);
 
V.Y = (V.Y - g.Y * m / n) * exp(-n / m * Ani.DeltaTime) + g.Y * m / n;
 
// Изменение вектора перемещения
 
P += V * Ani.DeltaTime;
 
  
// Ограничения - стенки
+
#include <iostream>
if (P.X > Size / 4)
+
#include <math.h>
V.X = -fabs(V.X);
+
#include <cstdlib>
if (P.X < -Size / 4)
+
#include <fstream>
V.X = fabs(V.X);
 
  
if (P.Y > Size / 4)
+
/// Программа, позволяющая описать полет точки при помощи точного метода;
V.Y = -fabs(V.Y);
 
if (P.Y < -Size / 4)
 
V.Y = fabs(V.Y);
 
  
if (P.Z > Size / 4)
+
using namespace std;
V.Z = -fabs(V.Z);
+
double v,a,st,m;    /// Создание переменных, необходимых для работы:
if (P.Z < -Size / 4)
+
                        /// v - модуль скорости, который задает сам пользователь;
V.Z = fabs(V.Z);
+
                        /// a - угол относительно горизонта, под которым летит тело, задается пользователем;
 
+
                        /// st - шаг по времени, через который расчитываются координаты точек, задается пользователем;
// Запоминание состояния изменения текущей СК
+
                        /// m - масса тела, задается пользователем;
glPushMatrix();
+
double *V,*X, *Y, *U;  /// Создание массивов, хранящих значения типа double, в которых хранятся значения:
 +
                        /// V - массив, хранящий значения скорости по оси Ox;
 +
                        /// X - массив, хранящий координаты точки по оси Ox;
 +
                        /// Y - массив, хранящий значения скорости по оси Oy;
 +
                        /// U - массив, хранящий координаты точки по оси Oy;
  
// Рисование стенок
+
int main()
glutWireCube(Size / 2);
 
// Задача перемещения мяча
 
glTranslated(P.X, P.Y, P.Z);
 
// Цвет мяча
 
glColor3d(0, 1, 1);
 
// Рисование мяча
 
glutSolidSphere(0.5, 30, 30);
 
 
// Восстановление последнего запоминания состояния изменения текущей СК
 
glPopMatrix();
 
}
 
}; // end of 'ball_air_2' class
 
 
 
// Шар, летящий с сопротивлением воздуха
 
// Координаты получены методом Верле при линейной зависимости силы сопротивлении воздуха от скорости
 
class ball_air_3 : public sagl::object
 
 
{
 
{
private:
+
    cout << "Enter speed and angle and step of time and weight" << endl;        /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту, шаг по времени и массу тела;
double angle, v, m, n;
+
    cin >> v >> a >> st >> m;          /// Считывание данных, введенных пользователей в переменные;
public:
+
    double t=(v/9.8)*sin(3.14159*a/180.0);          /// Создание новой переменной t, хранящей значение времени всего полета тела, вычисленного, как два времени взлета (через уравнение скорости по оси Oy);
// Конструктор
+
    int n=2*t/st;      /// Создание новой целочисленной переменной, которая равна времени полета тела (преобразование типов для переменной t) деленного на шаг, которая будет использоваться при создании массивов для размера;
ball_air_3( void ) : angle(Pi / 3), v(1), m(1), n(0.1)
+
    //int p=1/st;
{
+
    V = new double [n+2];      /// Создание динамического массива V, предназначенного для хранения значений скорости по оси Ox, размером (n+2) (n показывает, сколько раз шаг по времени помещается во все время, то есть, сколько точек мы будем рассматривать, анализируя полет точки);
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
    X = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Ox и имеющего схожие характеристики с массивом V;
V.X = 0;
+
    Y = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Oy и имеющего схожие характеристики с массивом V;
V.Y = sin(angle) * v;
+
    U = new double [n+2];      /// Создание динамического массива U, предназначенного для хранения значений скорости тела по оси Oy и имеющего схожие характеристики с массивом V;
V.Z = cos(angle) * v;
+
    V[0]=v*cos(3.14159*a/180.0);        /// Вычисление значения скорости по оси Ox в начальный момент времени, как состовляющая модуля скорости, заданного пользователем;
}
+
    X[0]=0;        /// Задание координаты точки по оси Ox в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому x=0;
+
    U[0]=v*sin(3.14159*a/180.0);        /// Вычисление значения скорости по оси Oy в начальный момент времени, как компонента модуля скорости, заданного пользователем, по вертикальной оси;
// Конструктор
+
    Y[0]=0;        /// Задание координаты точки по оси Oy в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому y=0;
ball_air_3( double angle1, double v1, double m1, double n1 ) : angle(angle1), v(v1), m(m1), n(n1)
+
    ofstream out("Res.txt");       /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
{
+
    for (int i=1; i<n; ++i)        /// Для вычисления координат тела в пространстве в зависимости от времени мы создаем цикл, который позволяет, использая общую формулу нахождкения координат и компонент скорости, вычислять эти значения
P = sagl::vec(sagl::r0() + 5, 5, 0);
+
                                    /// Цикл повторяется (n-1) раз, так как значения в начальный момент времени были найдены отдельно от цикла, и повторяется столько раз, сколько точек траектории мы рассматриваем;
V.X = 0;
+
    {
V.Y = sin(angle) * v;
+
        Y[i]=(m/0.001)*(U[0]+9.8*(m/0.001))*(1-exp(((0-0.001)/m)*i*st))-9.8*(m/0.001)*i*st;        /// Вычисление координаты тела в момент времени (i*st) по оси Oy по формуле, выведенной через дифференциальное уравнение точки для вертикальной оси и находящей координату как функцию от времени и координаты тела в предыдущей рассматриваемой нами точке;
V.Z = cos(angle) * v;
+
        X[i]=V[0]*(m/0.001)*(1-exp(((0-0.001)/m)*i*st));         /// Аналогично вычисляем координаты тела в момент времени (i*st) по оси Ox как функцию от времени и координате в предыдущей рассматриваемой точке;
}
+
                                                                  /// В приведенных выше формулах зачение 0.001 - это коэффициент сопротивления воздуха;
+
                                                                  /// Движение по горизонтальной оси рассматривается как равномерное прямолинейное движение;
// Отрисовка объекта
+
                                                                  /// Движение по вертикальной оси рассматривается как равноускоренное прямолинейное движение;
void Render( sagl::anim &Ani )
+
        cerr << X[i] << " " << Y[i] << endl;        /// Выведение рассчитанных значений на экран в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
{
+
        out << X[i] << " " << Y[i] << endl;        /// Запись рассчитанных значений в файл "Res.txt" в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
// Вектор ускорения свободного падения и вектор полного ускорения
+
                                                    /// Таким образом, в результате работы программы мы получаем два столбика значений для координат по обеим осям, которые как записаны в файл, так и выведены на экран;
sagl::vec g = sagl::vec(0, -9.8, 0), a;
+
    }
// Размер комнаты
+
    out.close();        /// Закрываем файл, с которым работали в течение программы;
double Size = 120;
+
    return 0;          /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
  
// Изменение вектора ускорения
 
a = sagl::vec(0, g.Y - n / m * V.Y, -n / m * V.Z);
 
  
// Изменение вектора скорости
+
}
V += a * Ani.DeltaTime;
 
// Изменение вектора перемещения
 
P += V * Ani.DeltaTime;
 
  
// Ограничения - стенки
+
// Третий случай
if (P.X > Size / 4)
 
V.X = -fabs(V.X);
 
if (P.X < -Size / 4)
 
V.X = fabs(V.X);
 
  
if (P.Y > Size / 4)
+
#include <iostream>
V.Y = -fabs(V.Y);
+
#include <math.h>
if (P.Y < -Size / 4)
+
#include <cstdlib>
V.Y = fabs(V.Y);
+
#include <fstream>
  
if (P.Z > Size / 4)
+
/// Программа, анализирующая полет тела при помощи модифицированного метода Верле;
V.Z = -fabs(V.Z);
 
if (P.Z < -Size / 4)
 
V.Z = fabs(V.Z);
 
  
// Запоминание состояния изменения текущей СК
+
using namespace std;
glPushMatrix();
+
double v,a,st,m,x,y;    /// Создание переменных, необходимых для работы;
 +
                        /// v - модуль скорости, который задает сам пользователь;
 +
                        /// a - угол относительно горизонта, под которым летит тело, задается пользователем;
 +
                        /// st - шаг по времени, через который расчитываются координаты точек, задается пользователем;
 +
                        /// m - масса тела, задается пользователем;
 +
                        /// x - координата тела по оси Ox в мнимый момент времени t=-1;
 +
                        /// y - координата тела по оси Oy в мнимый момент времени t=-1;
 +
double *V,*X, *Y, *U;  /// Создание массивов, хранящих значения типа double, в которых хранятся значения:
 +
                        /// V - массив, хранящий значения скорости по оси Ox;
 +
                        /// X - массив, хранящий координаты точки по оси Ox;
 +
                        /// Y - массив, хранящий значения скорости по оси Oy;
 +
                        /// U - массив, хранящий координаты точки по оси Oy;
  
// Рисование стенок
+
int main()
glutWireCube(Size / 2);
+
{
// Задача перемещения мяча
+
    cout << "Enter speed and angle and step of time and weight" << endl;    /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту, шаг по времени и массу тела;
glTranslated(P.X, P.Y, P.Z);
+
    cin >> v >> a >> st >> m;      /// Считывание данных, введенных пользователей в переменные;
// Цвет мяча
+
    double t=(v/9.8)*sin(3.14159*a/180.0);      /// Создание новой переменной t, хранящей значение времени всего полета тела, вычисленного, как два времени взлета (через уравнение скорости по оси Oy);
glColor3d(1, 0.5, 0);
+
    int n=2*t/st;  /// Создание новой целочисленной переменной, которая равна времени полета тела (преобразование типов для переменной t) деленного на шаг, которая будет использоваться при создании массивов для размера;
// Рисование мяча
+
    //int p=1/st;
glutSolidSphere(0.5, 30, 30);
+
    V = new double [n+2];      /// Создание динамического массива V, предназначенного для хранения значений скорости по оси Ox, размером (n+2) (n показывает, сколько раз шаг по времени помещается во все время, то есть, сколько точек мы будем рассматривать, анализируя полет точки);
+
    X = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Ox и имеющего схожие характеристики с массивом V;
// Восстановление последнего запоминания состояния изменения текущей СК
+
    Y = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Oy и имеющего схожие характеристики с массивом V;
glPopMatrix();
+
    U = new double [n+2];      /// Создание динамического массива U, предназначенного для хранения значений скорости тела по оси Oy и имеющего схожие характеристики с массивом V;
}
+
    V[0]=v*cos(3.14159*a/180.0);    /// Вычисление значения скорости по оси Ox в начальный момент времени, как состовляющая модуля скорости, заданного пользователем;
}; // end of 'ball_air_3' class
+
    X[0]=0;    /// Задание координаты точки по оси Ox в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому x=0;
 +
    x=X[0]-V[0]*st;    /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Ox;
 +
    X[1]=2*X[0]-x-(0.01/m)*V[0]*st*st;  /// Вычисление координаты тела по оси Ox в момент времени t=1;
 +
    U[0]=v*sin(3.14159*a/180.0);    /// Вычисление значения скорости по оси Oy в начальный момент времени, как компонента модуля скорости, заданного пользователем, по вертикальной оси;
 +
    Y[0]=0;    /// Задание координаты точки по оси Oy в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому y=0;
 +
    y=Y[0]-U[0]*st;    /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Oу;
 +
    Y[1]=2*Y[0]-y-(0.01/m)*U[0]*st*st;      /// Вычисление координаты тела по оси Oу в момент времени t=1;
 +
    cerr << X[1] << " " << Y[1] << endl;    /// Вывод на экран значений координат по обеим осям в момент времени t=1;
 +
    ofstream out("Res.txt");        /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
 +
    out << X[1] << " " << Y[1] << endl;    /// Записываем в файл полученные значения координат тела в момент времени t=1;
 +
    int k=1;        /// Создаем целочисленную переменную k=1 для работы в цикле;
 +
    //cerr<<"N "<<n<<"\n";
 +
    for (int i=0; i<n; ++i)     /// Для вычисления координат тела в пространстве в зависимости от времени мы создаем цикл, который позволяет, использая общую формулу нахождкения координат и компонент скорости, вычислять эти значения
 +
                                /// Цикл повторяется (n-1) раз, так как значения в начальный момент времени были найдены отдельно от цикла, и повторяется столько раз, сколько точек траектории мы рассматриваем;
 +
    {
 +
        X[k+1]=2.0*X[k]-X[k-1]-(0.001/m)*V[k]*st*st;    /// Нахождение координаты тела по оси Ox в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
 +
        V[k]=(X[k+1]-X[k-1])/(2*st);        /// Нахождение значения скорости тела по оси Ox в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
 +
        Y[k+1]=2.0*Y[k]-Y[k-1]-(9.8+(0.001/m)*U[k])*st*st;      /// Нахождение координаты тела по оси Oy в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
 +
        U[k]=(Y[k+1]-Y[k-1])/(2*st);        /// Нахождение значения скорости тела по оси Oy в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
 +
        //cerr <<i<<" "<<k<<" "<<
 +
        cerr << X[k+1] << " " << Y[k+1] << endl;    /// Выведение рассчитанных значений на экран в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 +
        out << X[k+1] << " " << Y[k+1] << endl;    /// Запись рассчитанных значений в файл "Res.txt" в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 +
        k=k+1;      /// Увеличиваем число k на единицу, чтобы в следующем шаге цикла рассчитать значения для следующего момента времени;
 +
                    /// Таким образом, в результате работы программы мы получаем два столбика значений для координат по обеим осям, которые как записаны в файл, так и выведены на экран;
 +
    }
 +
    out.close();    /// Закрываем файл, с которым работали в течение программы;
 +
    return 0;       /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
 +
}
  
#endif /*__SAMPLE_H_ */
+
// Четвертый случай
  
// END OF 'SAMPLE.H' FILE
+
#include <iostream>
</syntaxhighlight>
+
#include <math.h>
</div>
+
#include <cstdlib>
[http://tm.spbstu.ru/File:T06BALL.7z Скачать архив]
+
#include <fstream>
<br>
 
  
'''[[Рубинова Раиса]]'''
+
/// Программа, анализирующая полет тела при помощи метода Верле;
  
'''Описание программы''': программа состоит из четырех независимых друг от друга частей:
+
using namespace std;
#  Полет тела без сопротивления воздуха;  
+
double v,a,st,m,x,y;        /// Создание переменных, необходимых для работы:
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются точным методом;
+
                            /// v - модуль скорости, который задает сам пользователь;
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
+
                            /// a - угол относительно горизонта, под которым летит тело, задается пользователем;
#  Полет тела при квадратичной зависимости силы сопротивлении воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
+
                            /// st - шаг по времени, через который расчитываются координаты точек, задается пользователем;
 +
                            /// m - масса тела, задается пользователем;
 +
                            /// x - координата тела по оси Ox в мнимый момент времени t=-1;
 +
                            /// y - координата тела по оси Oy в мнимый момент времени t=-1;
 +
double *V,*X, *Y, *U;      /// Создание массивов, хранящих значения типа double, в которых хранятся значения:
 +
                            /// V - массив, хранящий значения скорости по оси Ox;
 +
                            /// X - массив, хранящий координаты точки по оси Ox;
 +
                            /// Y - массив, хранящий значения скорости по оси Oy;
 +
                            /// U - массив, хранящий координаты точки по оси Oy;
  
Скачать можно [http://tm.spbstu.ru/File:Полет.rar тут].
+
int main()
 
+
{
<div class="mw-collapsible-content">
+
    cout << "Enter speed and angle and step of time and weight" << endl;        /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту, шаг по времени и массу тела;
 
+
    cin >> v >> a >> st >> m;      /// Считывание данных, введенных пользователем, в переменные;
[[File:Обычный.png]]
+
    double t=(v/9.8)*sin(3.14159*a/180.0);      /// Создание новой переменной t, хранящей значение времени всего полета тела, вычисленного, как два времени взлета (через уравнение скорости по оси Oy);
[[File:Точный.png]]
+
    int n=2*t/st;          /// Создание новой целочисленной переменной, которая равна времени полета тела (преобразование типов для переменной t) деленного на шаг, которая будет использоваться при создании массивов для размера;
[[File:Верле2.png]]
+
    //int p=1/st;
[[File:Верле1.png]]
+
    V = new double [n+2];  /// Создание динамического массива V, предназначенного для хранения значений скорости по оси Ox, размером (n+2) (n показывает, сколько раз шаг по времени помещается во все время, то есть, сколько точек мы будем рассматривать, анализируя полет точки);
 
+
    X = new double [n+2];  /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Ox и имеющего схожие характеристики с массивом V;
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
    Y = new double [n+2];   /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Oy и имеющего схожие характеристики с массивом V;
// Первый случай
+
    U = new double [n+2];  /// Создание динамического массива U, предназначенного для хранения значений скорости тела по оси Oy и имеющего схожие характеристики с массивом V;
 
+
    V[0]=v*cos(3.14159*a/180.0);        /// Вычисление значения скорости по оси Ox в начальный момент времени, как состовляющая модуля скорости, заданного пользователем;
#include <iostream>
+
    X[0]=0;                /// Задание координаты точки по оси Ox в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому x=0;
#include <math.h>
+
    x=X[0]-V[0]*st;        /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Ox;
#include <cstdlib>
+
    X[1]=2*X[0]-x-(0.01/m)*V[0]*V[0]/cos(3.14159*a/180.0)*st*st;    /// Вычисление координаты тела по оси Ox в момент времени t=1;
#include <fstream>
+
    U[0]=v*sin(3.14159*a/180.0);    /// Вычисление значения скорости по оси Oy в начальный момент времени, как компонента модуля скорости, заданного пользователем, по вертикальной оси;
 
+
     Y[0]=0;                 /// Задание координаты точки по оси Oy в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому y=0;
/// Программа, анализирующая полет тела;
+
     y=Y[0]-U[0]*st;         /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Oу;
 
+
     Y[1]=2*Y[0]-y-(0.01/m)*U[0]*U[0]/sin(3.14159*a/180.0)*st*st;    /// Вычисление координаты тела по оси Oу в момент времени t=1;
using namespace std;
+
    cerr << X[1] << " " << Y[1] << endl;    /// Вывод на экран значений координат по обеим осям в момент времени t=1;
double a,s,H,p1,p2,X,f;   /// Создание переменных, необходимых для работы:
+
    ofstream out("Res.txt");        /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
                                                                                /// a - угол к горизонту, под которым летит тело, вводится пользователем;
+
    out << X[1] << " " << Y[1] << endl;        /// Записываем в файл полученные значения координат тела в момент времени t=1;
                                                                                /// s - начальная скорость, с которой тело начинает лететь, вводится пользователем;
+
    int k=1;            /// Создаем целочисленную переменную k=1 для работы в цикле;
                                                                                /// H - координата тела по оси Oy;
+
    //cerr<<"N "<<n<<"\n";
                                                                                /// p1, p2 - промежуточные переменные, предназначенные для расчетов;
+
     for (int i=0; i<n; ++i)         /// Для вычисления координат тела в пространстве в зависимости от времени мы создаем цикл, который позволяет, использая общую формулу нахождкения координат и компонент скорости, вычислять эти значения
                                                                                /// X - координата тела по оси Oy;
+
                                    /// Цикл повторяется (n-1) раз, так как значения в начальный момент времени были найдены отдельно от цикла, и повторяется столько раз, сколько точек траектории мы рассматриваем;
                                                                                /// f - шаг по времени;
 
 
 
int main()
 
{
 
     cout << "Enter speed and angle and step of time" << endl;   /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту и шаг по времени;
 
     cin >> s >> a >> f;     /// Считывание данных, введенных пользователем, в переменные;
 
     double t=s*sin(a*3.14159/180.0)/9.8;        /// Создание новой переменной t, хранящей значение времени полета тела вверх (вычисленное через уравнение скорости по оси Oy);
 
     for (double i=f; i<(2*t+f); i+=f)       /// Для вычисления координат тела в n-ом количестве точек мы создаем цикл, который повторяется то количество раз, сколько раз шаг по времени, введенным пользователем, вмещается во время полета всего тела;
 
 
     {
 
     {
         p1=s*sin(a*3.14159/180)*i;     /// Вычисление первой компоненты координаты тела по оси Oy, представляемй как произведение скорости по этой оси на время (выражено из уравнения равноускоренного прямолинейного движения);
+
         X[k+1]=2.0*X[k]-X[k-1]-(0.001/m)*V[k]*V[k]*st*st;       /// Нахождение координаты тела по оси Ox в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
         p2=4.9*i*i;         /// Вычисление второй компоненты координаты тела по оси Oy, представляемой как произведение квадрата времени на половину укорения свободного падения (выражено из уравнения РУПД);
+
         V[k]=(X[k+1]-X[k-1])/(2*st);       /// Нахождение значения скорости тела по оси Ox в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
         H=double(p1)-p2;   /// Вычисление координаты тела по оси Oy;
+
         Y[k+1]=2.0*Y[k]-Y[k-1]-(9.8+(0.001/m)*U[k]*U[k])*st*st;     /// Нахождение координаты тела по оси Oy в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
         X=s*cos(a*3.14159/180)*i;       /// Вычисление координаты тела по оси Ox как произведение скорости по оси Ox на время (выражено из уравнения равномерного движения);
+
         U[k]=(Y[k+1]-Y[k-1])/(2*st);   /// Нахождение значения скорости тела по оси Oy в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
         cerr << X << " ";       /// Вывод на экран значения по оси Ox
+
        //cerr <<i<<" "<<k<<" "<<
         cerr << H << endl;     /// и по оси Oy;
+
         cerr << X[k+1] << " " << Y[k+1] << endl;   /// Выведение рассчитанных значений на экран в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 +
         out << X[k+1] << " " << Y[k+1] << endl;     /// Запись рассчитанных значений в файл "Res.txt" в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 +
        k=k+1;      /// Увеличиваем число k на единицу, чтобы в следующем шаге цикла рассчитать значения для следующего момента времени;
 +
                                                    /// Таким образом, в результате работы программы мы получаем два столбика значений для координат по обеим осям, которые как записаны в файл, так и выведены на экран;
 
     }
 
     }
    ofstream out("zap.txt");        /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
+
     out.close();   /// Закрываем файл, с которым работали в течение программы;
    for (double i=0; i<(2*t+f); i+=f)        /// Для вычисления координат тела в n-ом количестве точек мы создаем цикл, который повторяется то количество раз, сколько раз шаг по времени, введенным пользователем, вмещается во время полета всего тела;
+
     return 0;       /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
    {
 
        p1=s*sin(a*3.14159/180)*i;      /// Вычисление первой компоненты координаты тела по оси Oy, представляемй как произведение скорости по этой оси на время (выражено из уравнения равноускоренного прямолинейного движения);
 
        p2=4.9*i*i;            /// Вычисление второй компоненты координаты тела по оси Oy, представляемой как произведение квадрата времени на половину укорения свободного падения (выражено из уравнения РУПД);
 
        H=double(p1)-p2;        /// Вычисление координаты тела по оси Oy;
 
        X=s*cos(a*3.14159/180)*i;      /// Вычисление координаты тела по оси Ox как произведение скорости по оси Ox на время (выражено из уравнения равномерного движения);
 
        out << X << " ";        /// Запись в файл значения по оси Ox
 
        out << H << endl;      /// и по оси Oy;
 
    }
 
     out.close();       /// Закрываем файл, с которым работали в течение программы;
 
     return 0;           /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
 
 
}
 
}
  
// Второй случай
+
</syntaxhighlight>
 +
</div>
 +
 
 +
 
 +
'''[[Козловская Анна]]'''
  
#include <iostream>
 
#include <math.h>
 
#include <cstdlib>
 
#include <fstream>
 
  
/// Программа, позволяющая описать полет точки при помощи точного метода;
+
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
 +
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
using namespace std;
+
Скачать можно  [http://tm.spbstu.ru/File:project2.rar тут].
double v,a,st,m;    /// Создание переменных, необходимых для работы:
 
                        /// v - модуль скорости, который задает сам пользователь;
 
                        /// a - угол относительно горизонта, под которым летит тело, задается пользователем;
 
                        /// st - шаг по времени, через который расчитываются координаты точек, задается пользователем;
 
                        /// m - масса тела, задается пользователем;
 
double *V,*X, *Y, *U;  /// Создание массивов, хранящих значения типа double, в которых хранятся значения:
 
                        /// V - массив, хранящий значения скорости по оси Ox;
 
                        /// X - массив, хранящий координаты точки по оси Ox;
 
                        /// Y - массив, хранящий значения скорости по оси Oy;
 
                        /// U - массив, хранящий координаты точки по оси Oy;
 
  
int main()
+
<br>'''[[Нарядчиков Александр]]'''<br>
{
+
'''Инструкция:''' Пользователю достаточно просто запустить программу.<br>
    cout << "Enter speed and angle and step of time and weight" << endl;        /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту, шаг по времени и массу тела;
+
'''Описание программы:''' В комнате скачут 4 мячика, первый двигается без сопротивления воздуха, второй двигается с квадратичной зависимостью сопротивления воздуха от скорости (Метод Верле), третий двигается с линейной зависимостью сопротивления воздуха от скорости (точное решение), четвертый двигается с линейной зависимостью сопротивления воздуха от скорости (Метод Верле).<br>
    cin >> v >> a >> st >> m;          /// Считывание данных, введенных пользователей в переменные;
+
'''Описание алгоритма:''' Программа реализована с помощью системы анимации(class anim), используя библиотеки OpenGl и GLUT. Изменения координат мячей проходят в режиме реального времени в векторной форме.<br>
    double t=(v/9.8)*sin(3.14159*a/180.0);          /// Создание новой переменной t, хранящей значение времени всего полета тела, вычисленного, как два времени взлета (через уравнение скорости по оси Oy);
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    int n=2*t/st;      /// Создание новой целочисленной переменной, которая равна времени полета тела (преобразование типов для переменной t) деленного на шаг, которая будет использоваться при создании массивов для размера;
+
"'''T06BALL.CPP'''"
    //int p=1/st;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    V = new double [n+2];      /// Создание динамического массива V, предназначенного для хранения значений скорости по оси Ox, размером (n+2) (n показывает, сколько раз шаг по времени помещается во все время, то есть, сколько точек мы будем рассматривать, анализируя полет точки);
+
/* FILENAME: T06BALL.CPP
    X = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Ox и имеющего схожие характеристики с массивом V;
+
* LAST UPDATE: 17.01.2016
    Y = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Oy и имеющего схожие характеристики с массивом V;
+
*/
    U = new double [n+2];      /// Создание динамического массива U, предназначенного для хранения значений скорости тела по оси Oy и имеющего схожие характеристики с массивом V;
 
    V[0]=v*cos(3.14159*a/180.0);        /// Вычисление значения скорости по оси Ox в начальный момент времени, как состовляющая модуля скорости, заданного пользователем;
 
    X[0]=0;        /// Задание координаты точки по оси Ox в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому x=0;
 
    U[0]=v*sin(3.14159*a/180.0);        /// Вычисление значения скорости по оси Oy в начальный момент времени, как компонента модуля скорости, заданного пользователем, по вертикальной оси;
 
    Y[0]=0;        /// Задание координаты точки по оси Oy в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому y=0;
 
    ofstream out("Res.txt");        /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
 
    for (int i=1; i<n; ++i)        /// Для вычисления координат тела в пространстве в зависимости от времени мы создаем цикл, который позволяет, использая общую формулу нахождкения координат и компонент скорости, вычислять эти значения
 
                                    /// Цикл повторяется (n-1) раз, так как значения в начальный момент времени были найдены отдельно от цикла, и повторяется столько раз, сколько точек траектории мы рассматриваем;
 
    {
 
        Y[i]=(m/0.001)*(U[0]+9.8*(m/0.001))*(1-exp(((0-0.001)/m)*i*st))-9.8*(m/0.001)*i*st;        /// Вычисление координаты тела в момент времени (i*st) по оси Oy по формуле, выведенной через дифференциальное уравнение точки для вертикальной оси и находящей координату как функцию от времени и координаты тела в предыдущей рассматриваемой нами точке;
 
        X[i]=V[0]*(m/0.001)*(1-exp(((0-0.001)/m)*i*st));          /// Аналогично вычисляем координаты тела в момент времени (i*st) по оси Ox как функцию от времени и координате в предыдущей рассматриваемой точке;
 
                                                                  /// В приведенных выше формулах зачение 0.001 - это коэффициент сопротивления воздуха;
 
                                                                  /// Движение по горизонтальной оси рассматривается как равномерное прямолинейное движение;
 
                                                                  /// Движение по вертикальной оси рассматривается как равноускоренное прямолинейное движение;
 
        cerr << X[i] << " " << Y[i] << endl;        /// Выведение рассчитанных значений на экран в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 
        out << X[i] << " " << Y[i] << endl;        /// Запись рассчитанных значений в файл "Res.txt" в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 
                                                    /// Таким образом, в результате работы программы мы получаем два столбика значений для координат по обеим осям, которые как записаны в файл, так и выведены на экран;
 
    }
 
    out.close();        /// Закрываем файл, с которым работали в течение программы;
 
    return 0;          /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
 
  
 +
#include "ANIM.H"
 +
#include "SAMPLE.H"
  
}
+
/* Main function */
 
+
void main( void )
// Третий случай
+
{
 
+
// Получение единственного экземпляра класса анимации
#include <iostream>
+
sagl::anim &My = sagl::anim::Get();
#include <math.h>
+
 
#include <cstdlib>
+
// Шар, летящий без сопротивлением воздуха
#include <fstream>
+
        for (int i = 0; i < 1; i++)
 +
                My << new ball(Pi / 6, 10 + i);
  
/// Программа, анализирующая полет тела при помощи модифицированного метода Верле;
+
// Шар, летящий с сопротивлением воздуха
 +
// Координаты получены методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости
 +
for (int i = 0; i < 1; i++)
 +
My << new ball_air(Pi / 6, 10 + i, 10, 0.01);
  
using namespace std;
+
// Шар, летящий с сопротивлением воздуха
double v,a,st,m,x,y;    /// Создание переменных, необходимых для работы;
+
// Координаты получены из точного решения при линейной зависимости силы сопротивлении воздуха от скорости
                        /// v - модуль скорости, который задает сам пользователь;
+
for (int i = 0; i < 1; i++)
                        /// a - угол относительно горизонта, под которым летит тело, задается пользователем;
+
My << new ball_air_2(Pi / 6, 10 + i, 10, 0.01);
                        /// st - шаг по времени, через который расчитываются координаты точек, задается пользователем;
 
                        /// m - масса тела, задается пользователем;
 
                        /// x - координата тела по оси Ox в мнимый момент времени t=-1;
 
                        /// y - координата тела по оси Oy в мнимый момент времени t=-1;
 
double *V,*X, *Y, *U;  /// Создание массивов, хранящих значения типа double, в которых хранятся значения:
 
                        /// V - массив, хранящий значения скорости по оси Ox;
 
                        /// X - массив, хранящий координаты точки по оси Ox;
 
                        /// Y - массив, хранящий значения скорости по оси Oy;
 
                        /// U - массив, хранящий координаты точки по оси Oy;
 
  
int main()
+
// Шар, летящий с сопротивлением воздуха
{
+
// Координаты получены методом Верле при линейной зависимости силы сопротивлении воздуха от скорости
    cout << "Enter speed and angle and step of time and weight" << endl;    /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту, шаг по времени и массу тела;
+
for (int i = 0; i < 1; i++)
    cin >> v >> a >> st >> m;      /// Считывание данных, введенных пользователей в переменные;
+
My << new ball_air_3(Pi / 6, 10 + i, 10, 0.01);
    double t=(v/9.8)*sin(3.14159*a/180.0);      /// Создание новой переменной t, хранящей значение времени всего полета тела, вычисленного, как два времени взлета (через уравнение скорости по оси Oy);
+
 
    int n=2*t/st;   /// Создание новой целочисленной переменной, которая равна времени полета тела (преобразование типов для переменной t) деленного на шаг, которая будет использоваться при создании массивов для размера;
+
// Запуск главного цикла
    //int p=1/st;
+
  My.Run();
    V = new double [n+2];      /// Создание динамического массива V, предназначенного для хранения значений скорости по оси Ox, размером (n+2) (n показывает, сколько раз шаг по времени помещается во все время, то есть, сколько точек мы будем рассматривать, анализируя полет точки);
+
} // End of 'main' function
    X = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Ox и имеющего схожие характеристики с массивом V;
+
 
    Y = new double [n+2];      /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Oy и имеющего схожие характеристики с массивом V;
+
// END OF 'T43ANIM.CPP' FILE
    U = new double [n+2];      /// Создание динамического массива U, предназначенного для хранения значений скорости тела по оси Oy и имеющего схожие характеристики с массивом V;
+
</syntaxhighlight>
    V[0]=v*cos(3.14159*a/180.0);   /// Вычисление значения скорости по оси Ox в начальный момент времени, как состовляющая модуля скорости, заданного пользователем;
+
"'''ANIM.CPP'''"
    X[0]=0;    /// Задание координаты точки по оси Ox в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому x=0;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    x=X[0]-V[0]*st;    /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Ox;
+
/* FILENAME: ANIM.CPP
    X[1]=2*X[0]-x-(0.01/m)*V[0]*st*st;  /// Вычисление координаты тела по оси Ox в момент времени t=1;
+
* LAST UPDATE: 17.01.2016
    U[0]=v*sin(3.14159*a/180.0);    /// Вычисление значения скорости по оси Oy в начальный момент времени, как компонента модуля скорости, заданного пользователем, по вертикальной оси;
+
*/
    Y[0]=0;    /// Задание координаты точки по оси Oy в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому y=0;
+
 
    y=Y[0]-U[0]*st;    /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Oу;
+
#include <stdio.h>
    Y[1]=2*Y[0]-y-(0.01/m)*U[0]*st*st;      /// Вычисление координаты тела по оси Oу в момент времени t=1;
+
#include <stdlib.h>
    cerr << X[1] << " " << Y[1] << endl;    /// Вывод на экран значений координат по обеим осям в момент времени t=1;
+
#include <time.h>
    ofstream out("Res.txt");        /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
+
 
    out << X[1] << " " << Y[1] << endl;    /// Записываем в файл полученные значения координат тела в момент времени t=1;
+
#include "ANIM.H"
    int k=1;        /// Создаем целочисленную переменную k=1 для работы в цикле;
 
    //cerr<<"N "<<n<<"\n";
 
    for (int i=0; i<n; ++i)    /// Для вычисления координат тела в пространстве в зависимости от времени мы создаем цикл, который позволяет, использая общую формулу нахождкения координат и компонент скорости, вычислять эти значения
 
                                /// Цикл повторяется (n-1) раз, так как значения в начальный момент времени были найдены отдельно от цикла, и повторяется столько раз, сколько точек траектории мы рассматриваем;
 
    {
 
        X[k+1]=2.0*X[k]-X[k-1]-(0.001/m)*V[k]*st*st;    /// Нахождение координаты тела по оси Ox в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
 
        V[k]=(X[k+1]-X[k-1])/(2*st);        /// Нахождение значения скорости тела по оси Ox в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
 
        Y[k+1]=2.0*Y[k]-Y[k-1]-(9.8+(0.001/m)*U[k])*st*st;      /// Нахождение координаты тела по оси Oy в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
 
        U[k]=(Y[k+1]-Y[k-1])/(2*st);        /// Нахождение значения скорости тела по оси Oy в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
 
        //cerr <<i<<" "<<k<<" "<<
 
        cerr << X[k+1] << " " << Y[k+1] << endl;    /// Выведение рассчитанных значений на экран в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 
        out << X[k+1] << " " << Y[k+1] << endl;    /// Запись рассчитанных значений в файл "Res.txt" в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 
        k=k+1;      /// Увеличиваем число k на единицу, чтобы в следующем шаге цикла рассчитать значения для следующего момента времени;
 
                    /// Таким образом, в результате работы программы мы получаем два столбика значений для координат по обеим осям, которые как записаны в файл, так и выведены на экран;
 
    }
 
    out.close();    /// Закрываем файл, с которым работали в течение программы;
 
    return 0;      /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
 
}
 
  
// Четвертый случай
+
// Единственный экземпляр класса
 +
sagl::anim sagl::anim::Instance;
  
#include <iostream>
+
/* Reshape function */
#include <math.h>
+
// Стандартная функция, вызываемая при изменении размеров окна
#include <cstdlib>
+
void sagl::anim::Reshape( int W, int H )
#include <fstream>
+
{
 
+
  // Установка области просмотра - все окно
/// Программа, анализирующая полет тела при помощи метода Верле;
+
glViewport(0, 0, W, H);
 
+
  Instance.WinW = W;
using namespace std;
+
  Instance.WinH = H;
double v,a,st,m,x,y;       /// Создание переменных, необходимых для работы:
+
  double ratio_x = 1, ratio_y = 1;
                            /// v - модуль скорости, который задает сам пользователь;
+
  if (W > H)
                            /// a - угол относительно горизонта, под которым летит тело, задается пользователем;
+
    ratio_x = (double)W / H;
                            /// st - шаг по времени, через который расчитываются координаты точек, задается пользователем;
+
  else
                            /// m - масса тела, задается пользователем;
+
    ratio_y = (double)H / W;
                            /// x - координата тела по оси Ox в мнимый момент времени t=-1;
+
  double Size = 1, Near = 1, Far = 500;
                            /// y - координата тела по оси Oy в мнимый момент времени t=-1;
+
  // Установка системы координат "камеры"
double *V,*X, *Y, *U;      /// Создание массивов, хранящих значения типа double, в которых хранятся значения:
+
glMatrixMode(GL_PROJECTION);
                            /// V - массив, хранящий значения скорости по оси Ox;
+
  glLoadIdentity();
                            /// X - массив, хранящий координаты точки по оси Ox;
+
  glFrustum(-Size * ratio_x, Size * ratio_x,
                            /// Y - массив, хранящий значения скорости по оси Oy;
+
            -Size * ratio_y, Size * ratio_y,
                            /// U - массив, хранящий координаты точки по оси Oy;
+
            Near, Far);
 +
// Установка "мировой" СК в состояние без преобразований
 +
  glMatrixMode(GL_MODELVIEW);
 +
} // End of 'Reshape' function
  
int main()
+
/* Timer function */
 +
// Подсчет времени
 +
void sagl::anim::Timer( void )
 
{
 
{
    cout << "Enter speed and angle and step of time and weight" << endl;        /// Обращение к пользователю, где требуется ввести скорость тела, угол к горизонту, шаг по времени и массу тела;
+
  long Time = clock();
    cin >> v >> a >> st >> m;      /// Считывание данных, введенных пользователем, в переменные;
+
 
    double t=(v/9.8)*sin(3.14159*a/180.0);      /// Создание новой переменной t, хранящей значение времени всего полета тела, вычисленного, как два времени взлета (через уравнение скорости по оси Oy);
+
   if (IsPause)
    int n=2*t/st;          /// Создание новой целочисленной переменной, которая равна времени полета тела (преобразование типов для переменной t) деленного на шаг, которая будет использоваться при создании массивов для размера;
+
     DeltaTime = 0, PauseTime += Time - OldTime;
    //int p=1/st;
+
   else
    V = new double [n+2];   /// Создание динамического массива V, предназначенного для хранения значений скорости по оси Ox, размером (n+2) (n показывает, сколько раз шаг по времени помещается во все время, то есть, сколько точек мы будем рассматривать, анализируя полет точки);
+
     DeltaTime = (Time - OldTime) / (double)CLOCKS_PER_SEC;  
     X = new double [n+2];  /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Ox и имеющего схожие характеристики с массивом V;
+
  OldTime = Time;
    Y = new double [n+2];  /// Создание динамического массива X, предназначенного для хранения координаты тела по оси Oy и имеющего схожие характеристики с массивом V;
+
 
    U = new double [n+2];   /// Создание динамического массива U, предназначенного для хранения значений скорости тела по оси Oy и имеющего схожие характеристики с массивом V;
+
  SyncTime = (Time - PauseTime - StartTime) / (double)CLOCKS_PER_SEC;
     V[0]=v*cos(3.14159*a/180.0);        /// Вычисление значения скорости по оси Ox в начальный момент времени, как состовляющая модуля скорости, заданного пользователем;
+
} /* End of 'Timer' function */
    X[0]=0;                /// Задание координаты точки по оси Ox в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому x=0;
+
 
    x=X[0]-V[0]*st;        /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Ox;
+
/* Display function */
    X[1]=2*X[0]-x-(0.01/m)*V[0]*V[0]/cos(3.14159*a/180.0)*st*st;   /// Вычисление координаты тела по оси Ox в момент времени t=1;
+
// Стандартная функция, вызываемая при перерисовке окна
    U[0]=v*sin(3.14159*a/180.0);    /// Вычисление значения скорости по оси Oy в начальный момент времени, как компонента модуля скорости, заданного пользователем, по вертикальной оси;
+
void sagl::anim::Display( void )
    Y[0]=0;                /// Задание координаты точки по оси Oy в начальный момент времени. Мы рассматриваем движение тела под углом к горизонту из начала координат, поэтому y=0;
+
{
    y=Y[0]-U[0]*st;        /// Суть данного метода заключается в том, что мы находим значение параметров тела по предыдущим двум состояниям, поэтому нам нужно вычислить мнимые координаты тела в -1 момент времени. Это расчет коордлинаты по оси Oу;
+
// Запуск времени
    Y[1]=2*Y[0]-y-(0.01/m)*U[0]*U[0]/sin(3.14159*a/180.0)*st*st;    /// Вычисление координаты тела по оси Oу в момент времени t=1;
+
Instance.Timer();
    cerr << X[1] << " " << Y[1] << endl;    /// Вывод на экран значений координат по обеим осям в момент времени t=1;
+
// Очищаем цветовой буфер для создания нового изображения
    ofstream out("Res.txt");        /// Так как результаты анализа не только выводятся на экран, но и записываются в файл, мы создаем переменную, соответствующую файлу "Res.txt", находящемуся в папке с программой, и открываем файл для записи;
+
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    out << X[1] << " " << Y[1] << endl;        /// Записываем в файл полученные значения координат тела в момент времени t=1;
+
 
    int k=1;            /// Создаем целочисленную переменную k=1 для работы в цикле;
+
  glLoadIdentity();
    //cerr<<"N "<<n<<"\n";
+
  // Позиционирование СК
    for (int i=0; i<n; ++i)        /// Для вычисления координат тела в пространстве в зависимости от времени мы создаем цикл, который позволяет, использая общую формулу нахождкения координат и компонент скорости, вычислять эти значения
+
gluLookAt(-40, 0, 0, 0, 0, 0, 0, 1, 0);
                                    /// Цикл повторяется (n-1) раз, так как значения в начальный момент времени были найдены отдельно от цикла, и повторяется столько раз, сколько точек траектории мы рассматриваем;
 
    {
 
        X[k+1]=2.0*X[k]-X[k-1]-(0.001/m)*V[k]*V[k]*st*st;       /// Нахождение координаты тела по оси Ox в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
 
        V[k]=(X[k+1]-X[k-1])/(2*st);        /// Нахождение значения скорости тела по оси Ox в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
 
        Y[k+1]=2.0*Y[k]-Y[k-1]-(9.8+(0.001/m)*U[k]*U[k])*st*st;    /// Нахождение координаты тела по оси Oy в момент времени t, основываясь на известных параметрах за моменты времени t-1 и t-2;
 
        U[k]=(Y[k+1]-Y[k-1])/(2*st);    /// Нахождение значения скорости тела по оси Oy в момент времени t-1, основываясь на рассчитанных выше координатах тела по оси Ox длямоментов времени t и t-2;
 
        //cerr <<i<<" "<<k<<" "<<
 
        cerr << X[k+1] << " " << Y[k+1] << endl;    /// Выведение рассчитанных значений на экран в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 
        out << X[k+1] << " " << Y[k+1] << endl;    /// Запись рассчитанных значений в файл "Res.txt" в виде строки, где первым идет координата по оси Ox, вторым - по оси Oy;
 
        k=k+1;      /// Увеличиваем число k на единицу, чтобы в следующем шаге цикла рассчитать значения для следующего момента времени;
 
                                                    /// Таким образом, в результате работы программы мы получаем два столбика значений для координат по обеим осям, которые как записаны в файл, так и выведены на экран;
 
    }
 
    out.close();   /// Закрываем файл, с которым работали в течение программы;
 
    return 0;      /// По умолчанию возвращаем функции int main значение 0, тем самым завершая программу;
 
}
 
  
</syntaxhighlight>
+
// Отрисовка объектов
</div>
+
  Instance.Render();
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
  glFinish();
'''[[Савельева Ольга]]'''
+
// Копируем вторичный буфер в окно
 +
glutSwapBuffers();
 +
// Вызываем функцию обновления кадра
 +
glutPostRedisplay();
 +
} // End of 'Display' function
  
'''Описание:''' Пользователя попросят ввести начальную скорость, угол бросания, тогда программа запишет в файл результаты следующих вычислений:
+
/* Keyboard function */
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;  
+
// Стандартная функция, вызываемая при нажатие клавиш на клавиатуре
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
+
void sagl::anim::Keyboard( unsigned char Key, int X, int Y )
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
+
{
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
+
// Выход из программы
 +
if (Key == 27)
 +
    exit(0);
 +
// Открытие программы в полном экране
 +
else if (Key == 'f')
 +
    glutFullScreen();
 +
  // Пауза
 +
else if (Key == 'p' || Key == 'P')
 +
    Instance.IsPause = !Instance.IsPause;
 +
} // End of 'Keyboard' function
  
<div class="mw-collapsible-content">
+
sagl::anim::anim( void ) : IsPause(false), SyncTime(0), DeltaTime(0),
 +
  StartTime(clock()), OldTime(StartTime), PauseTime(0), StockSize(0)
 +
{
 +
// Инициализации OpenGL и GLUT
 +
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
 +
 
 +
// Задача размеров и позиции окна
 +
glutInitWindowPosition(0, 0);
 +
  glutInitWindowSize(700, 700);
 +
// Создание окна
 +
glutCreateWindow("T06BALL");
  
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
// Установка функций 'обратного вызова'
#include <stdio.h>
+
  glutDisplayFunc(Display);
#include <stdlib.h>
+
  glutKeyboardFunc(Keyboard);
#include <cmath>
+
  glutReshapeFunc(Reshape);
  
using namespace std;
+
// Установка цвета закраски фона
 
+
  glClearColor(0.3, 0.5, 0.7, 1);
FILE *output;
+
  // Включение буфера глубины
 +
glEnable(GL_DEPTH_TEST);
 +
  // Включение режима вычисления цвета согласно освещенности от источников света
 +
glEnable(GL_LIGHTING);
 +
// Включение источника света
 +
  glEnable(GL_LIGHT0);
 +
// Включение упрощенного режима освещенности для простого способа описания свойств поверхности
 +
  glEnable(GL_COLOR_MATERIAL);
 +
// Приведение нормалей к единичной длине
 +
  glEnable(GL_NORMALIZE);
 +
}
  
double e = 0.0000001; //точность
+
// Деструктор
double g = 9.8; //ускорение свободного падения
+
sagl::anim::~anim( void )
double dt = 0.00001;   //шаг по времени
+
{
double windageLinearCoefficient = 0.1;
+
   // Чистка памяти
double windageSquareCoefficient = 0.00001;
+
for (int i = 0; i < StockSize; i++)
 +
    delete Stock[i];
 +
}
  
struct Vector  //вектор
+
/* Render function */
 +
// Отрисовка объектов
 +
void sagl::anim::Render( void )
 
{
 
{
    double x, y;
+
for (int i = 0; i < StockSize; i++)
    Vector():x(0), y(0)
+
Stock[i]->Render(*this);
    {}
+
} // End of 'Render' function
    Vector(double x, double y):x(x), y(y)
+
 
    {}
+
/* Run function */
    const Vector operator+(const Vector &v) const
+
// Запуск главного цикла
    {
+
void sagl::anim::Run( void )
        return Vector(this -> x + v.x, this -> y + v.y);
 
    }
 
    const Vector operator-(const Vector &v) const
 
    {
 
        return Vector(this -> x - v.x, this -> y - v.y);
 
    }
 
    const Vector operator*(const double k) const
 
    {
 
        return Vector(this -> x * k, this -> y * k);
 
    }
 
    const Vector operator*(const int k) const
 
    {
 
        return Vector(this -> x * k, this -> y * k);
 
    }
 
    const Vector operator/(const double k) const
 
    {
 
        return Vector(this -> x / k, this -> y / k);
 
    }
 
};
 
 
 
const Vector operator*(const double a, const Vector &v)
 
 
{
 
{
    return Vector(v.x * a, v.y * a);
+
// Запуск основного цикла построения
}
+
glutMainLoop();
 +
} // End of 'Run' function
  
const Vector operator*(const int k, const Vector &v)
+
// END OF 'ANIM.CPP' FILE
{
+
</syntaxhighlight>
    return Vector(v.x * k, v.y * k);
+
"'''ANIM.H'''"
}
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: ANIM.H
 +
* LAST UPDATE: 17.01.2016
 +
*/
 +
 
 +
#ifndef __ANIM_H_
 +
#define __ANIM_H_
  
double abs(const Vector &v)
+
#include <stdio.h>
{
+
#include <stdlib.h>
    return sqrt(v.x * v.x + v.y * v.y);
+
#include <time.h>
}
 
  
void printCoordinate(const char *description, const Vector &v)  //выводит координаты в более читаемом виде
+
#include <GL\glut.h>
{
 
    fputs(description, output);
 
    fputs(": ", output);
 
    fprintf(output, "%lf", v.x);
 
    fputs(", ", output);
 
    fprintf(output, "%lf\n", v.y);
 
}
 
  
Vector getCoordinatesWithoutWindage(double velocity, double angle, double time = -1)
+
#include "VEC.H"
{
 
    double fallTime = 2 * velocity * sin(angle) / g;  //расчет времени падения
 
    if((time < 0) or (time > fallTime))
 
        time = fallTime;
 
    double x = velocity * cos(angle) * time;    // x = vx*t;
 
    double y = velocity * sin(angle) * time - g * time * time / 2;  // y = vy*t-(g*t^2)/2;
 
    return Vector(x, y);
 
}
 
  
Vector getCoordinatesVerletLinear(double velocity, double angle, double time = -1)
+
// Константы
{
+
#define Pi 3.14159265358979323846
    double nowTime = dt;
+
#define E 2.71828182845904523536
    Vector rsb(0, 0);
 
    if((time >= 0) and (dt / 2 - time > 0)) //если время расчета дается слишком малого промежутка
 
        return rsb; //вернитесь в начальную точку
 
    Vector v(velocity * cos(angle), velocity * sin(angle)); //проекции начальной скорости
 
    Vector r = v * dt;    //вторая точка
 
    Vector a = -windageLinearCoefficient * v; //ускорение в начальной точке
 
    a.y -= g;
 
    v = v + a * dt; //скорость во второй точке
 
    a = -windageLinearCoefficient * v; //ускорение во второй точке
 
    a.y -= g;
 
    while((r.y > 0) or ((time > 0) and (nowTime <= time)))  //пока точка выше 0 или не достигла заданного времени
 
    {
 
        Vector rn = 2 * r - rsb + a * dt * dt;  // r(t+dt) = 2*r(t)-r(t-dt)+a(t)*dt^2;
 
        v = (rn - rsb) / (2 * dt);  // v(t) = (r(t+dt)-r(t-dt))/(2*dt);
 
        rsb = r;    //обновление r(t-dt) and r(t)
 
        r = rn;
 
        a = -windageLinearCoefficient * v;  //обновление a(t)
 
        a.y -= g;
 
        nowTime += dt;  //обновленное время
 
    }
 
    return r;
 
}
 
  
Vector calculateForTime(Vector &v, double time)
+
// Собственное пространство имен 'sagl'
 +
namespace sagl
 
{
 
{
    Vector r;
+
  // Объявления класса анимации наперед
    // x = vx/k*(1-e^(-k*t));
+
class anim;
     r.x = v.x / windageLinearCoefficient * (1 - exp(-windageLinearCoefficient * time));
+
 
    // y = ((vy+g/k)*(1-e^(-k*t))-g*t)/k;
+
// Функции получения случайных чисел
     r.y = ((v.y + g / windageLinearCoefficient) * (1 - exp(-windageLinearCoefficient * time)) - g * time) / windageLinearCoefficient;
+
inline double r0( void )
    return r;
+
  {
}
+
     return rand() / (double)RAND_MAX;
 
+
  }
Vector getCoordinatesAccurateLinear(double velocity, double angle, double time = -1)
+
  inline double r1( void )
{
+
  {
     if(windageLinearCoefficient < e)  //если коэффициент слишком близок к нулю
+
     return 2.0 * rand() / RAND_MAX - 1;
        return getCoordinatesWithoutWindage(velocity, angle, time);   //вычисляй будто это 0
+
  }
    Vector r;
+
 
    Vector v(velocity * cos(angle), velocity * sin(angle)); //проекции начальной скорости
+
// Класс объектов
    if(time >= 0)   //время данное
+
class object
 +
  {
 +
  public:
 +
     // Вектора перемещения и скоростей
 +
vec P, V, AbsV;
 +
   
 +
// Конструктор
 +
object( void ) : P(vec::Rnd1()), V(vec::Rnd()), AbsV(V)
 
     {
 
     {
        r = calculateForTime(v, time);
 
        if(r.y >= 0)    //если объект в воздухе или только приземлился
 
            return r;  //затем верните координаты объекта
 
        else    //еще
 
            return getCoordinatesAccurateLinear(velocity, angle);  //верните координаты приземления
 
 
     }
 
     }
    else
+
 +
// Отрисовка объектов
 +
virtual void Render( anim &Ani )
 
     {
 
     {
        double timer, timel, timem;
+
    } // End of 'Render' function
        timer = v.y / g;
+
  }; // end of 'object' class
        timel = 0;
+
 
        while(calculateForTime(v, timer).y > 0) //смотрим на некоторые значения времени, которые больше времени посадки
+
// Класс анимации
            timer *= 1.5;
+
class anim
        timem = timel + (timer - timel) / 2;
+
  {
        r = calculateForTime(v, timem);
+
  private:
        while(abs(r.y) > e)    //бинарный поиск времени посадки
+
    // Функции 'обратного вызова'
        {
+
static void Display( void );
            if(r.y > 0)
+
    static void Keyboard( unsigned char Key, int X, int Y );
                timel = timem;
+
    static void Reshape( int W, int H );
            else
 
                timer = timem;
 
            timem = timel + (timer - timel) / 2;
 
            r = calculateForTime(v, timem);
 
        }
 
        return r;
 
    }
 
}
 
  
Vector getCoordinatesVerletSquare(double velocity, double angle, double time = -1)
+
     // Единственный экземпляр класса
{
+
static anim Instance;
     double nowTime = dt;
+
      
    Vector rsb(0, 0);
+
     // Конструктор
    if((dt / 2 - time > 0)and(time >= 0))  //если время слишком малое для рсчета
+
anim( void );
        return rsb; //вернитесь в начальную точку
 
     Vector v(velocity * cos(angle), velocity * sin(angle)); //проекции начальной скорости
 
    Vector r = v * dt;  //вторая точка
 
    Vector a = -abs(v) * v * windageSquareCoefficient;  //ускорение в начальной точке
 
    a.y -= g;
 
    v = v + a * dt; //скорость во второй точке
 
    a = -abs(v) * v * windageSquareCoefficient; //ускорение во второй точке
 
    a.y -= g;
 
    while((r.y > 0) or ((time > 0) and (nowTime <= time)))  //когда точка выше нулевой отметки и не достигает заданного времени
 
     {
 
        Vector rn = 2 * r - rsb + a * dt * dt;  // r(t+dt) = 2*r(t)-r(t-dt)+a(t)*dt^2;
 
        v = (rn - rsb) / (2 * dt); // v(t) = (r(t+dt)-r(t-dt))/(2*dt);
 
        rsb = r;    //updating r(t-dt) and r(t)
 
        r = rn;
 
        a = -abs(v) * v * windageSquareCoefficient; //новое a(t)
 
        a.y -= g;
 
        nowTime += dt;  //новое a(t)
 
    }
 
    return r;
 
}
 
  
void err(const char *s) //печатает сообщение об ошибке и завершает работу
+
// Максимальное количество объектов
{
+
    static const int Max = 100;
     fputs(s, output);
+
    // 'Контейнер' объектов
     exit(1);
+
object *Stock[Max];
}
+
    // Размер 'контейнера' объектов
 
+
int StockSize;
int main(int argc, const char *argv[])
+
   
{
+
// Переменные, хранящие время в секундах
     double velocity, angle;
+
     long StartTime, OldTime, PauseTime;
    bool needRead = true;
+
      
    if(argc==3) //если даны 2 аргумента
+
// Отрисовка объектов
 +
void Render( void );
 +
 +
// Подсчет времени
 +
void Timer( void );
 +
  public:
 +
     // Добавление объектов в 'контейнер'
 +
anim & operator<<( object *Obj )
 
     {
 
     {
        velocity = atof(argv[1]);  //истолкование его как скорости и угла
+
      if (StockSize < Max )
         angle = atof(argv[2]);
+
         Stock[StockSize++] = Obj;
         needRead = false;
+
      else
 +
         delete Obj;
 +
     
 +
return *this;
 
     }
 
     }
     if(needRead)
+
      
     {
+
// Ширина и высота окна
        puts("Enter initial velocity (m/s)");
+
     int WinW, WinH;
        scanf("%lf", &velocity);
+
 
     }
+
// Переменные, хранящие время в секундах
    if(velocity < 0)   //проверка, если скорость меньше 0
+
    double SyncTime, DeltaTime;
        err("Initial velocity must be above 0");
+
 
     if(needRead)
+
    // Переменная, отвечающая за паузу
 +
bool IsPause;
 +
 
 +
     // Деструктор
 +
~anim( void );
 +
   
 +
// Запуск главного цикла
 +
void Run( void );
 +
      
 +
    // Метод, возвращающий переменную - единственный экземпляр данного типа
 +
static anim & Get( void )
 
     {
 
     {
        puts("Enter initial angle (0-180 degrees)");
+
      return Instance;
        scanf("%lf", &angle);
 
 
     }
 
     }
    if((angle < 0) or (angle > 180))    //проверка, что угол в нужном интервале
+
  }; // end of 'anim' class
        err("Initial angle must be from 0 to 180");
+
} // end of 'sagl' namespace
    angle = angle / 180 * M_PI; // a = a/180*pi; преобразование угла из градусов в радианы
 
    output = fopen("Coordinates.txt", "w"); //открытие результативного файла
 
    //вычисление и печать 4 значений
 
    printCoordinate("Without windage", getCoordinatesWithoutWindage(velocity, angle));
 
    printCoordinate("Verlet, linear dependence", getCoordinatesVerletLinear(velocity, angle));
 
    printCoordinate("Accurate, linear dependence", getCoordinatesAccurateLinear(velocity, angle));
 
    printCoordinate("Verlet, square dependence", getCoordinatesVerletSquare(velocity, angle));
 
    fclose(output); //закрытие файла
 
    return 0;
 
}
 
</syntaxhighlight>
 
</div>
 
Скачать можно [http://tm.spbstu.ru/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9A%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82%D1%8B.zip здесь]
 
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
#endif /*__ANIM_H_ */
  
 +
// END OF 'ANIM.H' FILE
 +
</syntaxhighlight>
 +
"'''VEC.H'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: VEC.H
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
'''[[Сенников Иван]]'''
+
#ifndef __VEC_H_
 
+
#define __VEC_H_
'''Суть программы:'''Программа позволяет отслеживать траекторию движения тела, брошенного под углом к горизонту, в каждом из четырех случаев/методов.
 
  
'''Идея:''' Программа состоит из четырех методов: 1) движение тела без учета сопротивления воздуха; 2) движение тела с учетом сопротивления воздуха по первому методу Верле; 3) движение тела с учетом сопротивления воздуха по точному методу; 4) движение тела с учетом сопротивления воздуха по второму методу Верле.
+
#include <stdlib.h>
 +
#include <math.h>
  
'''Инструкция:''' Результаты программы будут записаны в соответствующий файл (подробности смотри в самой программе). Пользователю будет предоставлена возможность ввести начальную скорость и угол, под которым и бросают тело.
+
// Собственное пространство имен 'sagl'
 
+
namespace sagl
Ссылка для скачиваний: [http://tm.spbstu.ru/Файл:Throws_v2.0.zip здесь].
+
{
 
+
  // Класс векторов
</div>
+
class vec
 
+
  {
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
  public:
'''[[Степанянц Степан]]'''  
+
     // Координаты вектора
 
+
double X, Y, Z;
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
+
   
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
+
// Конструктор
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
+
vec( void ) : X(0), Y(0), Z(0)
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
+
    {
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
+
     }
 
+
      
Скачать можно  [http://tm.spbstu.ru/%D0%A4%D0%B0%D0%B9%D0%BB:Mainpr.rar тут].
+
// Конструктор
 
+
vec( double A, double B, double C ) : X(A), Y(B), Z(C)
<div class="mw-collapsible-content">
+
    {
[[File:graph239.png]]
+
    }
 
+
   
Для тела с массой 1,сопротивлением воздуха 0.05, угол бросания 30°, начальная скорость 40 м/с, ускорение свободного падения 9.8 м/c^2;
+
// Функции получения случайных чисел
 
+
static double R0( void )
 
+
    {
 
+
      return rand() / (double)RAND_MAX;
Файл "'''main.cpp'''"
+
     }
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
      
#include <iostream>
+
static double R1( void )
#include <locale.h>
+
     {
#include <math.h>
+
      return 2 * rand() / (double)RAND_MAX - 1;
#include <fstream>
+
    }
#include<iomanip>
+
      
#include <cmath>
+
// Функции получения случайных векторов
using namespace std;
+
static vec Rnd( void )
main ()
 
{
 
     ofstream F;                                                                    //a1-угол в градусах,dt-шаг,r-сопротивление воздуха
 
int u0=50;
 
double x,y,t,a,a1=30,dt=0.1,y0=0,x0=0,g=9.8,r=0.05,m=1,ux,uy,ypr,xpr,ysl,xsl,u,yt; //ux,uy - проэкции скорости на оси х и у.
 
a=a1*M_PI/180; //Градусы в радианы
 
t=0;
 
 
                                        //Движение без сопротивления воздуха
 
F.open("C:\\1.txt",ios::out);
 
while(y>=0)
 
{
 
     x=x0+u0*cos(M_PI/6)*t;
 
     y=y0+u0*sin(M_PI/6)*t - 0.5 * g * t * t;  //Расчитываем координаты в каждой точке через шаг
 
  F<<x<<" "<<y<<endl;
 
  t=t+dt;
 
 
}
 
 
F.close();
 
                                        //Точное решение для линейной зависимости
 
F.open("C:\\2.txt",ios::out);
 
y=y0;
 
x=x0;
 
t=0;                                                                            //Расчитываем координаты в каждой точке через шаг
 
while(y>=0)
 
{
 
        ux = u0 * cos(a);
 
        uy = u0 * sin(a);
 
        x = x0+ (m * ux / r)* (1 - exp(-1 * r * t / m));                      //подстановка формул
 
        y = y0+(m/r)*((uy + g * m / r)*(1 - exp(-1 * r * t / m)) - g * t);
 
        t = t + dt;
 
 
      F << x << ' ' << y << endl;
 
 
 
 
}
 
  F.close();
 
                                                        //метод Верле 1
 
ypr = y0 - u0*sin(a)*dt;
 
yt=ypr;
 
    xpr = x0 - u0*cos(a)*dt;
 
     x = x0;                          //Начальные условия
 
     y = y0;
 
    u = u0;
 
    ux = u0 * cos(a);
 
     uy = u0 * sin(a);                       
 
F.open("C:\\3.txt",ios::out);
 
 
     while (y >= y0)
 
 
     {
 
     {
        xsl = 2 * x - xpr - (r / m) * u * ux * (dt * dt);
+
      return vec(R0(), R0(), R0());
        ux = ( xsl - xpr )/ (2 * dt);
+
    }
        ysl = 2 * y - ypr - (g + (r / m) * u * uy) * (dt * dt);      //xsl,ysl - координаты на шаге вперед. xpr,ypr- назад
+
   
        uy =  (ysl - ypr)/ (2 * dt);
+
static vec Rnd1( void )
        u = sqrt(uy*uy + ux*ux );
+
    {
        F << x << ' ' << y << endl;
+
      return vec(R1(), R1(), R1());
 
        xpr = x;
 
        x = xsl;
 
        ypr = y;
 
        y = ysl;
 
 
     }
 
     }
    F.close();
+
                                                      //Метод Верле 2
+
vec operator+( vec V )
    ypr = y0 - u0*sin(a)*dt;
+
{
yt=ypr;
+
return vec(X + V.X, Y + V.Y, Z + V.Z);
    xpr = x0 - u0*cos(a)*dt;
+
}
    x = x0;                                                                            //xsl,ysl - координаты на шаге вперед. xpr,ypr- назад
+
    y = y0;
+
vec operator*( double t )
    u = u0;
 
    ux = u0 * cos(a);                           
 
    uy = u0 * sin(a);
 
F.open("C:\\4.txt",ios::out);
 
 
    while (y >= y0)
 
 
     {
 
     {
        xsl = 2 * x - xpr - (r / m) * ux * (dt * dt);
+
      return vec(X * t, Y * t, Z * t);
        ux = ( xsl - xpr )/ (2 * dt);
+
    }
        ysl = 2 * y - ypr - (g + (r / m) * uy) * (dt * dt);
+
   
        uy = (ysl - ypr)/ (2 * dt);
+
vec & operator+=( const vec &V )
        u = sqrt(uy*uy + ux*ux );
+
    {
        F << x << ' ' << y << endl;
+
      X += V.X;
+
      Y += V.Y;
        xpr = x;
+
      Z += V.Z;
        x = xsl;
+
     
        ypr = y;
+
return *this;
        y = ysl;
 
 
     }
 
     }
    F.close();
+
+
// Длина вектора
+
double operator!(void) const
return 0;
+
{
+
return sqrt(X * X + Y * Y + Z * Z);
+
} /* end of 'operator!' function */
}
+
  }; // end of 'vec' class
 +
} // end of 'sagl' namespace
 +
 
 +
#endif /*__VEC_H_ */
  
 +
// END OF 'VEC.H' FILE
 
</syntaxhighlight>
 
</syntaxhighlight>
</div>
+
"'''SAMPLE.H'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: SAMPLE.H
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
 +
#ifndef __SAMPLE_H_
 +
#define __SAMPLE_H_
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
#include <math.h>
'''[[Александр Сюрис]]'''
 
  
'''Описание программы''':
+
#include "ANIM.H"
Программа записывает в текстовый файл результаты вычисления координат по x и y с шагом в 0.1 секунду(возможно изменить) четырьмя различными способами:
 
#Координаты, рассчитанные по формуле, при движении без сопротивления воздуха
 
#Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении          воздуха от скорости
 
#Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости
 
#Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости
 
Скачать можно  [http://mech.spbstu.ru/File:%D0%9F%D0%BE%D0%BB%D0%B5%D1%82_%D1%82%D0%B5%D0%BB%D0%B0(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%A1%D1%8E%D1%80%D0%B8%D1%81).zip тут].
 
<div class="mw-collapsible-content">
 
[[File:Снимок.PNG]]
 
Для тела с массой 1,сопротивлением воздуха 0.05, угол бросания 45°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2;
 
Файл "'''main.cpp'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <iostream>
 
#include <fstream>
 
#include <math.h>
 
#include <cmath>
 
using namespace std;
 
int o;
 
double v,a,m,k;
 
ofstream fout("file.txt");//создаем объект, сяванный с файлом file.txt
 
  
 
+
// Шар, летящий без сопротивлением воздуха
 
+
class ball : public sagl::object
int rez_1(double v, double a)
 
 
{
 
{
    fout<<"---------------Первый режим-------------------------"<<endl;
+
private:
    fout<<" T=0 x=0 y=0";
+
  double angle, v; // угол вектора скорости к горизонту; модуль скорости
    fout<<endl;
+
public:
    double x=0,y=0,t=0.1, V0x, V0y, g=9.8,t1, T=0.1, Ty;
+
  // Конструктор
    V0x=v*cos(a/180*M_PI);//рассчет проекций начальных скоростей на оси x и y с переводом угла в радианы
+
ball( void ) : angle(Pi / 3), v(1)
    V0y=v*sin(a/180*M_PI);
+
  {
    Ty=2*V0y/g;//время полета
+
P = sagl::vec(sagl::r0() + 5, 5, 0);
    while (y>0 || x==0)//условие: пока тело не упадет на землю(те y=0, при этом не учитывая начало полета
+
V.X = 0;
    {
+
V.Y = sin(angle) * v;
        x=x+V0x*t;               //ф-лы для рассчета x и y в данный момент времени
+
V.Z = cos(angle) * v;
        y=y+V0y*t-g*pow(t,2)/2;
+
  }
 +
 +
// Конструктор
 +
ball( double angle1, double v1 ) : angle(angle1), v(v1)
 +
{
 +
P = sagl::vec(sagl::r0() + 5, 5, 0);
 +
V.X = 0;
 +
V.Y = sin(angle) * v;
 +
V.Z = cos(angle) * v;
 +
}
 +
 
 +
// Отрисовка объекта
 +
void Render( sagl::anim &Ani )
 +
  {
 +
// Вектор ускорения свободного падения
 +
sagl::vec g = sagl::vec(0, -9.8, 0);
 +
// Размер комнаты
 +
double Size = 120;
 +
 
 +
// Изменение вектора скорости
 +
V += g * Ani.DeltaTime;
 +
// Изменение вектора перемещения
 +
P += V * Ani.DeltaTime;
  
        if (y<0) //если y<0
+
// Ограничения - стенки
            {
+
if (P.X > Size / 4)
                t1=Ty-T; //рассчитываем время,которое осталось лететь телу до земли
+
V.X = -fabs(V.X);
                x=x+V0x*t1;//используя это время находим координату по х
+
if (P.X < -Size / 4)
                fout<<" T="<<Ty<<" x="<<x<<" y=0"<<endl;//ввод в текстовый файл
+
V.X = fabs(V.X);
                break;
 
            }
 
            else
 
                {
 
                    V0y=V0y-g*t;// иначе находим новую скорость по y (по x не меняется)
 
                    fout<<" T="<<T<<" x="<<x<<" y="<<y<<endl;
 
                    T=T+t;//увел время на шаг
 
                }
 
    }
 
  
 +
if (P.Y > Size / 4)
 +
V.Y = -fabs(V.Y);
 +
if (P.Y < -Size / 4)
 +
      V.Y = fabs(V.Y);
  
}
+
if (P.Z > Size / 4)
 
+
V.Z = -fabs(V.Z);
 
+
if (P.Z < -Size / 4)
int rez_2(double v, double a, double k, double m)
+
V.Z = fabs(V.Z);
{
+
    fout<<"---------------Второй режим работы-------------------------"<<endl;
+
     // Запоминание состояния изменения текущей СК
    fout<<" T=0 x=0 y=0";
+
glPushMatrix();
    fout<<endl;
+
     double t=0.1, Vx=v*cos(a/180*M_PI), Vy=v*sin(a/180*M_PI),y,x,T=0.1,g=9.8;
+
// Рисование стенок
    x=(m*Vx/k)*(1-exp(-1*k*T/m));           //ф-лы для рассчета x и y в данный момент времени
+
glutWireCube(Size / 2);
     y =(m/k)*((Vy+g*m/k)*(1-exp(-1*k*T/m))-g*T); //точное решение при лин завсисимости
+
// Задача перемещения мяча
    while (y>0)
+
glTranslated(P.X, P.Y, P.Z);
     {
+
     // Цвет мяча
        x=(m*Vx/k)*(1-exp(-1*k*T/m));
+
glColor3d(0, 1, 0);
        y =(m/k)*((Vy+g*m/k)*(1-exp(-1*k*T/m))-g*T);
+
// Рисование мяча
        fout<<" T="<<T<<" x="<<x<<" y="<<y<<endl;
+
glutSolidSphere(0.5, 30, 30);
        T=T+t;
+
      
    }
+
// Восстановление последнего запоминания состояния изменения текущей СК
 +
glPopMatrix();
 +
  }
 +
}; // end of 'ball' class
  
 
+
// Шар, летящий с сопротивлением воздуха
}
+
// Координаты получены методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости
 
+
class ball_air : public sagl::object
 
 
 
 
int rez_3(double v, double a, double k, double m)
 
 
{
 
{
  fout<<"---------------Третий режим работы-------------------------"<<endl;
+
private:
    fout<<" T=0 x=0 y=0";
+
double angle, v, m, n;
    fout<<endl;
+
public:
    double t=0.1, Vxn=v*cos(a/180*M_PI), Vyn=v*sin(a/180*M_PI),
+
// Конструктор
    x3=0,x2=0,x1=x2-Vxn*t,  y3=0,
+
ball_air( void ) : angle(Pi / 3), v(1), m(1), n(0.1)
    y2=0, y1=y2-Vyn*t, g=9.8, t1, T=0.1;//шаг, скорость по х в момент времени T, -\\- по y в момент времени Т
+
{
    //координата по х в в момент времени T, -\\- в n-1 шаг, -\\- в n шаге, аналогично для y,
+
P = sagl::vec(sagl::r0() + 5, 5, 0);
 +
V.X = 0;
 +
V.Y = sin(angle) * v;
 +
V.Z = cos(angle) * v;
 +
}
 +
 +
// Конструктор
 +
ball_air( double angle1, double v1, double m1, double n1 ) : angle(angle1), v(v1), m(m1), n(n1)
 +
{
 +
P = sagl::vec(sagl::r0() + 5, 5, 0);
 +
V.X = 0;
 +
V.Y = sin(angle) * v;
 +
V.Z = cos(angle) * v;
 +
}
 +
 +
// Отрисовка объекта
 +
void Render( sagl::anim &Ani )
 +
{
 +
// Вектор ускорения свободного падения и вектор полного ускорения
 +
sagl::vec g = sagl::vec(0, -9.8, 0), a;
 +
// Размер комнаты
 +
double Size = 120;
 +
 
 +
// Изменение вектора ускорения
 +
a = sagl::vec(0, g.Y - n / m * !V * V.Y, -n / m * !V * V.Z);
  
 +
// Изменение вектора скорости
 +
V += a * Ani.DeltaTime;
 +
// Изменение вектора перемещения
 +
P += V * Ani.DeltaTime;
  
    x3=2*x2-x1-k/m*Vxn*pow(t,2);  //координаты в момент времени T
+
// Ограничения - стенки
    y3=2*y2-y1-(g-+k/m*Vyn)*pow(t,2);
+
if (P.X > Size / 4)
    Vxn=(x3-x1)/(2.0*t); //скорость в момент времени T
+
V.X = -fabs(V.X);
    Vyn=(y3-y1)/(2.0*t);
+
if (P.X < -Size / 4)
    x1=x2;// приравнивание к координате на n-1 шаге значение координаты в n шаге
+
V.X = fabs(V.X);
    y1=y2;
 
    x2=x3;//-//- к координате в n шаге значение в момент времени T
 
    y2=y3;
 
    while (y2>0)
 
    {
 
        x3=2*x2-x1-k/m*Vxn*pow(t,2);
 
        y3=2*y2-y1-(g+k/m*Vyn)*pow(t,2);
 
        Vxn=(x3-x1)/(2.0*t);
 
        Vyn=(y3-y1)/(2.0*t);
 
        fout<<" T="<<T<<" x="<<x2<<" y="<<y2<<endl;
 
  
        if (y3<0)
+
if (P.Y > Size / 4)
        {
+
V.Y = -fabs(V.Y);
            t1=sqrt(abs((-y1+2*y2)/(g+k/m*Vyn)));
+
if (P.Y < -Size / 4)
            x3=2*x2-x1-k/m*Vxn*pow((t+t1),2);
+
V.Y = fabs(V.Y);
            fout<<" T="<<T+t1<<" x="<<x3<<" y="<<0<<endl;
 
        }
 
  
        T=T+t;
+
if (P.Z > Size / 4)
        x1=x2;
+
V.Z = -fabs(V.Z);
        y1=y2;
+
if (P.Z < -Size / 4)
        x2=x3;
+
V.Z = fabs(V.Z);
        y2=y3;
+
 +
// Запоминание состояния изменения текущей СК
 +
glPushMatrix();
 +
 +
// Рисование стенок
 +
glutWireCube(Size / 2);
 +
// Задача перемещения мяча
 +
glTranslated(P.X, P.Y, P.Z);
 +
// Цвет мяча
 +
glColor3d(1, 0, 0);
 +
// Рисование мяча
 +
glutSolidSphere(0.5, 30, 30);
 +
 +
// Восстановление последнего запоминания состояния изменения текущей СК
 +
glPopMatrix();
 +
}
 +
}; // end of 'ball_air' class
  
    }
+
// Шар, летящий с сопротивлением воздуха
 
+
// Координаты получены из точного решения при линейной зависимости силы сопротивлении воздуха от скорости
}
+
class ball_air_2 : public sagl::object
 
 
 
 
int rez_4(double v, double a, double k, double m)
 
 
{
 
{
  fout<<"---------------Четвертый режим работы-------------------------"<<endl;
+
private:
    fout<<" T=0 x=0 y=0";
+
double angle, v, m, n;
    fout<<endl;
+
public:
    double t=0.1, Vxn=v*cos(a/180*M_PI), Vyn=v*sin(a/180*M_PI),
+
// Конструктор
    x3=0,x1=0, x2=x1+Vxn*t, y3=0, y1=0,
+
ball_air_2( void ) : angle(Pi / 3), v(1), m(1), n(0.1)
    y2=y1+Vyn*t, g=9.8, t1, T=0.1, V=v;//шаг, скорость по х в момент времени T, -\\- по y в момент времени Т
+
{
    //координата по х в в момент времени T, -\\- в n-1 шаг, -\\- в n шаге, аналогично для y,
+
P = sagl::vec(sagl::r0() + 5, 5, 0);
 +
V.X = 0;
 +
V.Y = sin(angle) * v;
 +
V.Z = cos(angle) * v;
 +
}
 +
 +
// Конструктор
 +
ball_air_2( double angle1, double v1, double m1, double n1 ) : angle(angle1), v(v1), m(m1), n(n1)
 +
{
 +
P = sagl::vec(sagl::r0() + 5, 5, 0);
 +
V.X = 0;
 +
V.Y = sin(angle) * v;
 +
V.Z = cos(angle) * v;
 +
}
 +
 +
// Отрисовка объекта
 +
void Render( sagl::anim &Ani )
 +
{
 +
// Вектор ускорения свободного падения и вектор полного ускорения
 +
sagl::vec g = sagl::vec(0, -9.8, 0), a;
 +
// Размер комнаты
 +
double Size = 120;
  
 +
// Изменение вектора скорости
 +
V.Z = V.Z * exp(-n / m * Ani.DeltaTime);
 +
V.Y = (V.Y - g.Y * m / n) * exp(-n / m * Ani.DeltaTime) + g.Y * m / n;
 +
// Изменение вектора перемещения
 +
P += V * Ani.DeltaTime;
  
    x3=2.0*x2-x1-(k/m)*V*Vxn*pow(t,2);
+
// Ограничения - стенки
    y3=2.0*y2-y1-(g+(k/m)*V*Vyn)*pow(t,2);
+
if (P.X > Size / 4)
    Vxn=(x3-x1)/(2.0*t);
+
V.X = -fabs(V.X);
    Vyn=(y3-y1)/(2.0*t);
+
if (P.X < -Size / 4)
    V=sqrt(pow(Vxn,2)+pow(Vyn,2.0));
+
V.X = fabs(V.X);
    x1=x2;
 
    y1=y2;
 
    x2=x3;
 
    y2=y3;
 
    while (y2>0)
 
    {
 
        x3=2.0*x2-x1-(k/m)*Vxn*V*pow(t,2);
 
        y3=2.0*y2-y1-(g+(k/m)*Vyn*V)*pow(t,2);
 
        Vxn=(x3-x1)/(2.0*t);
 
        Vyn=(y3-y1)/(2.0*t);
 
        V=sqrt(pow(Vxn,2)+pow(Vyn,2));
 
        fout<<" T="<<T<<" x="<<x2<<" y="<<y2<<endl;
 
  
        if (y3<0)
+
if (P.Y > Size / 4)
        {
+
V.Y = -fabs(V.Y);
            t1=sqrt(abs((-y1+2.0*y2)/(g+(k/m)*Vyn*V)));
+
if (P.Y < -Size / 4)
            x3=2.0*x2-x1-(k/m)*Vxn*V*pow((t+t1),2);
+
V.Y = fabs(V.Y);
            fout<<" T="<<T+t1<<" x="<<x3<<" y="<<0<<endl;
 
        }
 
  
 +
if (P.Z > Size / 4)
 +
V.Z = -fabs(V.Z);
 +
if (P.Z < -Size / 4)
 +
V.Z = fabs(V.Z);
  
        T=T+t;
+
// Запоминание состояния изменения текущей СК
        x1=x2;
+
glPushMatrix();
        y1=y2;
 
        x2=x3;
 
        y2=y3;
 
  
    }
+
// Рисование стенок
 
+
glutWireCube(Size / 2);
}
+
// Задача перемещения мяча
 +
glTranslated(P.X, P.Y, P.Z);
 +
// Цвет мяча
 +
glColor3d(0, 1, 1);
 +
// Рисование мяча
 +
glutSolidSphere(0.5, 30, 30);
 +
 +
// Восстановление последнего запоминания состояния изменения текущей СК
 +
glPopMatrix();
 +
}
 +
}; // end of 'ball_air_2' class
  
 
+
// Шар, летящий с сопротивлением воздуха
int main()
+
// Координаты получены методом Верле при линейной зависимости силы сопротивлении воздуха от скорости
 +
class ball_air_3 : public sagl::object
 
{
 
{
 +
private:
 +
double angle, v, m, n;
 +
public:
 +
// Конструктор
 +
ball_air_3( void ) : angle(Pi / 3), v(1), m(1), n(0.1)
 +
{
 +
P = sagl::vec(sagl::r0() + 5, 5, 0);
 +
V.X = 0;
 +
V.Y = sin(angle) * v;
 +
V.Z = cos(angle) * v;
 +
}
 +
 +
// Конструктор
 +
ball_air_3( double angle1, double v1, double m1, double n1 ) : angle(angle1), v(v1), m(m1), n(n1)
 +
{
 +
P = sagl::vec(sagl::r0() + 5, 5, 0);
 +
V.X = 0;
 +
V.Y = sin(angle) * v;
 +
V.Z = cos(angle) * v;
 +
}
 +
 +
// Отрисовка объекта
 +
void Render( sagl::anim &Ani )
 +
{
 +
// Вектор ускорения свободного падения и вектор полного ускорения
 +
sagl::vec g = sagl::vec(0, -9.8, 0), a;
 +
// Размер комнаты
 +
double Size = 120;
  
setlocale(LC_ALL, "rus");
+
// Изменение вектора ускорения
cout<<"Введите скорость тела и угол"<<endl;
+
a = sagl::vec(0, g.Y - n / m * V.Y, -n / m * V.Z);
cin>>v>>a;
 
 
 
while (1>0){
 
cout<<"Выберите режим работы программы:"<<endl;
 
cout<<"1 - Координаты, рассчитанные по формуле, при движении без сопротивления воздуха"<<endl;
 
cout<<"2 - Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости"<<endl;
 
cout<<"3- Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости"<<endl;
 
cout<<"4 - Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости"<<endl;
 
cout<<"5 - Выйти";
 
cin>>o;
 
 
 
if (o==1)
 
    rez_1(v,a);
 
if (o==2)
 
    {
 
    cout<<"Введите массу тела и коэф сопротивления воздуха:"<<endl;
 
    cin>>m>>k;
 
    rez_2(v,a,k,m);
 
    }
 
  
if (o==3)
+
// Изменение вектора скорости
    {
+
V += a * Ani.DeltaTime;
    cout<<"Введите массу тела и коэф сопротивления воздуха:"<<endl;
+
// Изменение вектора перемещения
    cin>>m>>k;
+
P += V * Ani.DeltaTime;
    rez_3(v,a,k,m);
 
    }
 
  if (o==4)
 
    {
 
    cout<<"Введите массу тела и коэф сопротивления воздуха:"<<endl;
 
    cin>>m>>k;
 
    rez_4(v,a,k,m);
 
    }
 
  if (o==5)
 
        break;
 
  
            }
+
// Ограничения - стенки
}
+
if (P.X > Size / 4)
 +
V.X = -fabs(V.X);
 +
if (P.X < -Size / 4)
 +
V.X = fabs(V.X);
  
 +
if (P.Y > Size / 4)
 +
V.Y = -fabs(V.Y);
 +
if (P.Y < -Size / 4)
 +
V.Y = fabs(V.Y);
  
</syntaxhighlight>
+
if (P.Z > Size / 4)
</div>
+
V.Z = -fabs(V.Z);
 +
if (P.Z < -Size / 4)
 +
V.Z = fabs(V.Z);
  
 +
// Запоминание состояния изменения текущей СК
 +
glPushMatrix();
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
// Рисование стенок
'''[[Тимошенко Валентина]]'''
+
glutWireCube(Size / 2);
 
+
// Задача перемещения мяча
'''Описание программы''': при запуске пользователь вводит шаг функции, угол, под которым бросают тело, массу тела, сопротивление воздуха и скорость.
+
glTranslated(P.X, P.Y, P.Z);
Программа записывает в четыре файла результаты вычисления:
+
// Цвет мяча
#Координаты, рассчитанные по формуле для движения без сопротивления воздуха;  
+
glColor3d(1, 0.5, 0);
#Координаты, рассчитанные по формуле для движения с учетом сопротивления воздуха;
+
// Рисование мяча
#Координаты, полученные методом Верле при квадратичной зависимости силы сопротивления воздуха от скорости.
+
glutSolidSphere(0.5, 30, 30);
#Координаты, полученные методом Верле при линейной зависимости силы сопротивления воздуха от скорости;
+
 +
// Восстановление последнего запоминания состояния изменения текущей СК
 +
glPopMatrix();
 +
}
 +
}; // end of 'ball_air_3' class
  
Скачать можно  [http://tm.spbstu.ru/Файл:motion.zip тут.]
+
#endif /*__SAMPLE_H_ */
  
<div class="mw-collapsible-content">
+
// END OF 'SAMPLE.H' FILE
 +
</syntaxhighlight>
 +
</div>
 +
[http://tm.spbstu.ru/File:T06BALL.7z Скачать архив]
 +
<br>
  
'''Визуализированный результат работы программы'''
 
[[File:Grafics.png]]
 
  
Графики приведены для движения тела массой 1, со скоростью 50, под углом 45 градусов. Сопротивление воздуха принято равным 0.0001, шаг 0,1.
+
'''[[Абрамов Игорь]]'''
  
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
'''Алгоритм''': в специализированном классе хранятся данные о мяче, функции-члены, задающие различные типы движения тела, функции отрисовки движения мяча. Все расчёты ведутся в режиме реального времени с помощью дополнительных функций. Отрисовка движения мяча происходит с помощью графических средств библиотеки OpenGL.
  
#include <iostream> ///программа, подсчитывающая и записывающая в файл координаты движения тела для двух вариантов метода Верле
+
'''Инструкция''': при запуске программы пользователь видит полёт четырёх мячей в замкнутом пространстве с равными начальными условиями, но различными алгоритмами движения. При желании изменить тип движения мяча достаточно изменить лишь название функции движения конкретного объекта в функции Display.
#include <fstream> /// и для движений с учётом сопротивления и без его учёта
 
#include <math.h>
 
#include<stdlib.h>
 
using namespace std;
 
  
int main()
+
Ссылка для скачивания: [http://tm.spbstu.ru/File:Ball_Abramov.rar]
{
 
    double a, step, Pi, g, Vo, m, r;
 
    ///а - угол, под которым движется тело, step - шаг функции, Vo - начальная скорость тела, m - масса тела, r - величина сопротивления
 
  
    double x, y, x_0, y_0, x0, y0, Vx, Vy;
+
</div>
    ///переменные для движения точки без учёта сопротивления и с его учётом
 
    ///х - изменяющаяся пошагово координата тела по оси Ох, у - изменяющаяся пошагово координата тела по оси Оу,
 
    ///х0 - начальная координата тела по оси Ох, у0 - начальная координата тела по оси Оу
 
    ///Vx - скорость тела по оси Ох, Vу - скорость тела по оси Оу
 
    ///x_0 - изменяющаяся пошагово координата тела по оси Ох с учётом сопротивления, у_0 - изменяющаяся пошагово координата тела по оси Оу с учётом сопротивления
 
  
    double Vy0, Vx0, x1, x2, x3, y1, y2, y3, Vxn, Vyn, Vn;
+
'''[[Лобанов Илья]]'''
    ///переменные для 1го варианта метода Верле
 
    ///х1 - координата тела по оси Ох на (n-1) шаге, х2 - координата тела по оси Ох на (n) шаге, х3 - координата тела по оси Ох на (n+1) шаге
 
    ///у1 - координата тела по оси Оу на (n-1) шаге, у2 - координата тела по оси Оу на (n) шаге, у3 - координата тела по оси Оу на (n+1) шаге
 
    ///Vx0 - начальная скорость тела по оси Ох, Vy0 - начальная скорость тела по оси Оу
 
    ///Vxn - скорость тела в данный момент времени по оси Ох, Vyn - скорость тела в данный момент времени по оси Оу
 
  
    double Vxn2, Vyn2, x_1, x_2, x_3, y_1, y_2, y_3;
+
'''Описание программы''' : программа записывает в четыре файла результаты вычисления:
    ///переменные для 2го варианта метода Верле
 
    ///х_1 - координата тела по оси Ох на (n-1) шаге, х_2 - координата тела по оси Ох на (n) шаге, х_3 - координата тела по оси Ох на (n+1) шаге
 
    ///у_1 - координата тела по оси Оу на (n-1) шаге, у_2 - координата тела по оси Оу на (n) шаге, у_3 - координата тела по оси Оу на (n+1) шаге
 
    ///Vxn2 - скорость тела в данный момент времени по оси Ох, Vyn2 - скорость тела в данный момент времени по оси Оу
 
  
    g=10; ///значение ускорения свободного падения
+
Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
    Pi=3.14159265; /// значение числа П, используем для перевода радиан в градусы
+
Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
    do ///цикл, запрашивающий ввод пользователем значения шага функции
 
    {
 
        cout << "Input the step, it must be less than 1" << endl; ///ввод с клавиатуры шага(то же самое, что дельта t), шаг должен быть маленьким (меньше 1)
 
        cin >> step;  ///вывод величины шага на экран
 
    }
 
    while (step>=1); ///выход из цикла не будет обеспечен, пока пользователь не введет число, меньшее 1
 
  
    cout << '\n' << "Input the corner in degrees,the corner is in the range from 0 to 90 degrees" << endl; ///ввод с клавиатуры угла в радианах (угол от 0 до 90 градусов)
+
'''Краткая инструкция''':
    cin >> a; ///вывод значение угла на экран
 
    a=(Pi*a)/180.0;
 
    cout << '\n' << "Input the weight" << endl; ///ввод с клавиатуры значения массы
 
    cin >> m; ///вывод величины массы на экран
 
  
    do ///цикл, запрашивающий ввод пользователем значения сопротивления воздуха
+
В окне консоли пользователю предлагается вывести следующие значения: начальную скорость , угол и шаг.
    {
+
После этого полученные в результате работы программы данные выводятся в файл.
        cout << '\n' << "Input the value of the resistance, it must be less than 1" << endl; ///ввод с клавиатуры величины сопротивления
 
        cin >> r; ///вывод значения сопротивления на экран
 
    }
 
    while (r>=1); ///выход из цикла не будет обеспечен, пока пользователь не введет число, меньшее 1
 
  
    cout << '\n' << "Input the speed" << endl; ///ввод с клавиатуры значения начальной скорости
+
Скачивать [[http://tm.spbstu.ru/File:Air.rar тут]]
    cin >> Vo; ///вывод значения скорости на экран
+
[[http://tm.spbstu.ru/File:phys.rar тут]]
  
    ///для движения без учёта сопротивления
+
</div>
    x0=0; ///обнуление переменных
 
    y0=0;
 
    x=0;
 
    y=0;
 
  
    ///для движения с учётом сопротивления
 
    x_0=0; ///обнуление переменных
 
    y_0=0;
 
  
    ///для 1го варианта метода Верле
 
  
    Vx0=Vo*cos(a); ///расчет проекции начальной скорости по оси Ох
+
</div>
    Vy0=Vo*sin(a); ///расчет проекции начальной скорости по оси Оу
 
  
    x2=0; ///обнуление переменных
+
'''[[Капитанюк Светлана]]'''
    y2=0;
 
    x3=0;
 
    y3=0;
 
  
    y1=y2-Vy0*step; ///расчет начального значения координаты по оси Оу
+
'''Описание программы''' : программа записывает в четыре файла результаты вычисления:
    x1=x2-Vx0*step; ///расчет начального значения координаты по оси Ох
 
  
    ///для 2го варианта метода Верле
+
Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 +
Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
    x_2=0; ///обнуление переменных
+
Скачивать [http://tm.spbstu.ru/File:Point_03.zip тут]
    y_2=0;
 
    x_3=0;
 
    y_3=0;
 
  
    Vxn2=Vo*cos(a); ///расчет скорости тела на начальный момент времени по оси Ох
+
</div>
    Vyn2=Vo*sin(a); ///расчет скорости тела на начальный момент времени по оси Оу
 
  
    y_1=y_2-Vo*sin(a)*step; ///расчет начального значения координаты на (п-1) шаге по оси Оу
+
</div>
    x_1=-Vo*cos(a)*step;    ///расчет начального значения координаты на (п-1) шаге по оси Ох
 
  
    ofstream out("For method without resistance.txt");
+
'''[[Бальцер Анастасия]]'''
    ///запись в файл значений координат по осям Ох и Оу для движения без сопротивления
 
  
    for (int i=0; y>=0; ++i) ///цикл для подсчета координат при движении тела без учёта сопротивления
+
'''Описание программы''' : программа записывает в четыре файла результаты вычисления:
    {
 
        x=Vo*step*i*cos(a); ///расчет координаты тела по оси х
 
        y=Vo*sin(a)*i*step-(g*i*step*i*step)*0.5; ///расчет координаты тела по оси y
 
  
        out << x << "    " << y <<'\n';  ///вывод всех значений координат по оси х и по оси у при движении тела без учёта сопротивления
+
Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
    }
+
Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
    out.close();
+
Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
    ofstream out1 ("For method with resistance.txt");
+
Посмотреть программу можно [http://tm.spbstu.ru/File:falling.zip здесь]
    ///запись в файл значений координат по осям Ох и Оу для движения с учётом сопротивления
 
  
    for (int i=0; y_0>=0; ++i) ///цикл для подсчета координат при движении тела с учётом сопротивления
+
</div>
    {
+
 
        Vx=Vo*cos(a); ///расчет скорости тела по оси Ох
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
        Vy=Vo*sin(a); ///расчет скорости тела по оси Оу
+
'''[[Демченко Артём]]'''
        x_0=x0+(m/r)*Vx*(1.0 - exp((-r*i*step)/m)); ///расчет координаты тела по оси х
 
        y_0=y0+(m/r)*(Vy+g*(m/r))*(1.0 - exp((-r*i*step)/m))-g*i*step*(m/r); ///расчет координаты тела по оси y
 
  
        out1 << x_0 << "    " << y_0 <<'\n';  ///вывод всех значений координат по оси х и по оси у при движении c учётом сопротивления
+
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
    }
+
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
    out1.close();
+
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 +
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
  
    ofstream out2 ("For method Verle 1.txt");
+
''' Инструкция ''':
    ///запись в файл значений координат по осям Ох и Оу для 1го варианта метода Верле
+
Пользователь вводит начальные данные ( массу, скорость, угол броска, шаг по времени и сопротивление воздуха). Выбираем режим работы программы, после этого в папке с программой создается файл, который требуется открыть программой gnuplot для просмотра графика, построенного на полученных координатах.
  
    for (int i=0; y3>=0; ++i) ///цикл для подсчета координат и скорости по времени для 1го варианта метода Верле
 
    {
 
        x3=2*x2-x1-(r/m)*Vn*Vxn*step*step; ///расчет координаты в данный момент времени по оси Ох
 
        y3=2*y2-y1-(g+(r/m)*Vn*Vyn)*step*step; ///расчет координаты в данный момент времени по оси Оу
 
        Vxn=(x3-x1)/(2.0*step); ///расчет скорости в данный момент времени по оси Оу
 
        Vyn=(y3-y1)/(2.0*step); /// расчет скорости в данный момент времени по оси Ох
 
        Vn=sqrt(Vxn*Vxn+Vyn*Vyn); ///расчет скорости тела по модулю
 
  
        x1=x2; ///присваивание значению координаты х1 на (n-1) шаге значение координаты х2 на n шаге
+
<div class="mw-collapsible-content">
        x2=x3; ///присваивание значению координаты х2 на (n) шаге значение координаты х3 на (n+1) шаге
 
        y1=y2; ///присваивание значению координаты у1 на (n-1) шаге значение координаты у2 на n шаге
 
        y2=y3; ///присваивание значению координаты у2 на (n) шаге значение координаты у3 на (n+1) шаге
 
  
        out2 << x3 << "  " << y3 <<'\n'; ///вывод всех значений координат по оси Ох и по оси Оу на экран для 1го варианта метода Верле
 
    }
 
    out2.close();
 
  
    ofstream out3 ("For method Verle 2.txt");
 
    ///запись в файл значений координат по осям Ох и Оу для 2го варианта метода Верле
 
  
     for (int i=0; y_3>=0; ++i) ///цикл для подсчета координат и скорости по времени для 2го варианта метода Верле
+
'''Визуализированный результат работы программы'''
     {
+
 
        x_3=2*x_2-x_1-(r/m)*Vxn2*step*step; ///расчет координаты в данный момент времени по оси Ох
+
[[:File:Throws.png]]
        y_3=2*y_2-y_1-(g+(r/m)*Vyn2)*step*step; ///расчет координаты в данный момент времени по оси Оу
+
 
        Vxn2=(x_3-x_1)/(2.0*step); ///расчет скорости в данный момент времени по оси Оу
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
        Vyn2=(y_3-y_1)/(2.0*step); ///расчет скорости в данный момент времени по оси Ох
+
 
 
+
#include <iostream>
        x_1=x_2; ///присваивание значению координаты х_1 на (n-1) шаге значение координаты х_2 на n шаге
+
#include <math.h>
        x_2=x_3; ///присваивание значению координаты х_2 на (n) шаге значение координаты х_3 на (n+1) шаге
+
#include <iomanip>
        y_1=y_2; ///присваивание значению координаты у_1 на (n-1) шаге значение координаты у_2 на n шаге
+
#include <fstream>
        y_2=y_3; ///присваивание значению координаты у_2 на (n-1) шаге значение координаты у_3 на (n+1) шаге
+
#include <conio.h>
 +
#include <stdio.h>
 +
 
 +
 
 +
using namespace std;
 +
 
 +
double g = 9.8, Pi = 3.1415; // Задаем две глобальные переменные ускорения свободного падения и числа Pi
 +
 
 +
int WoutR(double alpha, double dt, double t, double Yo, double Vo) // Функция, записывающая в файл Throws Without Resistance.txt координаты тела, которое движется без сопротивления
 +
{
 +
     FILE *Coord;
 +
  Coord = fopen ("Throws Without Resistance.txt", "w");
 +
    double X = 0, Y = 0; // Координаты начала
 +
 
 +
    while ( Y >= Yo) // Yo используем для того, чтобы цикл прекратился тогда, когда тело упадет
 +
    {
 +
 
 +
      X =  Vo*t*cos(alpha);
 +
      Y =  Vo*t*sin(alpha) - (g*t*t)*0.5;
 +
      t+= dt;
 +
    if (Y > Yo )
 +
        fprintf(Coord, "%.3lf \t %.3lf\n", X, Y);
 +
    else
 +
        fprintf(Coord, "%.3lf \t %.3lf\n", X, 0.000); // Используем такой else для того, чтобы не получить отрицательную координату
 +
    }
 +
 
 +
}
 +
 
 +
int ExactForm(double alpha, double dt, double t, double Yo, double Vo, double R, double m) // Функция, записывающая в файл ExactForm.txt координаты тела, рассчитывающиеся по формлуе точного решения
 +
{                                                                                          // для линейной зависимости
 +
    FILE *Coord;
 +
  Coord = fopen ("ExactForm.txt", "w");
 +
    double X, Y = 0, Vx, Vy;
 +
 
 +
     while ( Y >= Yo) // Использование Yo аналогично использованию в прошлом пункте.
 +
    {
 +
 
 +
      X = ((m*Vx)/R) * (1 - exp(((-1)*R*t)/m));
 +
      Y = (m/R)*((Vy + (g*m)/R)*(1 - exp((-1)*R*t/m))) - (g*t*m)/R;
 +
      Vx = Vo*cos(alpha);
 +
      Vy = Vo*sin(alpha);
 +
      t+= dt;
 +
    if (Y > Yo )
 +
        fprintf(Coord, "%.3lf \t %.3lf\n", X, Y);
 +
    else
 +
        fprintf(Coord, "%.3lf \t %.3lf\n", X, 0.000); // используется аналогично прошлому пункту
 +
      }
 +
}
 +
 
 +
int VerleSq (double alpha, double dt, double t, double Yo, double Xo, double Vo, double R, double m) // Функция, записывающая в файл VerleSq.txt оординаты тела, рассчитывающиеся по формлуе Верле
 +
{                                                                                                    // для Квадратичной зависимости сопротивления от скорости
 +
    FILE *Coord;
 +
  Coord = fopen ("VerleSq.txt", "w");
 +
 
 +
    double X, Xnext, Xprev, Y, Ynext, Yprev, Vx, Vy, V, Yop, Xop; // X, Y - текущие координаты; Xnext, Ynext - координаты следующего шага; Xprev, Yprev - координаты предыдущего шага.
 +
                                                                  // Xop, Yop - вспомогательные координаты для (-1)-го шага
 +
 
 +
    Yop = Yo - Vo*sin(alpha)*dt; // Сторки 62-79 используются для просчитывания (-1)-го шага, так как в точке 0;0 у нас нету предыдущего шага
 +
    Xop = Xo - Vo*cos(alpha)*dt;
 +
    X = Xo;
 +
    Y = Yo;
 +
    Xnext = 2.0*X - Xop - (R/m)*Vo*Vo*cos(alpha)*(dt*dt);
 +
    Vx = (1.0/(2.0*dt))*(Xnext - Xop);
 +
    Ynext = 2.0*Y - Yop - (g +(R/m)*Vo*Vo*sin((alpha)))*(dt*dt);
 +
    Vy =  (1.0/(2.0*dt))*(Ynext - Yop);
 +
    V = sqrt((Vo*cos(alpha)*Vo*cos(alpha)) + (Vo*sin(alpha)*Vo*sin(alpha)));
 +
 
 +
    fprintf(Coord, "%.3lf \t %.3lf\n", X, Y); // Записываем первую координату в файл
 +
 
 +
    Xprev = X; // Меняем координаты местами. Так (n-1)-ый шаг становится n-ым шагом, n-ый шаг становится (n+1)-ым шагом. Далее аналогично
 +
    X = Xnext;
 +
    Yprev = Y;
 +
    Y = Ynext;
 +
 
 +
 
 +
    while (Y >= Yo) // После выполнения строк 62-79 получаем все необходимые данные для выполнения алгоритма.
 +
    {
 +
    Xnext = 2.0*X - Xprev - (R/m)*V*Vx*(dt*dt);
 +
    Vx = (1.0/(2.0*dt))*(Xnext - Xprev);
 +
    Ynext = 2.0*Y - Yprev - (g +(R/m)*V*Vy)*(dt*dt);
 +
    Vy =  (1.0/(2.0*dt))*(Ynext - Yprev);
 +
    V = sqrt((Vx*cos(alpha)*Vx*cos(alpha)) + (Vy*sin(alpha) - g*dt)*(Vy*sin(alpha) - g*dt));
 +
    if (Ynext > Yo )
 +
        fprintf(Coord, "%.3lf \t %.3lf\n", Xnext, Ynext);
 +
    else
 +
 
 +
      fprintf(Coord, "%.3lf \t %.3lf\n", X, 0.000);
 +
 
 +
    Xprev = X;
 +
    X = Xnext;
 +
    Yprev = Y;
 +
    Y = Ynext;
 +
    }
 +
 
 +
}
 +
int VerleL (double alpha, double dt, double t, double Yo, double Xo, double Vo, double R, double m) // Функция, записывающая в файл VerleL.txt оординаты тела, рассчитывающиеся по формлуе Верле
 +
{                                                                                                  // для линейной зависимости сопротивления от скорости
 +
    FILE *Coord;
 +
  Coord = fopen ("VerleL.txt", "w");
 +
 
 +
    double X, Xnext, Xprev, Y, Ynext, Yprev, Vx, Vy, V,Yop, Xop; // Комментарии аналогичны переменным и формулам в VtrleSq
 +
 
 +
    Yop = Yo - Vo*sin(alpha)*dt;
 +
    Xop = Xo - Vo*cos(alpha)*dt;
 +
    X = Xo;
 +
    Y = Yo;
 +
    Xnext = 2.0*X - Xop - (R/m)*Vo*Vo*cos(alpha)*(dt*dt);
 +
    Vx = (1.0/(2.0*dt))*(Xnext - Xop);
 +
    Ynext = 2.0*Y - Yop - (g +(R/m)*Vo*Vo*sin((alpha)))*(dt*dt);
 +
    Vy =  (1.0/(2.0*dt))*(Ynext - Yop);
 +
    V = sqrt((Vo*cos(alpha)*Vo*cos(alpha)) + (Vo*sin(alpha)*Vo*sin(alpha)));
 +
 
 +
    fprintf(Coord, "%.3lf \t %.3lf\n", X, Y);
 +
 
 +
    Xprev = X;
 +
    X = Xnext;
 +
    Yprev = Y;
 +
    Y = Ynext;
 +
 
 +
 
 +
    while (Y >= Yo)
 +
    {
 +
    Xnext = 2.0*X - Xprev - (R/m)*Vx*(dt*dt);
 +
    Vx = (1.0/(2.0*dt))*(Xnext - Xprev);
 +
    Ynext = 2.0*Y - Yprev - (g +(R/m)*Vy)*(dt*dt);
 +
    Vy =  (1.0/(2.0*dt))*(Ynext - Yprev);
 +
  if (Ynext > Yo )
 +
        fprintf(Coord, "%.3lf \t %.3lf\n", Xnext, Ynext);
 +
    else
 +
      fprintf(Coord, "%.3lf \t %.3lf\n", Xnext, 0.000);
 +
 
 +
    Xprev = X;
 +
    X = Xnext;
 +
    Yprev = Y;
 +
    Y = Ynext;
 +
    }
 +
 
 +
}
 +
 
 +
int main()
 +
{
 +
  double alpha, Vo, dt, R, m , t = 0, Yo = 0, Xo = 0; // Объявляем переменные: alpha - угол броска; Vo - начальная скорость; dt - шаг по времени; R- коэф. сопротивления; m- масса тела;
 +
                                                      // t = 0 - начало отсчета времени с 0; Yo = 0, Xo = 0 - координаты начала
 +
  int i = 0; // переменная для оператора switch
 +
 
 +
  cout << "Enter start speed:\n";
 +
  cin >> Vo; // Вводим с клавиатуры начальную скорость
 +
  cout << "Enter angle in grades ( from 0 to 180 ):\n";
 +
  cin >> alpha; // Вводим с клавиатуры угол броска в градусах
 +
  alpha = alpha*Pi / 180; // переводим угол броска из градусов в радианы
 +
  cout << "Enter mass:\n";
 +
  cin >> m; // Вводим с клавиатуры массу
 +
  cout << "Enter precision:\n";
 +
  cin >> dt; // Вводим с клавиатуры шаг по времени
 +
  cout << "Enter resistance:\n";
 +
  cin >> R; // Вводим сопротивление воздуха
 +
  cout << "Press 1 to draw graph without resistance\n\n"
 +
          "Press 2 to draw graph in Exact form\n\n"
 +
          "Press 3 to draw graph in VerleSq form\n\n"
 +
          "Press 4 to draw graph in VerleL form\n\n"
 +
          "Press 5 to draw all graphs at the same time\n\n"
 +
          "Press 0 to quit\n\n";
 +
  cin >> i;
 +
  cout << "\nPress any button\n";
 +
 
 +
 
 +
    FILE *Gnu;
 +
    Gnu = fopen ("Throws.gp", "w"); // Создаем файл формата gp, который будем открывать программой gnuplot для того, чтобы построить наш график/ки по точкам
 +
 
 +
switch ( i )
 +
{
 +
case 1:
 +
    {
 +
    WoutR(alpha,dt,t,Yo,Vo);
 +
    fprintf(Gnu, "plot \"Throws Without Resistance.txt\" using 1:2 w l");
 +
    break;
 +
    }
 +
case 2:
 +
    {
 +
    ExactForm(alpha,dt,t,Yo,Vo,R,m);
 +
    fprintf(Gnu, "plot \"ExactForm.txt\" using 1:2 w l");
 +
    break;
 +
    }
 +
case 3:
 +
    {
 +
    VerleSq(alpha,dt,t,Yo,Xo,Vo,R, m);
 +
    fprintf(Gnu, "plot \"VerleSq.txt\" using 1:2 w l");
 +
    break;
 +
    }
 +
case 4:
 +
    {
 +
    VerleL(alpha,dt,t,Yo,Xo,Vo,R, m);
 +
    fprintf(Gnu, "plot \"VerleL.txt\" using 1:2 w l");
 +
    break;
 +
    }
 +
case 5:
 +
    {
 +
  WoutR(alpha,dt,t,Yo,Vo);
 +
  ExactForm(alpha,dt,t,Yo,Vo,R,m);
 +
  VerleSq(alpha,dt,t,Yo,Xo,Vo,R, m);
 +
  VerleL(alpha,dt,t,Yo,Xo,Vo,R, m);
 +
  fprintf(Gnu, "plot \"Throws Without Resistance.txt\" using 1:2 w l, \"ExactForm.txt\" using 1:2 w l, \"VerleSq.txt\" using 1:2 w l, \"VerleL.txt\" using 1:2 w l"); // записываем в Throws.gp названия четырех файлов
 +
  break;
 +
    }                                                  // с координатами таким образом, чтобы программа gnuplot смогла их увидеть и прочесть
 +
case 0:
 +
    break;
 +
default:
 +
    break;
 +
}
 +
    return 0;
 +
}
 +
 
 +
</syntaxhighlight>
 +
</div>
 +
 
 +
'''[[Гильманов Илья]]'''
 +
 
 +
'''Описание программы''': программа состоит из четырех независимых друг от друга частей:
 +
#  Полет тела без сопротивления воздуха;
 +
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются точным методом;
 +
#  Полет тела при линейной зависимости силы сопротивления воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
 +
#  Полет тела при квадратичной зависимости силы сопротивлении воздуха от скорости, при котором координаты тела рассчитываются методом Верле;
  
        out3 << x_3 << "  " << y_3 <<'\n'; ///вывод на экран всех значений координат по оси Ох и по оси Оу для 2го варианта метода Верле
+
Скачать можно [[http://mech.spbstu.ru/File:Qwertyui.rar тут]]
 
 
    }
 
    out3.close();
 
 
 
    cout << '\n' << "All results are saved in files." << endl; ///вывод на экран сообщения о записи в файл всех результатов
 
    cout << '\n' << "The program is finished." << endl; ///вывод на экран сообщения о завершении работы программы
 
    return 0;
 
}
 
</syntaxhighlight>
 
</div>
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''[[Уманский Александр]]'''
 
 
 
'''Описание программы''': программа записывает в четыре файла результаты вычисления:
 
# Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
 
# Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
 
# Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
 
# Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
 
 
 
<div class="mw-collapsible-content">
 
 
 
[[File:Methods.rar|Скачать архив]]
 
 
 
[[File:1.png]]
 
 
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
 
 
</syntaxhighlight>
 
</div>
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)