Obliczenie azymutów ze współrzędnych punktów tablica struktur punktów, tablica struktur azymutów Pojęcie azymutu w geodezji Azymut jest to kąt mierzony od kierunku północy (osi X) zgodnie z ruchem wskazówek zegara do kierunku odcinka (wektora). Azymut ma dodatni znak oraz przyjmuje wartości z przedziału 0g 400g. Azymutem lub kątem kierunkowym odcinka skierowanego (wektora) AB (o początku A i koocu B) nazywamy kąt zawarty pomiędzy kierunkiem dodatniego kierunku osi równoległej do osi X w punkcie początkowym A a kierunkiem do drugiego punktu koocowego B, liczony zgodnie z ruchem wskazówek zegara i mogący przyjmowad wartości od 0 g do 400 g, lub 0 o 360 o lub 0 2PI [rad].
Algorytmy obliczania azymutów, przy założeniu, że punkt początkowy to P i koocowy K I metoda obliczenia azymutu wykorzystanie funkcji arctan(dy/dx) i badanie położenia wektora względem układu lokalnego współrzędnych DX, DY, zaczepionego w punkcie P, równoległego do układu współrzędnych XY 1. Przyrosty współrzędnych odcinka : X = X K X P Y = Y K Y P 2. Uwzględnienie znaków przyrostów współrzędnych jeżeli X > 0 oraz Y > 0 to A = arctg ΔX jeżeli X > 0 oraz Y < 0 to A = arctg 400 g ΔX jeżeli X < 0 to A = arctg ΔX g + 200 3. Przypadki szczególne, gdy kierunek wektora jest równoległy do osi układu współrzędnych a) b) ΔX 0 oraz ΔX 0 oraz ΔX g 100 g 300 g 0 g 200 Azymut odcinka (wektora) KP = A + 200 g Procedura w języku C może byd zapisana np. następująco double az1(double x1, double y1, double x2, double y2) { double pi, rg, dx, dy, d, a, az ; // zmienne pi = 4.0 * atan(1.0); rg = 200.0 / pi; // PI i RO[grad] dx=x2-x1; dy=y2-y1; // przyrosty if (dx==0) // jeśli dx równa się 0 { if (dy>0) a=pi/2; else a=1.5*pi; } // if dx==0 else { // if (dx!= 0) a = atan(dy / dx); if (dx < 0) a = a + pi;
else { if (dy < 0) a = a + 2 * pi; } // if dy<0 } // koniec if (dx!= 0) az = a * rg; // obliczenie azymutu w gradach return az; } II Metoda wykorzystanie funkcji atan2(dy, dx) języka C i M_PI = PI 200/M_PI RO[gradowe] X =dx=x2-x1; Y =dy=y2-y1; az = atan2(dy, dx) * 200.0/M_PI; if (az <0) az=az+400.0;
III Metoda tradycyjne wykorzystanie czwartaków RG=200.0/M_PI; Ro[grad] Jeśli dx <> 0 to czw=rg*atan(dy/dx); // czwartak w gradach Uwzględnienie dwiartek układu współrzędnych w dwiartka (1 4) w=41 granica dwiartki 4 i 1; w=12 granica dwiartki 1 i 2 itd. Zapis w języku C np. postaci: if (dx>0 && dy>0) {w=1; az = czw; break; } // I dwiartka if (dx<0 && dy>0) {w=2; az = 200.0-czw; break; } if (dx<0 && dy<0) {w=3; az = 200.0+czw; break; } if (dx>0 && dy<0) {w=4; az = 400.0-czw; break; } // IV dwiartka if (dx>0 && dy==0) {w=41; az=0; break; } // granica dwiartek 4 i 1 if (dx==0 && dy>0) {w=12; az=100.0; break; } if (dx<0 && dy==0) {w=32; az=200.0; break; } if (dx==0 && dy<0) { w=43; az=300.0; break; // granica dwiartek 4 i 3
SCHEMAT BLOKOWY OBLICZENIA AZYMUTU METODĄ CZWARTAKÓW Specyfikacja problemu algorytmicznego i opis użytych zmiennych Problem algorytmiczny: Obliczenie azymutu wektora (odcinka skierowanego) o danych współrzędnych początku i kooca. Dane wejściowe: Wykaz punktów: NR X Y (podaje się ilośd i wprowadza dane z klawiatury) Następnie wprowadza się wykaz numerów: P K (gdzie P = NRP nr początkowy odcinka (wektora) a K = NRK nr koocowy odcinka). Dane wyjściowe (wyniki): Wykaz numerów punktów i współrzędnych oraz wykaz azymutów i długości dla podanych boków Opis metody zastosowanej w programie dane i wyniki Wykaz punktów: NR X Y (podaje się ilośd i wprowadza dane z klawiatury) Punkt tworzy strukturę struct pkty { long int nr; double x, y; }; Wykaz punktów zapisywany jest w tablicy struktur: pkty t*maxp+; Za MAXP przyjęto 50. Tablica może więc zapamiętad 50 punktów. Po wprowadzeniu punktów podaje się nazwę pliku wyników. Do pliku zapisywany jest wykaz współrzędnych. Następnie wprowadza się wykaz numerów: P K (gdzie P = NRP nr początkowy odcinka wektora, a K = NRK nr koocowy odcinka). Wprowadzenie NRP = 0 kooczy wprowadzanie wykazu odcinków. Na bieżąco są znajdowane punkty w tablicy współrzędnych i obliczane azymuty i wyświetlane oraz drukowane do pliku. Pseudokod funkcji głównej algorytm zapisany za pomocą listy kroków 1. Wyświetl nagłówek programu 2. Wprowadź ilośd punktów n 3. Uruchom wprowadzenie wykazu punktów: Nr X Y i zapamiętaj w tablicy - czytajpunkty (t,n); 4. Wyświetl punkty funkcja wyswietlpunkty (t,n); 5. Wczytaj wykaz boków - funkcja czytajboki(t, n); - czytaj wykaz boków do obliczenia azymutów, szukaj współrzędnych i licz azymuty, gdy NRP = 0 to zakoocz: Czytaj NRP, jeśli NRP <> 0 to czytaj NRK i licz azymut
SCHEMAT BLOKOWY PROGRAMU FUNKCJA GŁÓWNA START Wyświetl nagłówek programu Wczytaj ilość punktów n Wprowadź wykaz Nr(i) X(i) Y(i) i=1..n Funkcja czytajpunkty (t,n); Wyświetl punkty funkcja wyswietlpunkty (t,n); Wczytaj wykaz boków - funkcja czytajboki(t, n) Instrukcje i funkcje funkcji głównej /* ========================== */ int main() // funkcja glowna { const int MAX=50; int n=0, m=0; puts("program azymplik.cpp\n"); printf("obliczenie azymutow i dlugosci bokow ze wspolrzednych\n"); NL; // nowa linia printf("\nwprowadz ilosc punktow: "); scanf("%d",&n); // pobranie ilości punktów n fflush(stdin); // czyści bufor danych czytajpunkty (t,n); // wczytanie n punktów i współrzędnych do tablicy t wyswietlpunkty (t,n); // wyświetlenie wykazu punktów i współrzędnych czytajboki(t, n); // wczytanie wykazu boków return 0; // zwraca funkcja główna } /* ======================== */ Niektóre funkcje dodatkowe // azymut - metoda z atan() double az1(double x1, double y1, double x2, double y2) // azymut - funkcja atan2(dy,dx) double az2(double x1, double y1, double x2, double y2) // azymut czwartaki double az3(double dx, double dy ) STOP
// odległośd ze współrzędnych double odl(double x1, double y1, double x2, double y2) Przykład wyników Program azympl1.cpp Obliczenie azymutów ze współrzędnych punktów Wykaz współrzędnych punktów Lp Nr X Y 0 1 0.000 0.000 1 2 1.000 0.000 2 3 1.000 1.000 3 4-1.000-1.000 Lp NrP NrK Azym[grad] Azym2[grad] Azym[st_mi_sek] Dlugosc 1 1 2 0.0000 0.0000 0st 0' 0.0" 1.000 2 1 3 50.0000 50.0000 45st 0' 0.0" 1.414 3 1 4 250.0000 250.0000 225st 0' 0.0" 1.414 4 4 1 50.0000 50.0000 45st 0' 0.0" 1.414 Obliczył: A. Iksinski