Aplikacje geodezyjne 1. Azymut ze współrzędnych Utwórz nowy projekt o nazwie Azymut. W oknie rozmieść kontrolki mniej więcej zgodnie z rysunkiem. Obiekty mają zmienione następujące wartości cech: cecha Name: - okno ma nazwę P4; - przyciski mają nazwy odpowiednio koniec_prz, azymut_rz, wyczysc_prz; - etykieta ma nazwę: azymut_ety, pozostałe można zostawić domyślne; - pola tekstowe mają nazwy odpowiednio: xk_txt, yk_txt, xp_txt, yp_txt. cecha Text: wszystkie obiekty zgodnie z wyglądem w oknie programu. cecha TextAlign: wszystkie pola tekstowe mają ustawioną wartość na = Center. cecha BorderStyle: etykieta azymut_ety ma ustawioną wartość na = FixedSingle. W kodzie programu zwróć uwagę na elementy generowane automatycznie przez VB, tzn. zastanów się co należy przepisać, a co wygenerować. Public Class P4 Dim xk, xp As Single Dim yk, yp As Single Dim azymut As Double Private Sub koniec_prz_click(sender As System.Object, e As System.EventArgs) Handles koniec_prz.click End 1/8
Private Sub wyczysc_prz_click(sender As System.Object, e As System.EventArgs) Handles wyczysc_prz.click xp_txt.text = "" yp_txt.text = "" xk_txt.text = "" yk_txt.text = "" azymut_ety.text = "" Private Sub azymut_prz_click(sender As System.Object, e As System.EventArgs) Handles azymut_prz.click Dim dx, dy As Single If xp_txt.text = "" Or xk_txt.text = "" Or yp_txt.text = "" Or yk_txt.text = "" Then MsgBox("Co najmniej jedna współrzędna nie została wpisana!", 16, "Błąd współrzędnych") Exit Sub If xp_txt.text = xk_txt.text And yp_txt.text = yk_txt.text Then MsgBox("Błąd, nie ma azymutu!", 16, "Błąd współrzędnych") Exit Sub xk = Val(xk_txt.Text) xp = Val(xp_txt.Text) yk = Val(yk_txt.Text) yp = Val(yp_txt.Text) dx = xk - xp dy = yk - yp If dx = 0 And dy > 0 Then azymut = 100 ElseIf dx = 0 And dy < 0 Then azymut = 300 ElseIf dx > 0 And dy = 0 Then azymut = 0 ElseIf dx < 0 And dy = 0 Then azymut = 200 ElseIf dx <> 0 And dy <> 0 Then azymut = Math.Atan(dy / dx) azymut = azymut * 200 / Math.PI If azymut < 0 Then azymut = -azymut If dx < 0 And dy > 0 Then azymut = 200 - azymut If dx < 0 And dy < 0 Then azymut = 200 + azymut If dx > 0 And dy < 0 Then azymut = 400 - azymut azymut_ety.text = Format(azymut, "0.0000 gradów") Private Sub xk_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles xk_txt.keypress Private Sub yk_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles yk_txt.keypress 2/8
Private Sub xp_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles xp_txt.keypress Private Sub yp_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles yp_txt.keypress End Class Zaimplementowany został mechanizm zabezpieczenia przed wpisaniem znaku, nie będącego elementem sterującym, cyfrą, separatorem dziesiętnym lub myślnikiem. Zadanie: W wolnym miejscu formy wstaw PictureBox o rozmiarach 700 x 700. Jeśli zajdzie taka potrzeba zwiększ rozmiar formy. Parametr Name pola obrazów powinien brzmieć wykres. W wywołaniu: Private Sub azymut_prz_click(sender As System.Object, e As System.EventArgs) Handles azymut_prz.click wpisz: xp1 = yp yp1 = -xp xk1 = yk yk1 = -xk With wykres.creategraphics.drawline(pens.red, xp1 + 350, yp1 + 350, xk1 + 350, yk1 + 350).DrawLine(Pens.Black, 0, 350, 700, 350).DrawLine(Pens.Black, 350, 0, 350, 700) End With W wywołaniu: Private Sub wyczysc_prz_click(sender As System.Object, e As System.EventArgs) Handles wyczysc_prz.click wpisz: With wykres.creategraphics.clear(color.white) End With Dodatkowo ustaw parametr BackColor pola graficznego na White i pamiętaj o zdefiniowaniu nowych zmiennych: Dim xk1, xp1 As Single Dim yk1, yp1 As Single 3/8
Zwróć uwagę na definicję współrzędnych linii. Czarne linie wyznaczają osie układu współrzędnych, czerwona linia generowana jest na podstawie danych użytkownika. Przesunięcie jest związane z koniecznością kompensacji początku układu współrzędnych okna graficznego, który znajduje się w lewym górnym narożniku. Dodatkowo linia musi być obrócona o 90 stopni lewoskrętnie ze względu na konieczność dopasowania układu współrzędnych do standardu przyjętego w matematyce, czyli oś y skierowana w górę, a x w prawą stronę. Zadanie do wykonania to rozwiązanie problemu skalowania dla współrzędnych xp, yp, xp i yk przekraczających możliwy do wykreślenia zakres (-350, 350) oraz skalowanie linii " w górę" dla znikomych wartości współrzędnych. W tym drugim przypadku należy wyznaczyć wartość maksymalną i na niej opierać obliczenia. Zadanie: Rozbuduj program o informację o długości odcinka na podstawie danych wprowadzanych przez użytkownika oraz przekonwertuj grad na stopnie. Obliczeń dokonaj przed skalowaniem na potrzeby rysowania. Wynik końcowy powinien się prezentować mniej więcej jak na rysunku. 2. Pole powierzchni i obwód figury geometrycznej Na podstawie poprzedniego zadania stwórz formatkę zgodnie z rysunkiem. 4/8
Obiekty mają zmienione następujące wartości cech: cecha Name: - okno ma nazwę P4; - przyciski mają nazwy odpowiednio koniec_prz, oblicz_rz, wyczysc_prz; - etykiety mają nazwy: obwod_ety, pole_ety, pozostałe można zostawić domyślne; - pola tekstowe mają nazwy odpowiednio: x1_txt, y1_txt, x2_txt, y2_txt, x3_txt, y3_txt. cecha Text: wszystkie obiekty zgodnie z wyglądem w oknie programu. cecha TextAlign: wszystkie pola tekstowe mają ustawioną wartość na = Center. cecha BorderStyle: etykiet pole_ety i obwod_ety ma ustawioną wartość na = FixedSingle. Podczas wprowadzania kodu programu weź pod uwagę, że Visual Basic automatycznie generuje część kodu. Możesz korzystać z kopii poprzedniego projektu, co jest opcją polecaną. Public Class P4 Dim x1, x2, x3 As Single Dim y1, y2, y3 As Single Dim xx1, xx2, xx3 As Single Dim yy1, yy2, yy3 As Single Dim pole As Double Dim obwod As Double Private Sub koniec_prz_click(sender As System.Object, e As System.EventArgs) Handles koniec_prz.click End Private Sub wyczysc_prz_click(sender As System.Object, e As System.EventArgs) Handles wyczysc_prz.click x1_txt.text = "" y1_txt.text = "" x2_txt.text = "" y2_txt.text = "" x3_txt.text = "" 5/8
y3_txt.text = "" pole_ety.text = "" obwod_ety.text = "" With wykres.creategraphics.clear(color.white) End With Private Sub oblicz_prz_click(sender As System.Object, e As System.EventArgs) Handles oblicz_prz.click Dim dx, dy As Single If x1_txt.text = "" Or x2_txt.text = "" Or y1_txt.text = "" Or y2_txt.text = "" Or x3_txt.text = "" Or y3_txt.text = "" Then MsgBox("Co najmniej jedna współrzędna nie została wpisana!", 16, "Błąd współrzędnych") Exit Sub x1 = Val(x1_txt.Text) x2 = Val(x2_txt.Text) x3 = Val(x3_txt.Text) y1 = Val(y1_txt.Text) y2 = Val(y2_txt.Text) y3 = Val(y3_txt.Text) pole = (x1 * y2 - y1 * x2) + (x2 * y3 - y2 * x3) + (x3 * y1 - y3 * x1) 'pole = (x2 - x3) * y1 + (x3 - x1) * y2 + (x1 - x2) * y3 pole = pole / 2 If pole < 0 Then pole = -pole obwod = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2)) + Math.Sqrt(Math.Pow((x3 - x2), 2) + Math.Pow((y3 - y2), 2)) + Math.Sqrt(Math.Pow((x1 - x3), 2) + Math.Pow((y1 - y3), 2)) pole_ety.text = Format(pole, "0.0000") obwod_ety.text = Format(obwod, "0.0000") While Math.Abs(x1) > 350 Or Math.Abs(y1) > 350 Or Math.Abs(x2) > 350 Or Math.Abs(y2) > 350 Or Math.Abs(x3) > 350 Or Math.Abs(y3) > 350 x1 = x1 / 1.5 y1 = x1 / 1.5 x2 = x2 / 1.5 y2 = y2 / 1.5 x3 = x3 / 1.5 y3 = x3 / 1.5 End While xx1 = y1 yy1 = -x1 xx2 = y2 yy2 = -x2 xx3 = y3 yy3 = -x3 With wykres.creategraphics.drawline(pens.red, xx1 + 350, yy1 + 350, xx2 + 350, yy2 + 350).DrawLine(Pens.Red, xx2 + 350, yy2 + 350, xx3 + 350, yy3 + 350).DrawLine(Pens.Red, xx3 + 350, yy3 + 350, xx1 + 350, yy1 + 350).DrawLine(Pens.Black, 0, 350, 700, 350).DrawLine(Pens.Black, 350, 0, 350, 700) End With Private Sub x1_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles x1_txt.keypress 6/8
7/8 Opracował: Damian Krzesimowski Private Sub y1_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles y1_txt.keypress Private Sub x2_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles x2_txt.keypress Private Sub y2_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles y2_txt.keypress Private Sub x3_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles x3_txt.keypress Private Sub y3_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles y3_txt.keypress Private Sub x4_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Private Sub y4_txt_keypress(byval sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
End Class W programie zrealizowane są te same zabezpieczenia i konwersje, co w poprzednim projekcie. Efekt końcowy powinien być podobny do przedstawionego na rysunku. Zadanie: Rozbuduj aplikację o możliwość operowania na trójkącie lub czworokącie. Wykorzystaj kontrolkę CheckBox lub RadioButton. Zwróć uwagę na konieczność kontroli kolejności punktów, z których składać się będzie czworokąt. Ma to na celu zapobieżenie przecięciu się odcinków. 8/8