Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовые / 1 / RADAR2 / Unit1

.cpp
Скачиваний:
18
Добавлен:
17.04.2013
Размер:
15.82 Кб
Скачать
//---------------------------------------------------------------------------

#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