Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
// --- Инициализация начальных параметров ---
int MouseX,MouseY;
int WaitForTake1C,WaitForLand1C,WaitForTake2C,WaitForLand2C;
int dfi=1;
int r=100;
int centerx=150;int centery=150;
float fi=0;
int RoundSpeed=10;
int Ftox=centerx-r/2;int Ftoy=centery-r;
int Flx=centerx+r/2;int Fly=centery+r;
int FFound,FFoundx,FFoundy;
float Fx=Ftox;float Fy=Ftoy;
float FSx,FSy;
int Show1=0;int OnAir1=0;
int Stox=centerx-r/2;int Stoy=centery-r;
int Slx=centerx+r;int Sly=centery+r;
int SFound,SFoundx,SFoundy;
float Sx=Stox;float Sy=Stoy;
float SSx,SSy;
int Show2=0;int OnAir2=0;
float Speed=0.2;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//---Обработка выхода через меню ---
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
//---Процедура определения расстояния между 2 точками ---
float Rng(int x1,int y1,int x2,int y2)
{
return(sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
}
//---------------------------------------------------------------------------
//--- 2 процедуры, изменяющие параметры при посадке самолета ---
void FirstLand(void)
{
OnAir1=FSx=FSy=0;
Fx=Ftox;Fy=Ftoy;
Form1->TakeOff1->Enabled=true;
Form1->Landing1->Enabled=true;
Form1->Edit1->Text="Приземлился";
}
//--- вот вторая
void SecondLand(void)
{
OnAir2=SSx=SSy=0;
Sx=Stox;Sy=Stoy;
Form1->TakeOff2->Enabled=true;
Form1->Landing2->Enabled=true;
Form1->Edit2->Text="Приземлился";
}
//---------------------------------------------------------------------------
//--- Процедура перерисовки следов самолетов ---
void DrawAir( void)
{
//Form1->Canvas->Pen->Color=clSilver;
//Form1->Canvas->Brush->Color=clSilver;
//Form1->Canvas->Ellipse(centerx-(r/2)+1,centery-(r/2)+1,centerx+(r/2)-1,centery+(r/2)-1);
//Form1->Canvas->Pen->Color=clLime;
//Form1->Canvas->Ellipse(centerx-(r+1),centery-(r+1),centerx+(r+1),centery+(r+1));
if (FFound>0) // если первый самолет был замечен
{
int col=clBlue; // то рисуем разноцветные пятна
if (FFound<150) col=clFuchsia;
if (FFound<100) col=clLime;
if (FFound<50) col=clNavy;
if (FFound==1) col=clSilver;
Form1->Canvas->Pen->Color=col;
Form1->Canvas->Brush->Color=col;
Form1->Canvas->Ellipse(FFoundx-3,FFoundy-3,FFoundx+3,FFoundy+3);
FFound--;
}
// проверка условия наведения локатора на самолет и его
// достижимости для обнаружения
if ((OnAir1==1)&&( Rng(Fx,Fy,centerx,centery)<r)&&( Rng
(Fx,Fy,centerx,centery)>(r/2))&&
(fi==(int)(180/M_PI*alpha(centerx,centery,Fx,Fy))))
{
FFound=200; // изменяем параметры при обнаружении
FFoundx=Fx;FFoundy=Fy;
Form1->Canvas->Pen->Color=clBlue;
Form1->Canvas->Brush->Color=clBlue;
Form1->Canvas->Ellipse(Fx-3,Fy-3,Fx+3,Fy+3);
}
// проверяем, не прилетел ли уже 1-й домой
if (Rng(Flx,Fly,Fx,Fy)<2) FirstLand();
Fx+=(FSx/4);Fy+=(FSy/4); // Перемещаем самолетик номер 1
// Тут все то же самое со вторым проделываем
if (SFound>0)
{
int col=clBlue;
if (SFound<150) col=clFuchsia;
if (SFound<100) col=clLime;
if (SFound<50) col=clNavy;
if (SFound==1) col=clSilver;
Form1->Canvas->Pen->Color=col;
Form1->Canvas->Brush->Color=col;
Form1->Canvas->Ellipse(SFoundx-3,SFoundy-3,SFoundx+3,SFoundy+3);
SFound--;
}
if ((OnAir2==1)&&( Rng(Sx,Sy,centerx,centery)<r)&&
( Rng(Sx,Sy,centerx,centery)>(r/2))&&
(fi==(int)(180/M_PI*alpha(centerx,centery,Sx,Sy))))
{
SFound=200;
SFoundx=Sx;SFoundy=Sy;
Form1->Canvas->Pen->Color=clBlue;
Form1->Canvas->Brush->Color=clBlue;
Form1->Canvas->Ellipse(Sx-3,Sy-3,Sx+3,Sy+3);
}
if (Rng(Slx,Sly,Sx,Sy)<2) SecondLand();
Sx+=(SSx/3);Sy+=(SSy/3);
}
//---------------------------------------------------------------------------
//--- процедура перерисовывает экран локатора : след развертки
//--- и, возможно, точки приземления / посадки самолетов
void Redraw()
{
for (float i=0; i<200;i++) // это - след развертки
{
Form1->Canvas->Pen->Color=clSilver-i/2;
Form1->Canvas->MoveTo
(centerx+r*cos(M_PI*(fi-100+i/2)/180)/2,centery+r*sin(M_PI*(fi-100+i/2)/180)/2);
Form1->Canvas->LineTo
(centerx+r*cos(M_PI*(fi-100+i/2)/180),centery+r*sin(M_PI*(fi-100+i/2)/180));
Form1->Canvas->Pen->Color=clBlack;
// Form1->Canvas->MoveTo(centerx,centery);
// Form1->Canvas->Ellipse(centerx-(r/2)+2,centery-(r/2)+2,centerx+(r/2)-2,
// centery+(r/2)-2);
Form1->Canvas->MoveTo(centerx,centery);
Form1->Canvas->LineTo(centerx,centery-r-10);
Form1->Canvas->Pen->Color=clBlack;
Form1->Canvas->MoveTo(centerx,centery);
Form1->Canvas->LineTo(centerx,centery+r+10);
Form1->Canvas->Pen->Color=clBlack;
Form1->Canvas->MoveTo(centerx,centery);
Form1->Canvas->LineTo(centerx+r+10,centery);
Form1->Canvas->Pen->Color=clBlack;
Form1->Canvas->MoveTo(centerx,centery);
Form1->Canvas->LineTo(centerx-r-10,centery);
Form1->Canvas->MoveTo(centerx,centery+(r/2)-2);
Form1->Canvas->LineTo(centerx+10,centery+(r/2)-2);
Form1->Canvas->MoveTo(centerx,centery+(r/2)-2);
Form1->Canvas->LineTo(centerx-10,centery+(r/2)-2);
Form1->Canvas->MoveTo(centerx,centery-(r/2)+2);
Form1->Canvas->LineTo(centerx+10,centery-(r/2)+2);
Form1->Canvas->MoveTo(centerx,centery-(r/2)+2);
Form1->Canvas->LineTo(centerx-10,centery-(r/2)+2);
Form1->Canvas->MoveTo(centerx+(r/2)-2,centery);
Form1->Canvas->LineTo(centerx+(r/2)-2,centery+10);
Form1->Canvas->MoveTo(centerx+(r/2)-2,centery);
Form1->Canvas->LineTo(centerx+(r/2)-2,centery-10);
Form1->Canvas->MoveTo(centerx-(r/2)+2,centery);
Form1->Canvas->LineTo(centerx-(r/2)+2,centery+10);
Form1->Canvas->MoveTo(centerx-(r/2)+2,centery);
Form1->Canvas->LineTo(centerx-(r/2)+2,centery-10);
Form1->Canvas->MoveTo(centerx,centery+r);
Form1->Canvas->LineTo(centerx+10,centery+r);
Form1->Canvas->MoveTo(centerx,centery+r);
Form1->Canvas->LineTo(centerx-10,centery+r);
Form1->Canvas->MoveTo(centerx,centery-r);
Form1->Canvas->LineTo(centerx+10,centery-r);
Form1->Canvas->MoveTo(centerx,centery-r);
Form1->Canvas->LineTo(centerx-10,centery-r);
Form1->Canvas->MoveTo(centerx+r,centery);
Form1->Canvas->LineTo(centerx+r,centery+10);
Form1->Canvas->MoveTo(centerx+r,centery);
Form1->Canvas->LineTo(centerx+r,centery-10);
Form1->Canvas->MoveTo(centerx-r,centery);
Form1->Canvas->LineTo(centerx-r,centery+10);
Form1->Canvas->MoveTo(centerx-r,centery);
Form1->Canvas->LineTo(centerx-r,centery-10);
}
if (Show1==1) // нужно ли показывать точки 1 самолета?
{
Form1->Canvas->Pen->Color=clBlack;
Form1->Canvas->MoveTo(Ftox,Ftoy);
Form1->Canvas->LineTo(Flx,Fly);
Form1->Canvas->Pen->Color=clBlack; // если да - то вперед
Form1->Canvas->Brush->Color=clBlack;
Form1->Canvas->Ellipse(Ftox-1,Ftoy-1,Ftox+1,Ftoy+1);
Form1->Canvas->Ellipse(Flx-1,Fly-1,Flx+1,Fly+1);
}
if (Show2==1) // аналогично со вторым
{
Form1->Canvas->Pen->Color=clBlack;
Form1->Canvas->MoveTo(Stox,Stoy);
Form1->Canvas->LineTo(Slx,Sly);
Form1->Canvas->Pen->Color=clBlack;
Form1->Canvas->Brush->Color=clBlack;
Form1->Canvas->Ellipse(Stox-1,Stoy-1,Stox+1,Stoy+1);
Form1->Canvas->Ellipse(Slx-1,Sly-1,Slx+1,Sly+1);
}
}
//---------------------------------------------------------------------------
//--- выход по нажатию кнопки на Форме
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Exit1Click(Sender);
}
//--- обработчик таймера
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// Возможное изменение скорости развертки
Timer1->Interval=1000/(RoundSpeed*RoundSpeed*RoundSpeed);
fi+=dfi;;if (fi==360) fi=0; // Бегаем по углу от 0 до 360 град.
Redraw();// рисуем область локатора
DrawAir();// а теперь - самолетики
}
//--- Процедура начального закрашивания(при запуске приложения)
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Canvas->Brush->Color=clSilver;
Canvas->Pen->Color=clSilver;
// это и есть зеленый квадратик
Canvas->Rectangle(centerx-r-5,centery-r-5,centerx+r+5,centerx+r+5);
// а здесь записываем скорость развертки в соответствующее место
Label2->Caption=RoundSpeed;
}
//---------------------------------------------------------------------------
// изменение скорости развертки щелчком по стрелке вниз
void __fastcall TForm1::CSpinButton1DownClick(TObject *Sender)
{
if (RoundSpeed>1) RoundSpeed--;
Form1->Label2->Caption=RoundSpeed;
}
//---------------------------------------------------------------------------
// а теперь вверх
void __fastcall TForm1::CSpinButton1UpClick(TObject *Sender)
{
if (RoundSpeed<10) RoundSpeed++;
Form1->Label2->Caption=RoundSpeed;
}
//---------------------------------------------------------------------------
// нажали паузу в меню (или отжали)
void __fastcall TForm1::Fileitem11Click(TObject *Sender)
{
if (Timer1->Interval!=0) Timer1->Interval=0;
else Timer1->Interval=1000/(RoundSpeed*RoundSpeed*RoundSpeed);
}
//---------------------------------------------------------------------------
// нажали на изменение точки взлета 1го самолета
void __fastcall TForm1::TakeOff1Click(TObject *Sender)
{
Label3->Caption="Двойное нажатие на поле поставит точку взлёта 1-го самолёта";
WaitForTake1C=1;//сменили параметры - ожидаем указания точки
WaitForLand1C=0;
WaitForTake2C=0;
WaitForLand2C=0;
}
//---------------------------------------------------------------------------
// обрабатываем двойной щелчок при указании всяких точек
void __fastcall TForm1::FormDblClick(TObject *Sender)
{
// мышка внутри зеленого квадрата
if (MouseX<centerx+r) if (MouseX>centerx-r) if (MouseY<centery+r)
if (MouseY>centery-r)
if (WaitForTake1C==1) // если ждем 2щлк к точке взлета 1-го
{
Ftox=MouseX; Ftoy=MouseY;WaitForTake1C=0;
Label3->Caption="Точка взлёта 1-го самолёта установлена";
}
else
if (WaitForTake2C==1) //2-го
{
Stox=MouseX; Stoy=MouseY;WaitForTake2C=0;
Label3->Caption="Точка взлёта 2-го самолёта установлена";
}
else
if (WaitForLand1C==1) //к посадке 1-го
{
Flx=MouseX; Fly=MouseY;WaitForLand1C=0;
Label3->Caption="Точка посадки 1-го самолёта установлена";
}
else
if (WaitForLand2C==1) //2-го
{
Slx=MouseX; Sly=MouseY;WaitForLand2C=0;
Label3->Caption="Точка посадки 2-го самолёта установлена";
}
}
//---------------------------------------------------------------------------
// Кто там двигает мышку?
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
MouseX=X;MouseY=Y;// записываем новые координаты
}
//---------------------------------------------------------------------------
// хотят изменить точку взлета 2-го
void __fastcall TForm1::TakeOff2Click(TObject *Sender)
{
Label3->Caption="Двойное нажатие на поле поставит точку взлёта 2-го самолёта";
WaitForTake2C=1;
WaitForTake1C=0;
WaitForLand1C=0;
WaitForLand2C=0;
}
//---------------------------------------------------------------------------
// изменяют точку посадки 1-го
void __fastcall TForm1::Landing1Click(TObject *Sender)
{
Label3->Caption="Двойное нажатие на поле поставит точку посадки 1-го самолёта";
WaitForLand1C=1;
WaitForTake1C=0;
WaitForTake2C=0;
WaitForLand2C=0;
}
//---------------------------------------------------------------------------
// а теперь 2-го
void __fastcall TForm1::Landing2Click(TObject *Sender)
{
Label3->Caption="Двойное нажатие на поле поставит точку посадки 2-го самолёта";
WaitForLand2C=1;
WaitForTake1C=0;
WaitForLand1C=0;
WaitForTake2C=0;
}
//---------------------------------------------------------------------------
// если попросили не показывать точки взлета/посадки
void Unshow ( int x)
{
if (x==1)
{
Form1->Canvas->Pen->Color=clSilver;
Form1->Canvas->MoveTo(Ftox,Ftoy);
Form1->Canvas->LineTo(Flx,Fly);
Form1->Canvas->Pen->Color=clSilver;
Form1->Canvas->Brush->Color=clSilver;//то рисуем их зеленым
Form1->Canvas->Ellipse(Ftox-1,Ftoy-1,Ftox+1,Ftoy+1);
Form1->Canvas->Ellipse(Flx-1,Fly-1,Flx+1,Fly+1);
}
// то же со 2-м самолетом
else {
Form1->Canvas->Pen->Color=clSilver;
Form1->Canvas->MoveTo(Stox,Stoy);
Form1->Canvas->LineTo(Slx,Sly);
Form1->Canvas->Pen->Color=clSilver;
Form1->Canvas->Brush->Color=clSilver;
Form1->Canvas->Ellipse(Stox-1,Stoy-1,Stox+1,Stoy+1);
Form1->Canvas->Ellipse(Slx-1,Sly-1,Slx+1,Sly+1);
}
}
//---------------------------------------------------------------------------
// выбрали в меню показывать точку взлета/посадки 1-го
void __fastcall TForm1::ShowTOPoint1Click(TObject *Sender)
{
Show1=1;
}
//---------------------------------------------------------------------------
// тут - не показывать
void __fastcall TForm1::HidePoints1Click(TObject *Sender)
{
Show1=0; // больше не показываем
Unshow(1); // и старые сотрем
}
//---------------------------------------------------------------------------
// покажите точки 2-го
void __fastcall TForm1::ShowTOPoint2Click(TObject *Sender)
{
Show2=1;
}
//---------------------------------------------------------------------------
// спрячьте точки 2-го
void __fastcall TForm1::HidePoints2Click(TObject *Sender)
{
Show2=0;
Unshow(2);
}
//---------------------------------------------------------------------------
// нажали на взлет 1-го самолета
void __fastcall TForm1::Button2Click(TObject *Sender)
{
OnAir1=1; // самолет полетел
TakeOff1->Enabled=false; // это чтобы летящий самолет не просили
Landing1->Enabled=false; // лететь в другое место
Fx=Ftox;Fy=Ftoy; // откуда летим?
FSx=Speed*cos(alpha(Ftox,Ftoy,Flx,Fly));// в какую сторону
FSy=Speed*sin(alpha(Ftox,Ftoy,Flx,Fly));
Edit1->Text="В воздухе";
}
//---------------------------------------------------------------------------
// нажали на взлет 2-го
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//тут все как и с первым
OnAir2=1;
TakeOff2->Enabled=false;
Landing2->Enabled=false;
Sx=Stox;Sy=Stoy;
SSx=Speed*cos(alpha(Stox,Stoy,Slx,Sly));
SSy=Speed*sin(alpha(Stox,Stoy,Slx,Sly));
Edit2->Text="В воздухе";
}
//---------------------------------------------------------------------------
Соседние файлы в папке RADAR2