Листинг программного продукта с комментариями
⇐ ПредыдущаяСтр 3 из 3
. Unit_handler.h //--------------------------------------------------------------------------- #ifndef Unit_handlerH #define Unit_handlerH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include "CSPIN.h" #include <ExtCtrls.hpp> #include "CGAUGES.h" //---------------------------------------------------------------------------TForm1: public TForm { __published:// IDE-managed Components*Label1;*CSpinEdit1;*Label2;*CSpinEdit2;*CSpinEdit3;*Label3;*Label4;*Edit1;*Label5;*Memo1;*Label6;*Label8;*Label9;*Label10;*CSpinEdit5;*CSpinEdit6;*Label11;*Label12;*Label13;*Label15;*Label16;*Button1;*Label7;*Label14;*CSpinEdit4;*Image1;*Label17;*CGauge1;*Label18;*CSpinEdit7;*Label19;__fastcall Button1Click(TObject *Sender);__fastcall Edit1KeyPress(TObject *Sender, char &Key);__fastcall recalc (void);__fastcall barrier (int link);__fastcall paint (void);:// User declarations:// User declarations __fastcall TForm1(TComponent* Owner); }; //---------------------------------------------------------------------------PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif . Unit_handler.cpp //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit_handler.h" #include <math.h> #include <stdio.h> #include <conio.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "CSPIN" #pragma link "CGAUGES" #pragma resource "*.dfm" #define Ei 25.0 #define M 2 #define PI 3.1415936535897932384626433832795 // определяем сложное препятствие #define Ex -40 #define Ey 30 #define Fx -40 #define Fy 130 #define Gx -20 #define Gy 130 #define Hx 20 #define Hy 130 #define Kx 40 #define Ky 130 #define Lx 40 #define Ly 30 #define Px 20 #define Py 30 #define Rx 20 #define Ry 70 // определяем простое препятствие #define N1x -60 #define N1y -1 #define N2x 60 #define N2y -1 #define N3x -60 #define N3y -10 #define N4x 60 #define N4y -10n; /* количество звеньев */corner[100]={0}; /* углы звеньев манипулятора */link_x[100]={0}, link_y[100]={0}; /* координаты вершин манипулятора */number = 0; /* количество нвайденных ситуаций */x,y; /* координаты объекта */ /* линии, составляющие препятствие */lines[12][5]= {{N1x,N1y,N2x,N2y,1}, {N2x,N2y,N3x,N3y,0}, {N3x,N3y,N4x,N4y,1}, {N4x,N4y,N1x,N1y,0}, {Ex,Gy,Lx,Gy,1}, {Lx,Gy,Lx,Ly,0}, {Lx,Ly,Hx,Ly,1}, {Hx,Ly,Rx,Ry,0},
{Rx,Ry,Gx,Ry,1}, {Gx,Ry,Gx,Ey,0}, {Gx,Ey,Ex,Ey,1}, {Ex,Ey,Ex,Gy,0}};*Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- /* перерасчет координат звеньев */__fastcall TForm1::recalc (void) { int i, j;sum_e_cos[100]={0.0}, sum_e_sin[100]={0.0};sum_corner=0.0;buf[256];(i=0; i<n; i++) {_corner = 0.0;(j=0; j<=i; j++) {sum_corner += corner[j];_e_cos[i] = Ei*cos(sum_corner*(PI/180.0));_e_sin[i] = Ei*sin(sum_corner*(PI/180.0));(buf,"%.3f",sum_e_cos[i]);(buf,"%f", &(sum_e_cos[i]));(buf,"%.3f",sum_e_sin[i]);(buf,"%f", &(sum_e_sin[i])); }_x[i] = 0.0;_y[i] = 0.0;(j=0; j<=i; j++) {link_x[i] += sum_e_cos[j];_y[i] += sum_e_sin[j]; } } } //--------------------------------------------------------------------------- /* функция проверки попадания звена манипулятора в преграду */__fastcall TForm1::barrier (int link) {int status = 1, i;A1,B1,C1, A2,B2,C2, xx, yy;=link_y[link]-link_y[link+1];=link_x[link+1]-link_x[link];=link_x[link]*link_y[link+1]-link_x[link+1]*link_y[link];(i=0; i<12; i++) {A2=lines[i][1]-lines[i][3];=lines[i][2]-lines[i][0];=lines[i][0]*lines[i][3]-lines[i][2]*lines[i][1];(A1*B2-A2*B1 == 0.0 || B1 == 0.0 || B2 == 0.0) {status++; status--;} {= (C2*B1-C1*B2)/(A1*B2-A2*B1);= -((A1*xx+C1)/B1);= -((A2*xx+C2)/B2);((lines[i][4] == 0) && (xx == lines[i][0]) && ((yy >= lines[i][1] && yy <= lines[i][3]) || (yy >= lines[i][3] && yy <= lines[i][1])) && ((yy >= link_y[link] && yy <= link_y[link+1])|| (yy >= link_y[link+1] && yy <= link_y[link])) ) {status = 0;}((lines[i][4] == 1) && (yy == lines[i][1]) && ((xx >= lines[i][0] && xx <= lines[i][2]) || (xx >= lines[i][2] && xx <= lines[i][0])) && ((xx >= link_x[link] && xx <= link_x[link+1])|| (xx >= link_x[link+1] && xx <= link_x[link])) ) {status = 0;} } }status; } //--------------------------------------------------------------------------- /* прорисовка ситуации */__fastcall TForm1::paint (void) { int i, px,py;buf[256]; /* очистка холста для рисования */->Canvas->Brush->Color = clWhite;->Canvas->FillRect(Image1->Canvas->ClipRect); /* препятствия */->Canvas->Brush->Color = clGray;->Canvas->Pen->Color = clGray;->Canvas->Rectangle(N1x*M+320,240-N1y*M,N4x*M+320,240-N4y*M);->Canvas->Rectangle(Ex*M+320, 240-Gy*M, Gx*M+320, 240-Ey*M);->Canvas->Rectangle(Gx*M+320, 240-Gy*M, Rx*M+320, 240-Ry*M);->Canvas->Rectangle(Hx*M+320, 240-Hy*M, Lx*M+320, 240-Ly*M); /* оси постороения */->Canvas->Brush->Color = clBlack;->Canvas->Pen->Color = clBlack;->Canvas->MoveTo(0,240);->Canvas->LineTo(640,240);->Canvas->LineTo(630,238);->Canvas->LineTo(630,242);->Canvas->LineTo(640,240);->Canvas->MoveTo(320,480);->Canvas->LineTo(320,0);->Canvas->LineTo(318,10);->Canvas->LineTo(322,10);->Canvas->LineTo(320,0);
/* построение положений манипулятора */->Canvas->MoveTo(320,240);->Canvas->Brush->Color = clBlue;->Canvas->Pen->Color = clBlue;(i=0; i<n; i++) {=(int)(link_x[i]*M+320.0);=(int)(240.0-link_y[i]*M);->Canvas->LineTo(px,py); } /* рисуем объект для захвата */->Canvas->Brush->Color = clGreen;->Canvas->Pen->Color = clGreen;->Canvas->Ellipse(x*M+319,239-y*M,x*M+321,241-y*M);->Canvas->Ellipse(x*M+318,238-y*M,x*M+322,242-y*M); /* рисуем точки соединения звеньев */->Canvas->Brush->Color = clRed;->Canvas->Pen->Color = clRed;(i=0; i<n; i++) {=(int)(link_x[i]*M+320.0);=(int)(240.0-link_y[i]*M);->Canvas->Ellipse(px-1,py-1,px+1,py+1);->Canvas->Ellipse(px-2,py-2,px+2,py+2); } /* рисуем опорную точку манипулятора */->Canvas->Brush->Color = clYellow;->Canvas->Pen->Color = clYellow;->Canvas->Ellipse(319,239,321,241);->Canvas->Ellipse(318,238,322,242);->Canvas->Ellipse(317,237,323,243); /* подписываем график */++;->Canvas->Brush->Color = clWhite;->Canvas->Pen->Color = clBlack;(buf,"Ситуация №%d", number);->Canvas->TextOutA(15,10,buf);(i=0; i<n; i++) {(buf,"Corner %d: %d", i+1, corner[i]);->Canvas->TextOutA(2,18*(i+1)+10,buf); } /* прорисовка изменений */(CSpinEdit7->Value!= 0)(CSpinEdit7->Value);>ProcessMessages(); } //---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender) {prec; /* величина возм. отклонения */start,end; /* ограничение на обобщение коорд.*/i, j;status;done;*f;t1, t2, t3; /* определение начала расчетов */= Time(); /* очистка холста для рисования */->Canvas->Brush->Color = clWhite;->Canvas->FillRect(Image1->Canvas->ClipRect);>ProcessMessages(); /* получение данных о количестве звеньев */= CSpinEdit1->Value; /* получение данных о координатах объекта */= CSpinEdit2->Value;= CSpinEdit3->Value; /* получение даннных о возможном отклонении */= StrToFloat(Edit1->Text); /* получение данных на ограчение на обобщение координаты */= CSpinEdit5->Value;= CSpinEdit6->Value; /* логи... */->Lines->Add("-------------------------------------");->Lines->Add("Начало выполнения "+TimeToStr(t1)); /* первоначальная инициализация массивов данных */(i=0;i<n; i++) {corner[i] = start;}(i=n; i<100; i++) {corner[i] = end;}= 0; /* сброс прогресса */->MaxValue = end - start;->Progress = 0; /* открытие файла */= fopen ("file_out.txt", "w"); /* цикл расчета координат звеньев манипулятора */= false;(!done) {/* рассчитываем координаты звеньев */(); /* проверяем на пересечение с преградой */= 1;(i=0; i<n;i++) {status = status*barrier(i);} /* сравнение координат расчетных и исходных */(fabs(link_x[n-1]-x)<prec && fabs(link_y[n-1]-y)<prec && status!= 0) {/* вывод на экран если совпало (в пределах точности) */(); /* вывод данных в файл */(f,"N %d: ", number);(i=0; i<n; i++) {fprintf (f,"%d ",corner[i]);}(f,"\n"); } /* меняем угол */[n-1] += CSpinEdit4->Value;
/* поворачиваем следующее звено */(i=n-1; i>=0; i--) {if (corner[i]>end) {if (i>0) {corner[i-1] += CSpinEdit4->Value;(corner[i-1] > end && i == 1) {done = true;} };[i] = start; } }->Progress = corner[0] - start; }= Time();= t2-t1; /* логи... */->Lines->Add("Найдено "+IntToStr(number)+" ситуаций захвата"); ->Lines->Add("Окончание выполнения "+TimeToStr(t2));->Lines->Add("Длительность выполнения "+TimeToStr(t3)); } //---------------------------------------------------------------------------__fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) {((Key >= '0') && (Key <= '9')) {} // цифрыif (Key == 8) {} // <-if ((Key == '.') || (Key == ',')) // запятая {(((TEdit*)Sender)->Text.Pos(DecimalSeparator)!=0) // если запятая уже есть= 0;// если ещё нет= DecimalSeparator; }Key = 0; // не цифра } //---------------------------------------------------------------------------
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|