Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Пишем симулятор летательного аппарата


Информационный Канал Subscribe.Ru


Пишем симулятор летательного аппарата

/* Выпуск 3 */

 

Двигатели, часть 2

Здравствуйте, уважаемые подписчики.

Итак, сегодня мы создадим двигатель "в железе" (в нашем случае в софте :). Поскольку мы пишем на С++, неплохо было бы прикинуть, хотя бы упрощенно, иерархию классов.

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

Для удобства, конструкцию нашего летательного аппарата сделаем модульной, т.е. некоторые ее части можно будет отстыковать. К таким, как раз и будут относиться вышеперечисленные. Итак, у нас получается следующая иерархия:

SLinkupObject
 |
 +- STank
 |
 +- SEngine

Кроме того, просто для удобства введем класс, в котором будем хранить все физические постоянные и табличные данные.

Ниже приводятся интерфейсы этих классов. Полностью скачать их можно будет здесь.

class SConstants //Константы и табличные значения
{
public:
SConstants();
virtual ~SConstants();
double G; //Гравитационная постоянная
double g; //Ускорение свободного падения у поверхности Земли
double MMoon; //Масса Луны
double RMoon; //Радиус Луны
};

Инициализация констант происходит в конструкторе.

class SLinkupObject //Класс пристыковываемого объекта
{
public:
SLinkupObject();
virtual ~SLinkupObject();
double Mass; //Масса объекта
};

Придерживаясь объектно-ориентированного подхода, мы, тем не менее, позволим себе некоторые вольности при обращении с переменными класса, иначе просто рискуем утотнуть в бесконечных "Get" и "Set".

class STank : public SLinkupObject //Класс топливного бака
{
double MaxCapacity; //Емкость бака
double CurrentSpare; //Текущая масса топлива
public:
void SetMaxCapacity(double maxCap); //Установка объема бака
double GetCurrentSpare(); //Получение текущей массы топлива
double Consuption (double mass); //Расход топлива
int Unset(); //Сброс топлива
int LeadingIn(double mass); //Заправка
STank();//Конструкторы
STank(double maxCap);
virtual ~STank();
};

Класс двигателя будет управлять классом бака, в том, что касается расхода топлива, а тот, в свою очередь, в случае нехватки последнего, будет информировать об этом управляющий класс.

class SEngine : public SLinkupObject //Класс двигателя
{
STank *pTank; //Указатель на бак
double GazesVelocity; //Скорость истечения газов
double Impulse; //Удельный импульс
double MaxF; //Максимальная тяга
public:
void SetMaxF(double maxF); //Установка максимальной тяги
void SetImpulse (double imp); //Установка удельного импульса
int SetTank(STank *pTank); //подключение топливного бака
double WorkOneSecond(double percent, double coeff = 1); //Работать 1 сек.* coeff
//возвр - тяга Н
SEngine();
virtual ~SEngine();
};

Особое внимание прошу обратить на функцию WorkOneSecond. В ней и заключена основная математика работы двигателя. На ее вход подается доля требуемой мощности, а также параметр, именуемый coeff, который определяет время итерации, за которое ведется расчет. По умолчанию это - 1 секунда. Расход топлива из бака происходит автоматически. Если топлива не хватает, то расчет производится исходя из имеющегося его количества.

В следующем выпуске мы установим двигатель и бак на платформу и проведем летные испытания на вертикали.

С уважением, Alex A. flysim@yandex.ru

 

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное