Решение данной задачи позволяет полностью охватить все возможные курсы полета самолета и его начальные положения путем изменения исходных данных.
БЦВМ-алгоритм конструирования траектории выхода на предпочтительный курс атаки (веер курсов)
Расчеты были произведены в программе, написанной на языке С/С++ в среде разработки VisualStudio 2010;
Представим код программы для каждого блока алгоритма:
1:
Vs = 250;
Xs = 20000;
Zs = 15000;
n = 2.5;
gamma = 30*Pi/180;
Dv = 5000;
2: //Вводим координаты цели и угол захода на нее
doubleXc = 15000;
doubleZc = 15000;
doublealph = 30;
//Строим систему координат, начало которой совпадает с положением цели, а угол захода с осью X
void DrawSK2 (double x0, double z0, double angle)
{
while (angle >= 2*Pi) angle -= 2*Pi;
doubleNew_Top_Z, New_Down_Z;
doubleNew_Left_X, New_Right_X;
x0 = MashtabX(x0);
z0 = MashtabZ(z0);
New_Top_Z = z0+tan(angle)*(Left_X-x0);
New_Down_Z = z0+tan(angle)*(Right_X-x0);
New_Left_X = x0+tan(angle)*(z0-Down_Z);
New_Right_X = x0+tan(angle)*(z0-Top_Z);
SelectObject(hdc, Brush_bl);
Ellipse (hdc, x0-4, z0-4, x0+4, z0+4);
if (angle == 90*Pi/180)
{
MoveToEx(hdc, x0 ,Top_Z, NULL );
LineTo(hdc, x0, Down_Z);
MoveToEx(hdc, Left_X ,z0, NULL );
LineTo(hdc, Right_X, z0);
}
elseif (angle == 270*Pi/180)
{
MoveToEx(hdc, x0 ,Down_Z, NULL );
LineTo(hdc, x0, Top_Z);
MoveToEx(hdc, Right_X ,z0, NULL );
LineTo(hdc, Left_X, z0);
}
else
{
MoveToEx(hdc, Left_X , New_Top_Z, NULL );
LineTo(hdc, Right_X, New_Down_Z );
MoveToEx(hdc, New_Left_X ,Down_Z, NULL );
LineTo(hdc, New_Right_X , Top_Z);
}
3:
//минимальный радиус разворота
R = Vs*Vs / (g*n);
// расчет положения начальной окружность разворота
R1= R;
Xr1= Xs - R1*sin(gamma);
Zr1= Zs - R1*cos(gamma);
// расчет положения финальной окружность разворота
R2= R;
Xr2= Dv;
Zr2= R2;
4:
// функция находит точки касания к двум окружностям
void Tangent (double Xr1, double Zr1, double R1, double Xr2, double Zr2,double R2, double *Xk1, double *Zk1, double *Xk2, double*Zk2, double *angle)
{
double alpha1 = asin ( (R1-R2)/ sqrt ( (Zr2-Zr1)*(Zr2-Zr1)+(Xr2-Xr1)*(Xr2-Xr1) ) );
double alpha2 = atan ( (Zr2-Zr1)/(Xr2-Xr1) );
double alpha = alpha1 + alpha2;
*Xk1 = Xr1 + R1 * sin (alpha);
*Zk1 = Zr1 - R1 * cos (alpha);
*Xk2 = Xr2 + R2 * sin (alpha);
*Zk2 = Zr2 - R2 * cos (alpha);
*angle = atan( (*Zk2-*Zk1) / (*Xk2-*Xk1) );
}
// поиск точек (Х2,Z2) и (Х3,Z3);
Tangent (Xr1, Zr1, R1, Xr2, Zr2, R2, &Xk1, &Zk1, &Xk2, &Zk2,&angle);
5,6,7:
//поиск точек (Х2,Z2) и (Х3,Z3);
Tangent (Xr2, Zr2, R2, Xzu, Zzu, Rzu, &Xk1, &Zk1, &Xk2, &Zk2,&angle);
// Точка пересечения касательной и линии траектории движения самолета
CrossPoint (Xk1, Zk1, Xk2, Zk2, Xs,Zs,Xs+3000*cos(gamma),Zs-3000*sin(gamma),&Xcr,&Zcr);
//поиск точек (Х4,Z4) и (Х5,Z5);
psi = angle;
Xr1= Xcr - R1 * sin( Pi/2 + gamma/2 - psi/2 ) / sin( psi/2 + gamma/2 );
Zr1= Zcr - R1 * cos( Pi/2 + gamma/2 - psi/2 ) / sin( psi/2 + gamma/2 );
X4 = Xcr - R * sin (Pi/2 - psi) / tan ( psi/2 + gamma/2 );
Z4 = Zcr - R * cos (Pi/2 - psi) / tan ( psi/2 + gamma/2 );
X5 = Xcr - R * cos (gamma) / tan ( psi/2 + gamma/2 );
Z5 = Zcr + R * sin (gamma) / tan ( psi/2 + gamma/2 );
Результат работы программы для случаев, когда координаты цели и угол захода на нее не совпадают с «нулевыми» (вводи связанную систему координат):
1)
2)
3)
Результат работы программы для случаев, когда координаты цели и угол захода на нее совпадают с «нулевыми» (связанная система координат не вводится):
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.