Wcięcie kątowe wstecz Sc sb sa

Transkrypt

Wcięcie kątowe wstecz Sc sb sa
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
A 

a
X
sa

B
b
τ



sb
τ

P
δ
C
Sc
Y

Z czworokąta A, B, C, P obliczamy sumę oraz różnicę kątów  i 
Suma
     400g  α  β    = x
b*sinα/a*sinβ = ctg μ  μ
tg (  -d)/2= tg(g+d)/2*ctg(45+μ)  g-d =y
Przyjmując g= g =gamma
Otrzymujemy
d=d = delta
x =      400g  α  β    = x
g+d=x
g-d=y
g=(x+y)/2=gamma
A(AP) = A(AB)+g
d=(x-y)/2=delta
A(CP)=A(CB)-d
BP/sin(g) = a/sin(alfa)  Sb =|BP|=a*sin(alfa)/sin(g)
Sa = AP=a*sin(alfa+gamma)/sin(alfa)
Sc= |CP|=b*sin(beta+gamma)/sin(beta)
DX(AP)=|AP|*cos(AAP) DY(AP)=|AP|*sin(AAP)
DX(CP)=|CP|*cos(ACP) DY(CP)=|CP|*sin(ACP)
XP = XA+DXAP YP=YA+DYAP
W praktyce do obliczenia współrzędnych punktu P wykorzystujemy pomocnicze symbole
obliczeniowe – formy rachunkowe Hausbrandta.
Algorytm wcięcia wstecz wg form Hausbrandta
Ffg
ΔXAB
ΔYAB
ctgα
ΔXAC
1 - ctgα  β 
ΔYAC
-1
f1  f 2  F0
F02  1
ΔYAP  F0  ΔXAP
X P  X A  ΔXAP
YW  YA  ΔYAP
ΔXAP 
Gdzie: F0=F1/F2
Fi = | f1
f 2|
| F0
1|
Fi[1] = Fi1/(F02 + 1) = DXAP
DYAP=-F0*DXAP
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);
// DXAP
dyp=-F0*dxp;
// DYAP
dyap=dyp;
// DXAP
x_p=xa+dxp;
// XP
y_p=ya+dyap;
// YP
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 DXAP oraz pośrednio przez referencję
DYAP
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
Punkt wyznaczony: 2
142.714
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)
Punkt wyznaczony: 2
55.4827
X= 5836.17 Y= 743.262
142.714