Obliczenie azymutu ze współrzędnych – wersja C++ Builder
Transkrypt
Obliczenie azymutu ze współrzędnych – wersja C++ Builder
Obliczenie azymutu ze współrzędnych – wersja C++ Builder Specyfikacja problemu algorytmicznego Problem algorytmiczny: Obliczenie azymutów i długości, gdy dana jest tablica współrzędnych punktów (Nr X Y). Dane wejściowe: Tablica numerów i współrzędnych punktów (numery – liczby całkowite, współrzędne X, Y typu double) Dane wyjściowe: długości boków, azymuty wektorów Pi-Pi+1 - w gradach, stopniach (liczba jako dziesiętne stopnia), stopnie całkowite, minuty i sekundy oraz azymut odwrotny wektora Pi+1-P1 – wyświetlone na ekranie formularza obliczeniowego (wersja obiektowa – C++ Builder) . Szkic do obliczeń azymutu: Wzory: Odległość: d=sqrt(Dx*Dx+Dy*Dy); Tradycyjnie – obliczenia ręczne - dodatkowo liczy się: d=DX/cos(Az); d=DY/sin(Az); Azymut Zastosowano w programie funkcję atan2(dy,dx), gdzie dx, dy – przyrosty współrzednych az2 = atan2(Dy, Dx) – funkcja biblioteczna języka C Opis programu Program napisano i skompilowano w z wykorzystaniem aplikacji Borland C++ Builder 6 Personal. 1. Formularz programu zawiera blok DANE – komponent StringGrid - tabela do wprowadzenia numerów współrzędnych punktów, suwak do wprowadzenia ilości wierszy - komponent ScrollBar , komponent Edit – wyświetla ilość wierszy, komponenty Label – etykiet opisowe (napisy) oraz przyciski: do wypełnienia tabeli zerami, do uruchomienia obliczeń: i przycisk wyjścia z programu. 2. Po uruchomieniu programu pojawia się Formularz, na nim 2 wiersze do wprowadzenia ilości wierszy (punktów). Ilość te można zmienić przy pomocy suwaka. Naciśnięcie klawisza KONIEC powoduje wyjście z programu. 2. W pola Nr X Y należy wpisać odpowiednie dane. Naciśnięcie przycisku Wypelnij lub Oblicz wypełnia puste pola zerami. 3. Po naciśnięciu przycisku Oblicze obliczane są azymuty i długości oraz wyświetlane na ekranie. 4. Azymuty są obliczane przy pomocy funkcji atan2(dy,dx) i zamieniane na grady oraz miarę stopniową. Przykład obliczeń – kopia ekranu Funkcje obliczeniowe wykorzystywane w programie: // Funkcje - deklaracje double odl(double x1, double y1, double x2, double y2); // odległość ze współrzędnych double az2(double x1, double y1, double x2, double y2); // azymut z funkcji atan2 Schematy blokowe funkcji obliczenia azymutów Funkcja az2(x1, y1, x2, y2) – zastosowanie atan2(dy,dx) Listingi programu Plik azdlCB1.h //--------------------------------------------------------------------------// Obliczenie azymutu i długości ze współrzędnych - Borland C++ Builder 6 // Plik azdlCB1.h // 02.2012 // K. R. // definicja maks ilosc wierszy #define NMAX 20 #include <math.h> #include <Classes.hpp> #include <Controls.hpp> #include <ExtCtrls.hpp> #include <Grids.hpp> #include <StdCtrls.hpp> #ifndef azdlCB1H #define azdlCB1H //--------------------------------------------------------------------------#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> // Deklaracja funkcji double dl(double dx, double dy); // obl. dlugosci //--------------------------------------------------------------------------// Komponenty formularza class TForm1 : public TForm { __published: // IDE-managed Components TPanel *Panel1; TButton *Koniec; TStringGrid *Dane; TScrollBar *Wiersze; TEdit *IloscWierszy; TButton *Oblicz; TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TLabel *Label5; TLabel *Label6; TLabel *Label7; TLabel *Label8; TLabel *Label9; TLabel *Label10; TLabel *Label11; TLabel *Label12; TButton *Wypelnij; TLabel *Label13; TLabel *Label14; TLabel *Label15; TLabel *Label16; TLabel *Label17; TLabel *Label18; void __fastcall KoniecClick(TObject *Sender); void __fastcall WierszeChange(TObject *Sender); void __fastcall ObliczClick(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall WypelnijClick(TObject *Sender); // sekcja private - deklaracje uzytkownika private: // User declarations int m, n; int tN[NMAX]; double tX[NMAX], tY[NMAX], tDX[NMAX], tDY[NMAX], tD[NMAX], tA[NMAX]; // Sekcja public public: // User declarations __fastcall TForm1(TComponent* Owner); // Definicja funkcji dl() - obliczenie dlugosci z przyrostow dx, dy double dl(double dx, double dy) { return sqrt(dx*dx+dy*dy); } }; //--------------------------------------------------------------------------extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------#endif plik P_AzDCB1.cpp //--------------------------------------------------------------------------//Projekt - plik P_AzDCB1.cpp // azymut i długość ze współrzędnych - wersja C++ Builder // Program główny #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------USEFORM("azdlCB1.cpp", Form1); //--------------------------------------------------------------------------WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //--------------------------------------------------------------------------- Plik azdlCB1.cpp //--------------------------------------------------------------------------// Plik azdlCB1.cpp // Obliczenie azymutu i długości ze współrzędnych // Borland C++ Builder 6 #include <vcl.h> #pragma hdrstop #include "azdlCB1.h" // Deklaracje funkcji // double dl(double dx, double dy); - jest w azdlCB1.h double az2(double dx, double dy); int grad2dg(double gr); int grad2min(double gr); float grad2sek(double gr); //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TForm1::KoniecClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------void __fastcall TForm1::WierszeChange(TObject *Sender) // Zmiana wierszy - komponent ScrollBar - listwa przewijania { Dane->RowCount=Wiersze->Position; n=Wiersze->Position; IloscWierszy->Text=n; } //--------------------------------------------------------------------------void __fastcall TForm1::ObliczClick(TObject *Sender) // Obliczenie { double dx, dy, d, azg1, azg2, degree; int stop, min, sek; // wypelnienie tabeli zerami // wypelnij for (int i=0; i<=n; i++) { for (int j=0; j<=2; j++) if (Dane->Cells[j][i]=="") Dane->Cells[j][i]=0; } // wypelnij // Obliczenia // wprowadzenie danych do tabel z komponentu StringGrid - tabela na ekranie for (int i=0; i<n; i++) { tN[i]= StrToInt (Dane->Cells[0][i]); tX[i]= StrToFloat(Dane->Cells[1][i]); tY[i]= StrToFloat(Dane->Cells[2][i]); } for (int i=0; i<n-1; i++) { // przyrosty tDX[i]= StrToFloat(Dane->Cells[1][i+1])- StrToFloat(Dane->Cells[1][i]); tDY[i]= StrToFloat(Dane->Cells[2][i+1])- StrToFloat(Dane->Cells[2][i]) ; d=dl(tDX[i],tDY[i]); // dlugosc azg1=az2(tDX[i], tDY[i]); // azymut w grad tD[i]=d; // dlugosc do tabeli tA[i]=azg1; degree=azg1*0.9; // azymut w stopniach i dzies. stopnia azg2=az2(-tDX[i], -tDY[i]); // azymut odwrotny w [grad] // wypelnienie tabeli na ekranie Dane->Cells[3][i]=tDX[i]; Dane->Cells[4][i]=tDY[i]; Dane->Cells[5][i]=d; Dane->Cells[6][i]=azg1; Dane->Cells[7][i]=degree; Dane->Cells[8][i]=grad2dg(azg1); Dane->Cells[9][i]=grad2min(azg1); Dane->Cells[10][i]=grad2sek(azg1); Dane->Cells[11][i]=azg2; // W ostatniej linii wypelnienie pustymi elemantami for (int j=0; j<=11; j++) Dane->Cells[j][n]=""; } // for } //--------------------------------------------------------------------------// po utworzeniu formularza void __fastcall TForm1::FormCreate(TObject *Sender) { int const NK=12; Dane->ColCount=NK; Dane->RowCount=2; n=2; m=12; } //--------------------------------------------------------------------------// wypełnienie danymi tabeli ekranowej void __fastcall TForm1::WypelnijClick(TObject *Sender) { for (int i=0; i<=n; i++) { for (int j=0; j<=2; j++) Dane->Cells[j][i]=0; } } //--------------------------------------------------------------------------// Funkcje - definicje // obliczenie azymutu z atan2(dy,dx) double az2(double dx, double dy) { double a; if (dx==0 && dy==0) return 0; a = atan2(dy,dx) * 200.0/M_PI; if (a <0) a += 400.0; return a; } // zamiana gradów na stopnie całkowite - zwraca tylko stopnie int grad2dg(double gr) { double st, mi; int sc; st=gr*0.9; // stopnie sc= int(st); // stopnie calkowite return sc; } // zamiana gradów na stopnie - zwraca tylko minuty całkowite int grad2min(double gr) { double st, mi; int sc, mc; st=gr*0.9; // stopnie sc= int(st); // stopnie calkowite mi=(st-sc)*60.0; // minuty mc=int(mi); // minuty calkowite // se=(mi-mc)*60.0; // sekundy return mc; } // zamiana gradów na stopnie - zwraca stopnie - zwraca tylko sekundy, liczba rzeczywista float grad2sek(double gr) { double st, mi, se; int sc, mc; st=gr*0.9; // stopnie sc= int(st); // stopnie calkowite mi=(st-sc)*60.0; // minuty mc=int(mi); // minuty calkowite se=(mi-mc)*60.0; // sekundy return se; // zwraca sekundy }