Wcięcie kątowe wstecz Dane: współrzędne 3 punktów: A, B, C oraz kąty α 1 i α 2. Wyznaczyd współrzędne punktu wcinanego P Wcięcie kątowe wstecz polega na wyznaczeniu współrzędnych punktu P z wykorzystaniem pomierzonych kątów α 1 i α 2. Lub α 1) i do znanych punktów A, B i C,. Zadanie to sprowadza się do obliczenia kątów i a następnie do obliczenia współrzędnych punktu P jako wcięcie biegunowe. Wzory X A a s a B τ b P s b S c δ C Y Z czworokąta A, B, C, P obliczamy sumę oraz różnicę kątów i Suma α β 400 g = x b*sinα/a*sinβ = ctg μ μ tg ( -d)/2= tg(g+d)/2*ctg(45+μ) g-d =y Przyjmując g= g =gamma d=d = delta Otrzymujemy
g + d = x x = α β g - d = y 400 g = x g=(x+y)/2=gamma d=(x-y)/2=delta A () = A (AB) +g A (CP) =A (CB) -d BP/sin(g) = a/sin(alfa) Sb = BP =a*sin(alfa)/sin(g) Sa = =a*sin(alfa+gamma)/sin(alfa) Sc= CP =b*sin(beta+gamma)/sin(beta) DX()= *cos(a ) DY()= *sin(a ) DX(CP)= CP *cos(a CP ) DY(CP)= CP *sin(a CP ) X P = X A +DX Y P =Y A +DY W praktyce do obliczenia współrzędnych punktu P wykorzystujemy pomocnicze symbole obliczeniowe formy rachunkowe Hausbrandta. Algorytm wcięcia wstecz wg form Hausbrandta ΔXAB F f g ctgα ΔX X P X f1 f F0 F 1 A 2 2 0 ΔX ΔY 1 AB ΔY Y ΔX W AC - ctg α β Y A 0 ΔY F ΔX ΔY -1 AC Gdzie: F0=F1/F2 Fi = f 1 f 2 F 0 1 Fi [1] = Fi 1 /(F 2 0 + 1) = DX DY =-F 0 *DX Kontrola tan(beta-alfa) = T0 = T1/T2 Gdzie: T= DXPB DYPB DXPC DYPC Algorytm w języku C ROG=200.0/PI; // Ro[grad] dxab=xb-xa; dyab=yb-ya; // przyrosty AB dxac=xc-xa; dyac=yc-ya; // przyrosty AC al1=a1/rog; al2=a2/rog; // zamiana gradów na radiany ctga=1.0/(tan(al1)); // ctg(alfa) ctgb=1.0/(tan(al2)); // ctg(beta) f1=dxab-dyab*ctga; // f1 f2=dxab*ctga+dyab; // f2
F1=f1-dxac+dyac*ctgb; // F1 F2=f2-dxac*ctgb-dyac; // F2 dxp=(f1-f2*f0)/(f0*f0+1.0); dyp=-f0*dxp; // DY dyap=dyp; // DX x_p=xa+dxp; // X P y_p=ya+dyap; // Y P // DX Przykłady - dane Przykład 2 i rozwiązanie graficzne w AutoCAD
Specyfikacja problemu algorytmicznego Problem algorytmiczny: Obliczenie współrzędnych punktu wciętego wstecz Dane wejściowe: Dane: współrzędne 3 punktów: A, B, C oraz kąty α 1 i α 2. Dane wyjściowe: współrzędne punktu wcinanego P Zapis algorytmu w postaci listy kroków, pseudokod programu 1. Wyświetl pomoc - funkcja pomoc(); 2. Wykonuj pętlę do (przynajmniej raz) 3. Wyświetl menu: 0 - Wyjście z programu 1 - dane z klawiatury 2 - dane z pliku 'dwcwst.txt' - kąty w [grad] 3 - dane z pliku 'dwcwst2.txt' - kąty w [st min sek] 4. Wprowadź wskaźnik opcji dane1; 5. Jeśli dane1==1 to d_klaw() // dane z klawiatury else jeśli dane1==2 to d_plik() // dane z pliku - grady else jeśli dane1==3 d_plik2() // dane z pliku miara stopniowa else zwród 0 i wyjdź z programu; 6. Wyświetl wprowadzone dane: numery I współrzędne oraz kąty 7. Wywołaj funkcję dx_ap(), zwracającą przyrost DX oraz pośrednio przez referencję DY 8. Oblicz współrzędne punktu wcinanego P: xp=xa+dxap; yp=ya+dyap; 9. Wyświetl wyniki 10. Otwórz plik wyników i wydrukuj wyniki do pliku, zamknij plik } dopóki wskaźnik dane1 różny od zera // while (dane1!= 0); 11. Wród do punktu 2
SCHEMAT BLOKOWY PROGRAMU
Zapis funkcji głównej w języku C // definicja nazw plików wynikowych #define WYN3 "w_wcwstg.txt" #define WYN4 "w_wcwsts.txt" int main() char WYN[15]; pomoc(); // funkcja pomoc() do // petla do system("cls"); // menu cout << "Program wcwst.cpp" << endl; cout << "Wciecie katowe wstecz \n" << endl; cout << "0 - Wyjscie z programu \n" << endl; cout << "1 - dane z klawiatury \n" << endl; cout << "2 - dane z pliku 'dwcwst.txt' - katy w [grad] \n"; cout << "NrA x y NrB xb yb NrC xc yc Alfa1[grad] Alfa2[grad]\n " << endl; cout << "3 - dane z pliku 'dwcwst2.txt' - katy w [st min sek]\n"; cout << "NrA x y NrB xb yb NrC xc yc st1 min1 sek1 st2 min2 sek2 " << endl; cout << "\nwprowadz 0 lub 1 lub 2 lub 3 => " ; cin >> dane1; // wczytaj wskaznik rodzaju danych if (dane1==1) d_klaw(nra, nrb, nrc, xa, ya, xb, yb, xc, yc, a1, a2, nrp); // dane z klawiatury else if (dane1==2) d_plik(nra, nrb, nrc, xa, ya, xb, yb, xc, yc, a1, a2, nrp); // dane z pliku - grady else if (dane1==3) d_plik2(nra, nrb, nrc, xa, ya, xb, yb, xc, yc, a1, a2, nrp); // dane z pliku - stopnie else return 0; // wyjście z programu // wyświetlenie wyników cout << "Wprowadzone dane: " << endl; cout << "Pkt A: " << nra << "\t" << xa << "\t" << ya << endl; cout << "Pkt B: " << nrb << "\t" << xb << "\t" << yb << endl; cout << "Pkt C: " << nrc << "\t" << xc << "\t" << yc << endl; cout << "Afa1 Alfa 2: " << a1 << "\t" << a2 << endl; NE; // Naciśnij Enter getch(); } // Obliczenia przyrostow - funkcja zwraca bezposrednio dxap a przez referencje dyap } dxap= dx_ap(xa, ya, xb, yb, xc, yc, a1, a2, dyap); // wywołanie funkcji xp=xa+dxap; yp=ya+dyap; // Wspolrzedne Xp Yp // wyswietlenie wynikow cout << "\nwyniki: funkcja glowna\n"; cout << "Punkt wyznaczony: " << nrp << " xp=" << xp << "\t yp=" << yp << endl; // Zapis wynikow do pliku strcpy(wyn, WYN3); if (dane1==3) strcpy(wyn, WYN4); else strcpy(wyn, WYN3); ofstream wy(wyn); cout.setf(ios::fixed); // zapewnia ze precision() odnosi sie do miejsc po kropce
wy << "Wciecie wstecz\n\n"; wy << "Dane \n"; wy << "Nr \t X \t Y \n"; wy << nra << "\t" << xa << "\t" << ya << endl; wy << nrb << "\t" << xb << "\t" << yb << endl; wy << nrc << "\t" << xc << "\t" << yc << endl; wy << "Katy [grad] " ; if (dane1==3) wy << "(przeliczone ze stopni)"; wy << "\t" << a1 << "\t\t" << a2 << endl; wy << "\npunkt wyznaczony: " << nrp << "\t"; cout.precision(4); // precyzja wy << " X= " << xp << " Y= " << yp << endl; wy.close(); // zamkniecie pliku } cout << "\n\nwyniki w pliku " << WYN; NE; getch(); } while (dane1!= 0); // koniec petli do return 0; // zwraca poprawne wyjście z main() } // main Przykład 1 danych kąty w gradach - plik danych: dwcwst1.txt 52 7108.45 1117.78 // nra xa ya 69 6602.16 2491.31 // nrb xb yb 54 4696.21 1546.07 // nrc xc yc 55.48272 142.7139 // Alfa1 Alfa2 w [grad] 2 // nr punktu wyznaczanego C Przykład wyników 1 Wcięcie wstecz Dane Nr X Y 52 7108.45 1117.78 69 6602.16 2491.31 54 4696.21 1546.07 Kąty [grad] 55.4827 142.714 Punkt wyznaczony: 2 X= 5836.17 Y= 743.262 Przykład danych 2 kąty w stopniach min sekundach
52 7108.45 1117.78 69 6602.16 2491.31 54 4696.21 1546.07 49 56 04 128 26 33 2 Przykład wyników 2 Wcięcie wstecz Dane Nr X Y 52 7108.45 1117.78 69 6602.16 2491.31 54 4696.21 1546.07 Kąty [grad] (przeliczone ze stopni) 55.4827 142.714 Punkt wyznaczony: 2 X= 5836.17 Y= 743.262