alen Ćosić program u visual basicu za …tu su još i poglavlja o programskom jeziku visual basic,...
TRANSCRIPT
1
SVEUČILIŠTE U ZAGREEBU
GEODETSKI FAKULTET
Alen Ćosić
PROGRAM U VISUAL BASICU ZA RAČUNANJA U
GAUSS-KRÜGEROVOJ PROJEKCIJI
Diplomski rad
Zagreb 2004.
2
Sadržaj
Predgovor……………………………………………………………………….. 3.
1. Uvod ……………………………………………………………………………. 4.
2. Osnovne formule za računanja u Gauss-Krügerovoj projekciji ………………... 5.
2.1. Računanje pravokutnih koordinata i konvergencije meridijana iz
geografskih koordinata …………………………………………………… 5.
2.2. Računanje geografskih koordinata i konvergencije meridijana iz
pravokutnih koordinata ...………………………………………………… 7.
2.3. Računanje redukcije pravca i dužine …………………………………….. 8.
2.4. Računanje pravokutnih koordinata u ravnini iz azimuta i dužine
geodetske linije ………………………………………………………….... 10.
2.5. Računanje dužine i azimuta geodetske linije iz pravokutnih
koordinata u ravnini ……………………………………………………… 11.
2.6. Transformacija pravokutnih koordinata iz jednog koordinatnog
sustava u drugi …………………………………………………………… 12.
3. Visual Basic ……………………………………………………………………. 13.
3.1. Objektno orijentirano programiranje …………………………………….. 13.
3.2. Struktura programa ……………………………………………………….. 14.
4. Program Visual GAUSS ……………………………………………………….. 15.
4.1. Početna forma (splash screen) ……………………………………………. 17.
4.1.1. Popis kontrola na početnoj formi ………………………………… 18.
4.1.2. Programski kôd početne forme …………………………………... 19.
4.2. Forma "Izbor" ……………………………………………………………. 20.
4.2.1. Popis kontrola na formi "Izbor" ………………………………….. 21.
4.2.2. Programski kôd forme "Izbor" …………………………………… 21.
4.3. Forma "Zadatak 1" ……………………………………………………….. 23.
4.3.1. Popis kontrola na formi "Zadatak 1" ……………………………... 28.
4.3.2. Programski kôd forme "Zadatak 1" ………………………………. 29.
4.4. Forma "Zadatak 2" ………………………………………………………... 37.
4.4.1. Popis kontrola na formi "Zadatak 2" ……………………………… 38.
4.4.2. Programski kôd forme "Zadatak 2" ………………………………. 38.
4.5. Forma "Zadatak 3" ………………………………………………………... 42.
4.5.1. Popis komandi na formi "Zadatak 3" ……………………………... 44.
4.5.2. Programski kôd forme "Zadatak 3" ………………………………. 44.
4.6. Forma "Zadatak 4" ………………………………………………………... 50.
4.6.1. Popis komandi na formi "Zadatak 4" ……………………………... 51.
4.6.2. Programski kôd forme "Zadatak 4" ……………………………….. 51.
4.7. Forma "Zadatak 5" ………………………………………………………... 58.
4.7.1. Popis komandi na formi "Zadatak 5" ……………………………... 59.
4.7.2. Programski kôd forme "Zadatak 5" ………………………………. 59.
4.8. Forma "Zadatak 6" ……………………………………………………….. 66.
4.8.1. Popis kontrola na formi "Zadatak 6" …………………………….. 67.
4.8.2. Programski kôd forme "Zadatak 6" ……………………………… 67.
4.9. Forma "Spremanje" ………………………………………………………. 71.
3
4.9.1. Popis komandi na formi "Spremanje" ……………………………. 72.
4.9.2. Programski kôd forme "Spremanje" ……………………………… 73.
4.10. Modul "Konstante" ……………………………………………………….. 75.
4.10.1. Programski kôd modula "Konstante" …………………………….. 75.
5. Testiranje programa ……………………………………………………………. 79.
5.1. Testiranje prvog zadatka …………………………………………………. 79.
5.2. Testiranje drugog zadatka ………………………………………………... 81.
5.3. Testiranje trećeg zadatka …………………………………………………. 82.
5.4. Testiranje četvrtog zadatka ………………………………………………. 83.
5.5. Testiranje petog zadatka …………………………………………………. 84.
5.6. Testiranje šestog zadatka ………………………………………………… 85.
6. Literatura ………………………………………………………………………. 86.
7. Sažetak…………………………………………………………………………. 87.
4
Predgovor
Osnovu ovog diplomskog rada čini program, napravljen u Visual Basicu, za računanja u
Gauss-Krügerovoj projekciji, pod imenom VisualGAUSS. Pored objašnjenja samog programa
tu su još i poglavlja o programskom jeziku Visual Basic, poglavlje s formulama za računanja
u Gauss-Krügerovoj projekciji te testiranje programa. Budući da sam imao na raspolaganju
program GAUSHN, napravljen za istu svrhu u programu QBASIC, često sam se pozivao na
njega, naročito pri testiranju programa gdje je poslužio kao predložak za kontrolu računanja
programa VisualGAUSS.
Želio bih se zahvaliti svim osobama koje su radile na izradi tog programa zbog toga što su mi
umnogome olakšale stvaranje mog programa, koristio sam njihove matematičke izvode već
prilagođene računalnoj obradi, a tokom cijele izrade diplomskog rada uspoređivao sam
kvalitetu svog programa s programom GAUSHN.
Također se zahvaljujem svom mentoru, prof. dr. sc. Nedjeljku Frančuli na svesrdnoj pomoći i
savjetima koji su mi najviše pomogli.
5
1. Uvod
Gauss-Krügerova projekcija je poprečna cilindrična projekcija elipsoida u ravninu, te pripada
grupi tzv. "geodetskih projekcija", odnosno projekcija za potrebe državne izmjere. To su
projekcije koje služe za određivanje pravokutnih koordinata trigonometrijskih točaka u
ravnini. Takva projekcija treba poslužiti kao matematička osnova za sva računanja u ravnini i
za izradu planova i karata najkrupnijih mjerila.
Austrija je bila prva država koja je uvela Gauss-Krügerovu projekciju za potrebe državne
izmjere 1917.god., slijedila je Njemačka 1923.god., a Jugoslavija je
Gauss-Krügerovu projekciju uvela 1924.god.
Projekcija je dobila ime po velikom njemačkom znanstveniku Carlu-Friedrichu Gaussu
(1777-1855) koji je i geodeziju zadužio mnogim otkrićima. Između 1821. i 1825. godine on je
pri izračunavanju hanoverske triangulacije za preslikavanje s elipsoida u ravninu primjenio
način preslikavanja koji danas nosi njegovo ime. Prof. dr. L. Krüger je 1912. objavio knjigu o
toj projekciji, a 1919. zbirku formula za praktičnu primjenu, te se od tada ta projekcija naziva
Gauss-Krügerova projekcija. U literaturi s engleskog govornog područja ova se projekcija
susreće pod nazivom Transverse Mercator Projection.
Budući da se geodetske projekcije osim za izradu karata krupnih mjerila koriste kao osnova za
sva računanja u ravnini, to je u njihovom proučavanju osim računanja geodetskih koordinata u
ravnini iz geografskih koordinata potrebno riješiti i niz ostalih zadataka:
1. računanje geografskih koordinata iz pravokutnih koordinata u ravnini projekcije
2. račuanje konvergencije meridijana iz geografskih i pravokutnih koordinata
3. računanje linearnog mjerila iz geografskih i pravokutnih koordinata
4. računanje redukcije pravaca i dužina
5. računanje pravokutnih koordinata točke, kad su zadane pravokutne koordinate jedne
točke i duljina i azimut geodetske linije
6. računanje duljina i azimuta geodetske linje iz pravokutnih koordinata dviju točaka
7. transformacija koordinata između susjednih koordinatnih sustava
6
2. Osnovne formule za računanja u Gauss-Krügerovoj
projekciji
2.1. Računanje pravokutnih koordinata i konvergencije meridijana iz
geografskih koordinata
f =konst.
l=ko
nst.
+x
+y
Ty
x
x
x0=B0
P0
f
x
T
+y
l=ko
nst.
f =konst.
y
+x
x
x0=B
P0
Slika 2.1: Računanje pravokutnih koordinata iz geografskih koordinata
=co
nst.
=co
nst.
cy
x
c
T
y
x
Slika 2.2: Konvergencija meridijana
Pravokutne koordinate računamo po formulama:
6
3
4
2
2
1 )()()( lxlxlxBx ,
5
3
3
21 )()()( lylylyy .
7
Pri čemu je:
)6sin6
4sin4
2sin2
)(1( 000
0
2 DCB
AeB ,
cos)( 1 Ny ,
)1(6
cos)( 22
3
2
tN
y ,
)5814185(120
cos)( 22242
5
3 tttN
y
,
cossin2
)( 1
Nx ,
)495(cossin24
)( 4223
2 tN
x ,
)5861(cossin720
)( 425
3 ttN
x .
Konvergencija meridijana se računa na ovaj način:
5
2
3
1 )()(sin lclclc .
Koeficijente u gornjoj formuli računamo po ovim formulama:
)231(cossin3
1)( 422
1 c ,
)2(cossin15
1)( 24
2 tc .
Pri čemu je:
22 sin1 eaN ,
2
22 )(
a
bae
,
2
22 )('
b
bae
.
B- dužina luka meridijana od ekvatora do paralele s geografskom širinom
l- razlika geografskih dužina srednjeg meridijana ( 0 ) i neke točke u odnosu na početni
meridijan ( 0 l )
N- polumjer zakrivljenosti prvog vertikala
φ- geografska širina
t- tg
- cos'e (e'- drugi linearni ekscentricitet elipse)
0A =1.00503730594646
8
0B =0.00504784913836498
0C =0.0000105637864667293
0D =0.0000000206333485024118
2.2. Računanje geografskih koordinata i konvergencije meridijana iz
pravokutnih koordinata
+x
T
l=ko
nst.
f =konst.
+y
f
P0
x0=B0
+y
f =konst.
l=ko
nst.
T
x0=B
+x
P0
F
x
f 1=konst.
F
f
Slika 2.3: Računanje geografskih koordinata iz pravokutnih koordinata
Geografske koordinate računamo po formulama:
6
3
4
2
2
11 )()()( yyy ,
5
3
3
21 )()()( ylylyll .
Pri čemu je:
)1(2
)( 2
12
1
11
N
t,
)6635(24
)( 2
1
2
1
2
1
2
14
1
12 tt
N
t ,
)459061(720
)( 4
1
2
16
1
13 tt
N
t ,
11
1cos
1)(
Nl ,
1
3
1
2
1
2
12
cos6
21)(
N
tl
,
1
5
1
4
1
2
13
cos120
24285)(
N
tl
.
9
Konvergenciju meridijana računamo pomoću:
5
5
3
43 )()()( ycycycc .
Vrijednosti koeficijenata računamo ovako:
1
13 )(
N
tc ,
)1(3
)( 2
1
2
13
1
14 t
N
tc ,
)352(15
)( 4
1
2
15
1
15 tt
N
tc .
l- razlika geografskih dužina srednjeg meridijana ( 0 ) i neke točke u odnosu na početni
meridijan ( 0 l )
N- polumjer zakrivljenosti prvog vertikala
φ- geografska širina
t- tg 1
- 1cos' e (e'- drugi linearni ekscentricitet elipse)
2.3. Računanje redukcije pravca i dužine
P
E1E
P1
T 1s T 2
x
y
T 2
'
T 1'
d
s'
y 2
y 1x2
x1
x
y
T 2'
T 1'
d
s'
u
v
Slika 2.4: Geodetska linija na elipsoidu(s) i njezina projekcija(s')
te redukcije pravaca 2
1 i 1
2
Redukcija dužine se računa po ovoj formuli:
6
4 21 mmm
s
d m ,
10
4
4
2
2
2421
R
y
R
ym ,
MNR ,
322
2
)sin1(
)1(
e
eaM
.
Redukcije pravaca računamo ovako:
21
2
1 ,
)( 21
2
1 ,
yykyxkyxk mmm 2
3
3
211 ,
xyk 42 .
Varijable 4321 ,,, kkkk određujemo pomoću:
2
''
12 mR
k
,
4
''
26 mR
k
,
3
2
''
3
m
mm
R
tk
,
2
''
412 mR
k
.
s - duljina geodetske linije na elipsoidu ,
d - duljina pravca između dviju točaka u ravnini ,
my - ordinata točke na polovici geodetske linije ,
mR - polumjer zakrivljenosti na srednjoj širini m ,
mm t, - veličine koje se odnose na srednju geografsku širinu m .
11
2.4. Računanje pravokutnih koordinata u ravnini iz azimuta i duljine
geodetske linije
y
c
T 1(y1,x1)
l2=const.
l1=const.
tangenta
+ys'
d
+x
T 2(y2,x2)
x
Slika 2.5: Prvi geodetski zadatak
Zadatak se rješava po ovim formulama:
yyy 12 , xxx 12 ,
2
1sindy , 2
1cosdx ,
2
1
2
1
2
1 c , 6
4 21 mmm
s
d m .
Konvergencija meridijana se računa po formuli navedenoj u odjeljku 2.2.
Za računanje veličine 2
1 i mjerila 2m i mm potrebne su približne koordinate točke koja se
računa, a te koordinate se izračunavaju po formulama:
0102 )( yyy , 0102 )( xxx ,
2
10 sin sy , 2
10 cos sx ,
gdje je
c 2
1
2
1
12
2.5. Računanje duljine i azimuta geodetske linije iz pravokutnih koordinata
dviju točaka u ravnini
T 1
T 2
y 1
x1
y 2
x2
+ys'
d
+x
Slika 2.6: Drugi geodetski zadatak
6
4 21 mmm
s
d m , 22 yxd ,
2
11
2
1
2
1 c ,
1
22
1
2
1
2 c .
1
2
2
1 , azimuti geodetske linije u prvoj i drugoj točki
1
2
2
1 , smjerni kutovi u prvoj i drugoj točki
c konvergencija meridijana
1
2
2
1 , popravci za zakrivljenost projekcije geodetske linije u prvoj i drugoj točki
13
2.6. Transformacija pravokutnih koordinata iz jednog koordinatnog
sustava u drugi
=const.
=const.
ekvator
L L0L'
l0 l0
l l'
T
T1
T0
x
x0
y0
y
x1=B0=x0 x2=B0'
T2
y0'
y'
x0'
y
x
Slika 2.7: Susjedni koordinatni sustavi
542
4
3242
2
22
2
322
2)185(
120
1)21(
6
1
2
1)1(
6
1' ztt
Nytt
Nyzt
Nzt
Nzy
442
4
3242
4
2342
4)38(
24
1)21(
12
1)5(
12
1yztt
Nyztt
Nyztt
N
542
4)4185(
120
1ytt
N
2222
3
422
3
22 )1(4
)95(24
)(2
' yztN
tzt
N
tyz
N
txx
422
3
322
3)35(
24)21(
6yt
n
tyzt
N
t
xy, -koordinate točke u sustavu iz kojeg se transformiraju točke,
',' xy -koordinate točaka u sustavu u koji se transformiraju točke,
1cos Nyz (pri prijelazu iz istočnog u zapadni sustav uzima se s negativnim
predznakom)
1 -širina točke F koja leži na srednjem meridijanu zadanog sustava i ima apscisu x ,
14
3. Visual Basic
Visual Basic je Windows aplikacija za izradu programa prilagođenih korisniku.
Jedan je od najpoznatijih programskih jezika temeljenih na teoriji tzv. objektno orijentiranog
programiranja.
Proizvod je korporacije Microsoft, što jamči izvrsnu povezanost s drugim softverskim
proizvodima iste tvrtke, a dostupan je u tri verzije koje se razlikuju po svojim mogućnostima i
količini ugrađenih funkcija. To su :
-Learning edition
-Professional edition
-Enterprise edition
3.1. Objektno orijentirano programiranje
Kod Basica i Qbasica (kao i kod svih drugih tradicionalnih programskih jezika) izvršenje
programa počinje prvim napisanim redom izvršnog kôda i slijedi unaprijed definirani put,
pozivajući po potrebi potprograme. Programi se izvršavaju sekvencijalno, tj. naredbe se
izvršavaju u nizu jedna za drugom.
Kod programa upravljanim događajima (event-driven application), u koje se ubraja i Visual
Basic to je riješeno na drukčiji način. Kod njih također postoji početna točka programa ali od
tada se svi događaji koje uzrokuje korisnik predaju programu, koji na njih odgovara pozivom
kôda. Stoga redoslijed u kojem će se kôd izvršavati ovisi o tome koji događaj će se dogoditi,
što ovisi o tome što čini korisnik.
Kôd koji se poziva u Visual Basicu zove se procedura događaja. Procedura događaja je dio
programa koji se izvršava kad korisnik (mišem ili tipkovnicom) uzrokuje neki događaj.
To je zapravo osnovna ideja grafičkog korisničkog sučelja ( graphical user interface- GUI ) i
programiranja upravljanog događajima: korisnik upravlja događajima, odnosno određuje
smjer izvršavanja programa dok kôd odgovara na te događaje.
Kod strukturiranih programskih jezika (Basic, C, Pascal i dr.) kreiranje grafičkog korisničkog
sučelja je zahtijevalo pisanje velike količine programskog kôda, jer se samo tako moglo
definirati izgled, položaj i funkciju svakog elementa. Danas se to rješava mnogo lakše i
efikasnije tako da jednostavno dodajemo postojeće objekte na željeno mjesto na ekranu.
Pojedini objekti se povezuju u složenu cjelinu pomoću prozora koji se naziva forma (form).
Objekti koji se stavljaju na formu nazivaju se kontrolni objekti ili kontrole (controls).
Temeljne kontrole na koje nailazimo u svim Windows aplikacijama su:
-gumbi naredbi (command buttons)
-izborni gumbi (option buttons)
-kontrolni okviri (check boxes)
-linije pomicanja (scroll bars)
-okviri liste (list boxes) i sl.
Pojam objekt se odnosi na sve forme, kontrole i posebne objekte (npr. Printer, Screen i sl.)
Svaki objekt ima određena svojstva (Properties), a to su atributi pomoću kojih se utječe na
izgled i ponašanje objekta. Na objekte se primjenjuju postupci (Methods), npr. Postupak Move
pomiče formu ili kontrolu na koju se odnosi.
15
Slika 3.1: Izgled sučelja Visual Basica 6.0
3.2. Struktura programa
Visual Basic ima razvojnu okolinu koja omogućava stvaranje formi i pisanje kôda. Program
se u Visual Basicu naziva projekt (datoteka s ekstenzijom .VBP), a sastoji se iz grafičkog
sučelja (forme i kontrole) i procedura događaja (oboje spremljeno u datoteke s
ekstenzijom .FRM). Kôd čine procedure događaja i moduli. Procedure događaja vežu se uz
događaj na nekoj kontroli ili formi i čine sastavni dio forme.
Za razliku od njih, moduli su dijelovi programa koji obično ne pripadaju nijednoj formi i
mogu se pozvati iz bilo kojeg dijela programa. Moduli su datoteke s ekstenzijom .BAS, što
asocira da sadrže Basic kôd. U modulima obično definiramo globalne konstante i varijable
(prepoznatljive u cijelom programu) te pišemo kôd za funkcije koje pozivamo više puta
tijekom izvođenja programa, da bismo izbjegli njihovo višestruko pisanje.
Pisanje programa odvija se u dva jednako važna koraka:
-stvaranje grafičkog sučelja
-pisanje programskog kôda
Prvi zadatak kod programiranja je stavljanje kontrola na formu (kontrole jedinstvene svim
Windows aplikacijama) a zatim slijedi pisanje odgovarajućeg kôda.
16
4. Program Visual GAUSS
Visual GAUSS je napravljen na temelju postojećeg programa GAUSHN, izrađenog na
Geodetskom fakultetu 1992. god. u programskom jeziku QBASIC i modificiranog 2000. god.
Pri rješavanju zadatka nastojao sam zadržati strukturu postojećeg programa da bih što više
olakšao upotrebu onim korisnicima koji su se već koristili programom GAUSHN.
Program se sastoji iz deset logičkih cjelina:
1) početna forma sa osnovnim podacima o programu (tzv. splash screen)
2) forma sa ponuđenih šest zadataka
3) forma za računanje pravokutnih koordinata u ravnini i konvergencije meridijana iz
geografskih koordinata
4) forma za računanje geografskih koordinata i konvergencije meridijana iz
pravokutnih koordinata u ravnini
5) forma za računanje redukcije pravca i duljine
6) forma za računanje pravokutnih koordinata u ravnini iz duljine i azimuta geodetske
linije
7) forma za računanje duljine i azimuta geodetske linije iz pravokutnih koordinata u
ravnini
8) forma za transformaciju pravokutnih koordinata iz jednog sustava u drugi
9) forma za spremanje izračunatih podataka u odabranu datoteku
10) modul sa definiranim konstantama i varijablama te s nekoliko često korištenih
funkcija.
Svaki od tih dijelova, zahvaljujući načinu pisanja aplikacije u Visual Basicu, predstavlja
zasebnu logičku cjelinu koja je neovisna od ostatka programa te bi, uz minimalne preinake,
mogla zasebno ispravno raditi ili se koristiti u nekoj drugoj aplikaciji. Zbog toga će i sam
program biti objašnjen po tim cjelinama.
Svaki zadatak je riješen na gotovo identičan način, što olakšava korištenje programa, tako da
sve komandne gumbe vidimo na istom mjestu na svim formama a razlike su samo u podacima
koji se unose i koje dobijemo na kraju računanja.
Na početku svake forme vidimo samo lijevu stranu koja služi za unos podataka od strane
korisnika dok se desna pojavljuje tek nakon pritiska na gumb "Računaj".
Pri pomicanju između kontroli na formama koristimo se pokazivačem miša ili tipkom "Tab".
Pri ograničavanju unosa samo na znamenke koristio sam se istim programskim kôdom na
svim formama, koristeći ASCII-kôdove. Jedina loša strana takvog ograničavanja unosa je
nemogućnost korištenja razmaknice, entera i backspacea jer one nemaju određen ASCII-kôd
pa nisam bio u mogućnosti uključiti ih u dozvoljene znakove.
Pripadni programski kôd je:
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 End If
To je riješeno pomoću If...Then petlje koja kontrolira da ASCII-kôd unešenog znaka nije
manji od ASCII-kôda znaka "0" ili veći od znaka "9".
Ako pokušamo unijeti bilo koji drugi znak, javi se poruka o grešci u standardnom Windows
obliku:
17
Slika 4.1: Izgled poruke o grešci pri unosu
Sve forme zadataka su napravljene pomoću tri vrste kontrola:
1) komandne tipke- služe za izazivanje procedure nekog događaja, npr. procedura
događaja pritiska (klika) tipke "Kraj" prekida rad s programom
2) okviri teksta- služe za unos podataka od strane korisnika te prikaz izračunatih
vrijednosti
3) oznake (labels)- služe pobližem objašnjenju funkcije svake kontrole
Slika 4.2: Komandne tipke, okviri teksta i oznake
Sve kontrole su opremljene s pomoćnim tekstom (eng. tooltip text) koji služi za pojašnjavanje
svake pojedine kontrole na formama, a pojavljuje se nakon što ostavimo pokazivač miša da
miruje na određenoj kontroli.
18
Slika 4.3: Izgled pomoćnog teksta
Budući da su matematičke formule preuzete gotovo u potpunosti iz programa GAUSHN, a
svode se na osnovne formule za računanja u Gauss-Krügerovoj projekciji koje su već
objašnjene, one neće biti navedene u objašnjenju zadataka.
Sam postupak računanja se pokreće nakon što smo unijeli sve neophodne vrijednosti te
pritisnuli tipku "Računaj".
4.1. Početna forma (splash screen)
Slika 4.4: Izgled početnog prozora
19
Pri pokretanju programa pojavljuje se početni prozor s osnovnim podacima o programu.
Do glavnog dijela programa se dolazi pritiskom bilo koje tipke na tipkovnici ili pritiskom na
tipku miša, što je riješeno pomoću sljedećeg programskog kôda:
Private Sub Form_Click() izbor.Show Unload Me End Sub Private Sub Form_KeyPress(KeyAscii As Integer) izbor.Show Unload Me End Sub
Procedura Form_Click() znači pritisak bilo koje tipke a procedura Form_KeyPress(KeyAscii
As Integer) označava pritisak tipke miša. Naredba izbor.Show prikazuje formu nazvanu
"Izbor" dok naredba Unload Me briše početnu formu iz memorije.
Budući da se na formi nalazi nekoliko oznaka s tekstom, ista procedura mora biti napisana i za
njih, jer u protivnom klik mišem na njih ne bi izazvao željeni odgovor.
4.1.1. Popis kontrola na početnoj formi
Radi lakšeg čitanja, prije samog izlistavanja programskog kôda, navest ću popis kontrolâ s
njihovim imenima uz objašnjenja osnovnih naredbi.
Neću se upuštati u detaljno objašnjenje programa zbog toga što bi to zahtjevalo i objašnjenje
sintakse i velikog broja naredbi Visual Basica, što ne spada u temu ovog diplomskog rada.
Za to nema ni posebne potrebe jer je većina naredbi ista, ili barem slična, naredbama u
klasičnom BASIC-u, pa tok programa može pratiti svatko tko je programirao u BASIC-u.
Splash - naziv forme
Frame1 - okvir unutar kojeg se nalazi sav tekst
Label-Label4 - oznake pomoću koji je napisan tekst na formi
Na početku se vidi izraz "Option Explicit", koji znači da svaka varijabla i konstanta mora biti
definirana na početku a u svrhu transparentnijeg pisanja sintakse i smanjivanja mogućnosti
greški kod programiranja.
Svaka kontrola ima određen broj događaja, npr. click, dblclick (dvostruki klik), keypress
(pritisak tipke), mousemove (pokret miša na kontroli) i sl. Kod programiranja se pišu
procedure (možemo ih uvjetno nazvati potprogramima) za željeni događaj i to u ovakvom
obliku:
Private Sub Frame1_Click()
Nakon skupa naredbi procedura događaja završava s izrazom "End Sub".
20
4.1.2. Programski kôd početne forme Option Explicit Private Sub Form_Click() izbor.Show Unload Me End Sub Private Sub Form_KeyPress(KeyAscii As Integer) izbor.Show Unload Me End Sub Private Sub Frame1_Click() izbor.Show Unload Me End Sub Private Sub Label1_Click() izbor.Show Unload Me End Sub Private Sub Label2_Click() izbor.Show Unload Me End Sub Private Sub Label3_Click() izbor.Show Unload Me End Sub Private Sub Label4_Click() izbor.Show Unload Me End Sub
21
4.2. Forma "Izbor"
Slika 4.5: Izgled forme "Izbor"
Na ovoj formi su prikazani osnovni zadaci za računanje u Gauss-Krügerovoj projekciji
pomoću gumba izbora. Moguće je istovremeno odabrati samo jednu od opcija a izbor vršimo
dvostrukim pritiskom lijeve tipke miša ili jednim pritiskom na opciju te pritiskom na tipku
"Dalje", analogno kao u većini Windows aplikacija. Isto možemo napraviti pomoću
tipkovnice tako da strelicama namjestimo fokus na željenu opciju te pritisnemo tipku "Enter".
Programski kod je i za ovu formu prilično jednostavan, a osnovni dio je povezan s tipkom
"Dalje":
Private Sub dalje_Click() If Opcija1.Value = True Then zadatak1.Show ElseIf Opcija2.Value = True Then zadatak2.Show ElseIf Opcija3.Value = True Then zadatak3.Show ElseIf Opcija4.Value = True Then zadatak4.Show ElseIf Opcija5.Value = True Then zadatak5.Show ElseIf Opcija6.Value = True Then zadatak6.Show
22
Else: MsgBox "Odaberite jednu od opcija prije nastavka programa", vbExclamation, "Upozorenje" Exit Sub End If izbor.Hide End Sub
Ako je jedna od opcija odabrana (ako je njena vrijednost istinita, odnosno true), prikazuje se
forma odgovarajućeg zadatka, u protivnom se prikazuje upozorenje da nije odabrana ni jedna
opcija i vraćamo se na formu "Izbor". Ukoliko je odabrana jedna od opcija prikazuje se forma
dotičnog zadatka, dok se forma "Izbor" sakriva (odlučio sam se za sakrivanje, umjesto
izbacivanja forme iz memorije, zbog toga što je moguće često mijenjati željeni zadatak, za to
nam treba forma "Izbor" a na ovaj način ona je uvijek aktivna u pozadini programa.
U slučaju dvostrukog pritiska lijeve tipke miša na jednu od opcija, program poziva proceduru
za slučaj pritiska tipke "Dalje", što također daje ispravan rezultat. Programski kôd za sve
opcije je analogan a ovdje navodim kôd za prvu opciju:
Private Sub Opcija1_DblClick() Call dalje_Click End Sub
Pritiskom na tipku "Kraj" završavamo rad s programom (isti rezultat postižemo pritiskom na
tipku "Esc") pomoću sljedećeg koda:
Private Sub kraj_Click() End End Sub
4.2.1. Popis kontrola na formi "Izbor"
Izbor - naziv forme
Frame1 - okvir
Label1 - oznaka s tekstom
Opcija1-Opcija6 - opcije za šest zadataka
Dalje - komandna tipka za nastavak rada s programom
Kraj - komandna tipka za kraj rada s programom
4.2.2. Programski kôd forme "Izbor"
Option Explicit Private Sub dalje_Click() If Opcija1.Value = True Then zadatak1.Show ElseIf Opcija2.Value = True Then zadatak2.Show ElseIf Opcija3.Value = True Then
23
zadatak3.Show ElseIf Opcija4.Value = True Then zadatak4.Show ElseIf Opcija5.Value = True Then zadatak5.Show ElseIf Opcija6.Value = True Then zadatak6.Show Else: MsgBox "Odaberite jednu od opcija prije nastavka ", vbExclamation, "Upozorenje" Exit Sub End If izbor.Hide End Sub Private Sub kraj_Click() End End Sub Private Sub Opcija1_DblClick() Call dalje_Click End Sub Private Sub Opcija2_DblClick() Call dalje_Click End Sub Private Sub Opcija3_DblClick() Call dalje_Click End Sub Private Sub Opcija4_DblClick() Call dalje_Click End Sub Private Sub Opcija5_DblClick() Call dalje_Click End Sub Private Sub Opcija6_DblClick() Call dalje_Click End Sub
24
4.3. Forma "Zadatak 1"
Ovaj dio programa služi za računanje pravokutnih koordinata u ravnini i konvergencije
meridijana iz geografskih koordinata.
Na početku rada s ovom, kao i sa svim ostalim formama, vidljiva je samo lijeva strana,
odnosno dio predviđen za unos podataka, te je na taj način olakšano snalaženje u programu.
Slika 4.6: Izgled lijeve strane forme "Zadatak 1" prije računanja
Vrijednosti se unose u okvire teksta (eng. text box) i to na način da je u okvir teksta predviđen
za ime točke dopušten unos svih znakova, dok je u ostalim okvirima dopušten unos samo
brojeva.
Iz praktičnih razloga sam podijelio unos stupnjeva, minuta, sekundi i decimala u posebne
okvire teksta, na taj način je moguće kontrolirati da su sve veličine u dozvoljenim granicama.
Tek nakon što smo unijeli sve neophodne vrijednosti za računanje možemo nastaviti s radom,
a ako pokušamo računati bez svih vrijednosti pojavit će se poruka o grešci nakon koje se
kursor postavlja na prvo nepopunjeno mjesto u formularu. Budući da ime točke nije
neophodan podatak možemo nastaviti s radom i bez njega.
25
Slika 4.7: Izgled poruke o grešci pri unosu
Pripadni programski kôd je objašnjen na primjeru za unos sekundi geografske širine, te je
riješeno analogno za sve ostale. If...Then petlja služi za postavljanje fokusa na okvir teksta
koji nije ispunjen, u pripadnom primjeru na okvire teksta za stupnjeve i minute:
If Txtfistu.Text = "" Or txtfimin = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" If Txtfistu.Text = "" Then Txtfistu.SetFocus ElseIf txtfimin = "" Then txtfimin.SetFocus End If Exit Sub End If
Pri unosu podataka u svaki okvir teksta kontrolira se vrijednost unešenog broja, te ako ona
prelazi zadane granice pojavljuje se poruka o grešci nakon koje se dotični okvir teksta briše te
ponovo unosimo pripadnu vrijednost. Osnovna svrha ove kontrole je otkrivanje grubih
grešaka pri unosu podataka. Pripadni algoritam je objašnjen na primjeru za unos geografske
širine, dok se kod minuta, sekundi i decimala razlikuje samo u zadanim granicama.
If Val(Txtfistu.Text) < 0 Or Val(Txtfistu.Text) > 90 Then KeyAscii = 0 Txtfistu.Text = "" MsgBox "Geografska širina mora biti u rasponu od 0 do 90 stupnjeva", vbExclamation, "Upozorenje" Txtfistu.SetFocus End If Ako je vrijednost geografske širine manja od 0 ili veća od 90 briše se okvir teksta, ispisuje
poruka upozorenja te se na okvir teksta namjesti fokus radi ponovnog unosa.
26
Slika4.8: Izgled poruke o grešci pri unosu neprimjerene geografske širine
Slika 4.9: Izgled forme "Zadatak 1" nakon računanja
Nakon unosa svih veličina i pritiska na gumb "Računaj" postaje vidljiva desna strana forme
na kojoj se nalaze izračunate vrijednosti te postaje aktivna i tipka "Spremi", koja je do tad bila
onemogućena.Taj dio je riješen pomoću svojstava (properties) objekata.
Svojstvo vidljivosti okvira Frame2 je na početku programa podešeno na vrijednost "False", a
mijenja se u istinitu vrijednost tek nakon što smo unijeli sve neophodne podatke za računanje
i pritisnuli tipku "Računaj".
Tipka "Spremi" nam postaje dostupna mijenjanjem svojstva "Enabled"(omogućen) na
analogan način. Dio programa koji nam to omogućava je sljedeći:
Frame2.Visible = True CmdSpremi.Enabled = True
27
Nakon računanja dolazimo do dijela koji je praktički isti za sve zadatke pa će biti objašnjen
samo u ovom poglavlju.
Najvažnija je mogućnost spremanja u datoteku po vlastitom izboru, što se postiže pritiskom
na gumb "Spremi". Nakon toga se otvara prozor za pohranjivanje, koji omogućuje
pohranjivanje u već postojeću datoteku ili kreiranje nove, s vlastitim imenom i ekstenzijom te
na točno određeno mjesto i točno određeni medij za pohranu podataka.
Prozor za pohranjivanje će biti objašnjen u posebnom poglavlju, a ovdje slijedi samo
objašnjenje vezano uz prvi zadatak.
Programski kôd za rješavanje ove zadaće je sljedeći:
Private Sub Cmdspremi_Click() Spremanje.Label1.Caption = "" Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = "" Spremanje.Label4.Caption = "" Spremanje.Label5.Caption = "" Spremanje.Label6.Caption = "" Spremanje.Label7.Caption = "" Spremanje.Label8.Caption = "" On Error GoTo greška decfi = Val(Txtfisek) + Val(Txtfidec) / 10000 decla = Val(txtlasek) + Val(Txtladec) / 10000 fi = Txtfistu + "-" + txtfimin + "-" + decfi LA = Txtlastu + "-" + txtlamin + "-" + decla Spremanje.Label1.Caption = "Točka: " + Txtimetočke.Text Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = "Fi= " + fi + " La= " + LA Spremanje.Label4.Caption = "Yp= " + Txtneredy.Text + " Xp= " + Txtneredx.Text Spremanje.Label5.Caption = "Y= " + Txtreducy.Text + " X= " + Txtreducx.Text Spremanje.Label6.Caption = "c= " + Txtkonvst.Text Spremanje.Label7.Caption = "RAČUNANJE PRAVOKUTNIH KOORDINATA U RAVNINI I" Spremanje.Label8.Caption = "KONVERGENCIJE MERIDIJANA IZ GEOGRAFSKIH KOORDINATA" Spremanje.Show greška: Exit Sub End Sub
Linije kôda "On Error GoTo greška" te "greška: Exit Sub" omogućavaju takozvano "hvatanje
grešaka", odnosno pri grešci izlazimo iz programa. Pritiskom na tipku "Obriši" se koristimo
kad želimo obrisati sve podatke koje smo unijeli za dotičnu točku, bilo kad tijekom rada na
formi, nakon čega se fokus postavlja na okvir teksta za unos imena točke. Taj gumb možemo
također koristiti nakon što smo izračunali željene vrijednosti ali ih ne želimo spremiti, već
hoćemo nastaviti računati sljedeće točke.
Tada, osim što briše unešene podatke, taj gumb ima zadaću skrivanja desne strane forme i
onemogućavanja korištenja gumba "Spremi".
To se postiže sljedećim linijama programskog kôda:
28
Private Sub Cmdobriši_Click() Txtimetočke = "": Txtfistu = "": txtfimin = "": Txtfisek = "": Txtfidec = "" Txtlastu = "": txtlamin = "": txtlasek = "": Txtladec = "" Frame2.Visible = False Txtimetočke.SetFocus End Sub
Da bi se omogućilo korištenje istog prozora za spremanje u svih šest zadataka, a radi
jednostavnije i kraće sintakse, na formi "Spremanje" se nalazi osam praznih oznaka
(eng.label-kontrole koje omogućuju unos teksta od strane korisnika ili samog programa)
kojima se dodaje odgovarajući sadržaj, u zavisnosti od zadatka koji smo rješavali. U prvom
zadatku su oznakama dodijeljene ove vrijednosti: ime točke, Fi, La, Yp, Xp, Y, X, c.
Za primjer sa sl.3.8 podaci se pohranjuju u datoteku u ovom obliku:
Slika 4.10: Izgled spremljene datoteke u .txt formatu
Pritisak na tipku "Povratak" nas vraća na formu za odabir željenog zadatka, što se postiže
jednostavnim izrazom koji briše dotad aktivnu formu iz memorije a aktivira formu "Izbor":
Private Sub povratak_Click() Unload Me Izbor.Show End Sub
Tipka "Kraj" omogućuje prestanak rada s programom pomoću poznate naredbe "End":
Private Sub kraj_Click() End End Sub
29
Na ovoj, kao i na svim sljedećim formama, po kontrolama se možemo kretati pomoću tipke
"Tab" i to tako da se fokus postavlja prvo na okvire teksta na lijevoj strani (okviri koji služe
unosu podataka), od imena točke naniže. Nakon toga se fokus postavlja redom na komandne
tipke "Računaj", "Spremi"(može dobiti fokus samo ako je aktivna), "Obriši", "Povratak" i
"Kraj" a ako pritisnemo ponovo tipku "Tab" počinjemo novi krug od okvira teksta za ime
točke. Na svim formama su također definirani i tzv. default (gumb za potvrdu) i cancel
( gumb za prekid), što znači da pritisak na tipku "Enter" na tipkovnici izaziva istu radnju kao i
pritisak na tipku "Računaj" na formi, a pritisak tipke "Cancel" na tipkovnici istu radnju kao
pritisak na tipku "Povratak" na formi. Kod ovog zadatka matematički postupak slijedi linearan
put, odnosno sve formule se nalaze u glavnom dijelu programa, jer se te formule koriste samo
u ovom zadatku pa nema potrebe za njihovim odvajanjem u modul (moduli se upotrebljavaju
za definiranje funkcija, varijabli i konstanti koje se koriste na više mjesta u programu da
bismo izbjegli višestruko pisanje identičnog programskog kôda).
4.3.1. Popis kontrola na formi "Zadatak 1"
Zadatak1 - naziv forme
Frame1 - okvir na lijevoj strani forme
Frame2 - okvir na desnoj strani forme
Label1-Label18 - nazivi oznaka na formi
Txtimetočke - okvir teksta za unos naziva točke
Txtfistu - okvir teksta za unos stupnjeva geografske širine
Txtfimin - okvir teksta za unos minuta geografske širine
Txtfisek - okvir teksta za unos sekundi geografske širine
Txtfidec - okvir teksta za unos decimala geografske širine
Txtlastu - okvir teksta za unos stupnjeva geografske dužine
Txtlamin - okvir teksta za unos minuta geografske dužine
Txtlasek - okvir teksta za unos sekundi geografske dužine
Txtladec - okvir teksta za unos decimala geografske dužine
Txtneredx - okvir teksta za ispis izračunate nereducirane koordinate X
Txtneredy - okvir teksta za ispis izračunate nereducirane koordinate Y
Txtreducx - okvir teksta za ispis izračunate reducirane koordinate X
Txtreducy - okvir teksta za ispis izračunate reducirane koordinate Y
Txtkonvst - okvir teksta za ispis konvergencije meridijana u stupnjevima
Rač - komandna tipka za računanje
Cmdspremi - komandna tipka za spremanje izračunatih vrijednosti
Cmdobriši - komandna tipka za brisanje lijeve strane forme
Povratak - komandna tipka za povratak na formu "Izbor"
Kraj - komandna tipka za kraj rada s programom
Na početku ove forme nema izraza "Option Explicit", jer u formulama ima jako puno varijabli
koje bi trebalo definirati, pa je bilo jednostavnije raditi bez tog izraza, pri čemu ne treba
definirati ni jednu varijablu.
Loša strana toga je što program ne bi javljao grešku u slučaju krivo napisane formule (npr. pri
množenju i dijeljenju s nulom) pa bi bilo jako teško pronaći grešku, međutim u ovom slučaju
je već postojao matematički dio programskog kôda za koji sam bio siguran da je ispravan, pa
ta opasnost nije postojala.
30
4.3.2. Programski kôd forme "Zadatak 1"
Dim decfi As String Dim decla As String Dim i As Integer Private Sub Cmdobriši_Click() Txtimetočke = "": Txtfistu = "": txtfimin = "": Txtfisek = "": Txtfidec = "" Txtlastu = "": txtlamin = "": txtlasek = "": Txtladec = "" Frame2.Visible = False Txtimetočke.SetFocus End Sub Private Sub Cmdspremi_Click() Spremanje.Label1.Caption = "" Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = "" Spremanje.Label4.Caption = "" Spremanje.Label5.Caption = "" Spremanje.Label6.Caption = "" Spremanje.Label7.Caption = "" Spremanje.Label8.Caption = "" On Error GoTo greška decfi = Val(Txtfisek) + Val(Txtfidec) / 10000 decla = Val(txtlasek) + Val(Txtladec) / 10000 fi = Txtfistu + "-" + txtfimin + "-" + decfi LA = Txtlastu + "-" + txtlamin + "-" + decla Spremanje.Label1.Caption = "Točka: " + Txtimetočke.Text Spremanje.Label2.Caption = "Fi= " + fi + " La= " + LA Spremanje.Label3.Caption = "Yp= " + Txtneredy.Text + " Xp= " + Txtneredx.Text Spremanje.Label4.Caption = "Y= " + Txtreducy.Text + " X= " + Txtreducx.Text Spremanje.Label5.Caption = "c= " + Txtkonvst.Text Spremanje.Show greška: Exit Sub End Sub Private Sub Form_Load() zvj = 0 End Sub Private Sub kraj_Click() End End Sub Private Sub povratak_Click() Unload Me izbor.Show End Sub Private Sub Rač_Click() On Error GoTo greška
31
Frame2.Visible = True fi = (Txtfistu + txtfimin / 60 + Txtfisek / 3600 + Txtfidec / 36000000) * r2 LA = (Txtlastu + txtlamin / 60 + txtlasek / 3600 + Txtladec / 36000000) k = 5 - (LA > 16.5) - (LA > 19.5) l0 = k * 3 DL = (LA - l0) * r2: L2 = DL * DL: L4 = L2 * L2 e2 = e * e: sf = Sin(fi): cf = Cos(fi): CF2 = cf * cf: CF3 = CF2 * cf t = Tan(fi): t2 = t * t: t4 = t2 * t2 eta = ec * cf: et2 = eta * eta: ET4 = et2 * et2 n = A / Sqr(1 - e2 * sf * sf) BX = (1 - e2) * (AO * fi - BO / 2 * Sin(2 * fi) + CO / 4 * Sin(4 * fi) - d00 / 6 * Sin(6 * fi)) * A y1 = n * cf y2 = n * CF3 * (1 - t2 + et2) / 6 Y3 = n * CF3 * CF2 * (5 - 18 * t2 + t4 + 14 * et2 - 58 * t2 * et2) / 120 x1 = n * sf * cf / 2 x2 = n * sf * CF3 * (5 - t2 + 9 * et2 + 4 * ET4) / 24 xp = BX + x1 * L2 + x2 * L4 yp = y1 * DL + y2 * L2 * DL + Y3 * L4 * DL x = m0 * xp y = m0 * yp + k * 1000000 + 500000 C1 = sf * CF2 * (1 + 3 * et2 + 2 * ET4) / 3 C2 = sf * CF2 * CF2 * (2 - t2) / 15 CR = sf * DL + C1 * L2 * DL + C2 * L4 * DL kr = CR xpd = Int(xp * 1000): ypd = Int(yp * 1000): xd = Int(x * 1000): yd = Int(y * 1000) konvergencija1 = radijustu(kr) Txtneredx.Text = xpd / 1000 Txtneredy.Text = ypd / 1000 Txtreducx.Text = xd / 1000 Txtreducy.Text = yd / 1000 Txtkonvst.Text = konvergencija1 Exit Sub greška: Frame2.Visible = False MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje!" If Txtimetočke = "" Then Txtimetočke.SetFocus ElseIf Txtfistu = "" Then Txtfistu.SetFocus ElseIf txtfimin = "" Then txtfimin.SetFocus ElseIf Txtfisek = "" Then Txtfisek.SetFocus ElseIf Txtfidec = "" Then Txtfidec.SetFocus ElseIf Txtlastu = "" Then Txtlastu.SetFocus ElseIf txtlamin = "" Then txtlamin.SetFocus ElseIf txtlasek = "" Then txtlasek.SetFocus
32
ElseIf Txtladec = "" Then Txtladec.SetFocus End If End Sub Private Sub Txtfidec_GotFocus() i = 0 End Sub Private Sub Txtfidec_KeyPress(KeyAscii As Integer) i = i + 1 If Txtfistu.Text = "" Or txtfimin = "" Or Txtfisek.Text = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" If Txtfistu.Text = "" Then Txtfistu.SetFocus ElseIf txtfimin = "" Then txtfimin.SetFocus ElseIf Txtfisek.Text = "" Then Txtfisek.SetFocus End If Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If i = 4 Then Txtlastu.SetFocus Exit Sub End If End Sub Private Sub Txtfidec_LostFocus() If Txtfidec = "" Then Exit Sub If Txtfidec < 10 And i = 1 Then Txtfidec = Txtfidec * 1000 ElseIf Txtfidec < 10 And i = 2 Then Txtfidec = Txtfidec * 100 ElseIf Txtfidec < 10 And i = 3 Then Txtfidec = Txtfidec * 10 ElseIf Txtfidec < 100 And i = 2 Then Txtfidec = Txtfidec * 100 ElseIf Txtfidec < 100 And i = 3 Then Txtfidec = Txtfidec * 10 ElseIf Txtfidec < 1000 And i = 3 Then Txtfidec = Txtfidec * 10 End If End Sub Private Sub txtfimin_GotFocus()
33
i = 0 If Val(Txtfistu.Text) < 0 Or Val(Txtfistu.Text) > 90 Then KeyAscii = 0 Txtfistu.Text = "" MsgBox "Geografska širina mora biti u rasponu od 0 do 90 stupnjeva", vbExclamation, "Upozorenje" Txtfistu.SetFocus End If End Sub Private Sub txtfimin_KeyPress(KeyAscii As Integer) i = i + 1 If Txtfistu.Text = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" Txtfistu.SetFocus Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If Val(txtfimin.Text) >= 6 Then KeyAscii = 0 txtfimin.Text = "" MsgBox "Minute moraju biti manje od 60", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 2 Then Txtfisek.SetFocus Exit Sub End If End Sub Private Sub Txtfisek_GotFocus() i = 0 End Sub Private Sub Txtfisek_KeyPress(KeyAscii As Integer) i = i + 1 If Txtfistu.Text = "" Or txtfimin = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" If Txtfistu.Text = "" Then Txtfistu.SetFocus ElseIf txtfimin = "" Then txtfimin.SetFocus End If Exit Sub
34
End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If Val(Txtfisek.Text) >= 6 Then KeyAscii = 0 Txtfisek.Text = "" MsgBox "Sekunde moraju biti manje od 60", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 2 Then Txtfidec.SetFocus Exit Sub End If End Sub Private Sub Txtfistu_GotFocus() i = 0 End Sub Private Sub Txtfistu_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If i = 2 Then txtfimin.SetFocus Exit Sub End If End Sub Private Sub Txtladec_GotFocus() i = 0 End Sub Private Sub Txtladec_KeyPress(KeyAscii As Integer) i = i + 1 If Txtlastu.Text = "" Or txtlamin = "" Or txtlasek.Text = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" If Txtlastu.Text = "" Then Txtlastu.SetFocus ElseIf txtlamin = "" Then txtlamin.SetFocus ElseIf txtlasek.Text = "" Then
35
txtlasek.SetFocus End If Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If i = 4 Then Rač.SetFocus Exit Sub End If End Sub Private Sub Txtladec_LostFocus() If Txtladec < 10 And i = 1 Then Txtladec = Txtladec * 1000 ElseIf Txtladec < 10 And i = 2 Then Txtladec = Txtladec * 100 ElseIf Txtladec < 10 And i = 3 Then Txtladec = Txtladec * 10 ElseIf Txtladec < 100 And i = 2 Then Txtladec = Txtladec * 100 ElseIf Txtladec < 100 And i = 3 Then Txtladec = Txtladec * 10 ElseIf Txtladec < 1000 And i = 3 Then Txtladec = Txtladec * 10 End If End Sub Private Sub txtlamin_GotFocus() i = 0 If Val(Txtlastu.Text) < 0 Or Val(Txtlastu.Text) > 180 Then KeyAscii = 0 Txtlastu.Text = "" MsgBox "Geografska duljina mora biti u rasponu od 0 do 180 stupnjeva", vbExclamation, "Upozorenje" Txtlastu.SetFocus End If End Sub Private Sub txtlamin_KeyPress(KeyAscii As Integer) i = i + 1 If Txtlastu.Text = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" Txtlastu.SetFocus Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
36
MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If Val(txtlamin.Text) >= 6 Then KeyAscii = 0 txtlamin.Text = "" MsgBox "Minute moraju biti manje od 60", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 2 Then txtlasek.SetFocus Exit Sub End If End Sub Private Sub txtlasek_GotFocus() i = 0 End Sub Private Sub txtlasek_KeyPress(KeyAscii As Integer) i = i + 1 If Txtlastu.Text = "" Or txtlamin.Text = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" If Txtlastu.Text = "" Then Txtlastu.SetFocus ElseIf txtlamin = "" Then txtlamin.SetFocus End If Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If Val(txtlasek.Text) >= 6 Then KeyAscii = 0 txtlasek.Text = "" MsgBox "Sekunde moraju biti manje od 60", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 2 Then Txtladec.SetFocus Exit Sub End If End Sub
37
Private Sub Txtlastu_GotFocus() i = 0 End Sub Private Sub Txtlastu_KeyPress(KeyAscii As Integer) i = i + 1 If Txtfidec.Text = "" Then KeyAscii = 0 MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" If Txtfistu.Text = "" Then Txtfistu.SetFocus ElseIf txtfimin = "" Then txtfimin.SetFocus ElseIf Txtfisek.Text = "" Then Txtfisek.SetFocus ElseIf Txtfidec.Text = "" Then Txtfidec.SetFocus End If Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If Val(Txtlastu.Text) > 100 Then KeyAscii = 0 Txtlastu.Text = "" MsgBox "Geografska dužina mora biti u rasponu od 0 do 180 stupnjeva", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 3 Then txtlamin.SetFocus Exit Sub End If End Sub Private Sub txtneredx_Change() Cmdspremi.Enabled = True End Sub
38
4.4. Forma "Zadatak 2"
Slika 4.11: Izgled forme "Zadatak 2"
Ova forma služi za računanje geografskih koordinata i konvergencije meridijana iz
pravokutnih koordinata u ravnini. Lijeva strana služi unosu podataka, a desna za prikaz
izračunatih podataka, uz poznati raspored komandnih tipki. I ovdje je primjenjen algoritam za
eliminaciju unosa svih znakova osim numeričkih ali, zbog potrebe unosa decimalnih brojeva,
u nešto složenijem obliku:
If KeyAscii = Asc(",") Then KeyAscii = Asc(".") If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then If KeyAscii = Asc(".") Then Exit Sub MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 txtreducx.SetFocus End If
Budući da Visual Basic koristi točku za obilježavanje decimalnog mjesta, a puno je
praktičnije koristiti zarez (zbog smještaja na numerički dio tipkovnice), omogućeno je i takvo
obilježavanje decimalnog mjesta pri čemu program pretvara unešeni zarez u točku.
Da program ne bi odbacio točku, kao i svaki drugi nenumerički znak, u slučaju njenog unosa
prekida se procedura koja testira karakter znaka te točka ostaje upisana.
39
Ukoliko je unešen neki drugi znak, program se prekida i javlja se poruka o grešci koja je već
prikazana na slici 3.2.
Način rada na ovoj formi je identičan onom na formi "Zadatak 1", odnosno sve kontrolne
tipke imaju istu funkciju i gotovo identičan programski kôd. Jedina razlika vrijedna spomena
je u proceduri koju pokrećemo pritiskom na tipku "Računaj", gdje se matematičke formule
više ne nalaze sve u glavnom dijelu programa, već se one procedure koje koriste i druge
forme nalaze u posebnom modulu. To su sljedeće procedure: Sustav, Širfit, Fifi, Radijustu i
Konvergencija, one će biti objašnjene u poglavlju o modulu. Najprije pozivamo proceduru
"Sustav", koja služi za računanje adicione konstante za Y-koordinatu ( Yk = sustav * 1000000
+ 500000 ). Zatim pomoću procedura "Širfit" i "Fifi" računamo geografsku širinu točke dok
se geografska duljina računa u glavnom dijelu programa, a zatim ih pomoću funkcije
"Radijustu" pretvatramo iz kuta izraženog u radijanima u stupnjeve, minute i sekunde.
Na kraju pozivamo proceduru "Konvergencija" za računanje konvergencije meridijana nakon
čega ponovo pozivamo proceduru "Radijustu" te pretvaramo konvergenciju u kut izražen
stupnjevima, minutama i sekundama. U datoteku možemo spremiti naziv i koordinate točke,
geografsku širinu i dužinu te konvergenciju meridijana.
4.4.1. Popis kontrola na formi "Zadatak 2"
Zadatak2 - naziv forme
Frame1 - okvir na lijevoj strani forme
Frame2 - okvir na desnoj strani forme
Label1-Label12 - oznake za pobliže objašnjenje kontrola
Txtimetočke - okvir teksta za unos naziva točke
Txtreducxcijeli - okvir teksta za unos cjelobrojnog dijela reducirane koordinate X
Txtreducycijeli - okvir teksta za unos cjelobrojnog dijela reducirane koordinate Y
Txtreducxdec - okvir teksta za unos decimalnog dijela reducirane koordinate X
Txtreducydec - okvir teksta za unos decimalnog dijela reducirane koordinate Y
Txtreducx2 - okvir teksta za ispis reducirane koordinate X na desnoj strani
Txtreducy2 - okvir teksta za ispis reducirane koordinate Y na desnoj strani
Txtfi - okvir teksta za ispis izračunate geografske širine točke
Txtla - okvir teksta za ispis izračunate geografske dužine točke
Txtkonvst - okvir teksta za ispis izračunate konvergencije meridijana u dotičnoj točki
Rač - komandna tipka koja pokreće računanje
Cmdspremi - komandna tipka koja služi za spremanje izračunatih podataka
Cmdobriši - komandna tipka koja briše formu
Povratak - komandna tipka kojom se vraćamo na formu za izbor zadatka
Kraj - komandna tipka kojom prekidamo rad s programom
4.4.2. Programski kôd forme "Zadatak 2"
Dim vrijy As Variant Dim vrijx As Variant Dim i As Integer Public y: Public x Private Sub Cmdobriši_Click() Txtimetočke = "": txtreducxcijeli = "": txtreducycijeli = ""
40
txtreducydec = "": txtreducxdec = "" Frame2.Visible = False Txtimetočke.SetFocus End Sub Private Sub Cmdspremi_Click() Spremanje.Label1.Caption = "" Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = "" Spremanje.Label4.Caption = "" Spremanje.Label5.Caption = "" Spremanje.Label6.Caption = "" Spremanje.Label7.Caption = "" Spremanje.Label8.Caption = "" On Error GoTo greška Spremanje.Label1.Caption = "Točka: " + Txtimetočke.Text Spremanje.Label2.Caption = "Y= " + txtreducycijeli + "." + txtreducydec + " X= " + txtreducxcijeli + "." + txtreducxdec Spremanje.Label3.Caption = "Fi= " + txtfi.Text Spremanje.Label4.Caption = "La= " + txtla.Text Spremanje.Label5.Caption = "c " + Txtkonvst.Text Spremanje.Show greška: Exit Sub End Sub Private Sub Form_Load() zvj = 0 End Sub Private Sub kraj_Click() End End Sub Private Sub povratak_Click() Unload Me izbor.Show End Sub Private Sub Rač_Click() Frame2.Visible = True If txtreducxcijeli = "" Or txtreducycijeli = "" Then Frame2.Visible = False Cmdspremi.Enabled = False MsgBox "Unesite sve vrijednosti", vbInformation, "Upozorenje!" If Txtimetočke = "" Then Txtimetočke.SetFocus ElseIf txtreducycijeli = "" Then txtreducycijeli.SetFocus ElseIf txtreducxcijeli = "" Then txtreducxcijeli.SetFocus End If
41
Exit Sub End If y = Val(txtreducycijeli.Text) + Val(txtreducydec) / 1000 x = Val(txtreducxcijeli.Text) + Val(txtreducxdec) / 1000 yk = sustav(y) xp = x / m0 yp = (y - yk) / m0 Txtreducy2.Text = y Txtreducx2.Text = x Call širfit(xp, yp) fifi DL1 = 1 / (n * cf) DL2 = -(1 + 2 * t2 + et2) / (6 * n2 * n * cf) DL3 = (5 + 28 * t2 + 24# * t2 * t2) / (120 * n4 * n * cf) DL = DL1 * yp + DL2 * ypk * yp + DL3 * yp4 * yp LA = l0 + DL kr = fi širina = radijustu(kr) txtfi.Text = širina kr = LA dužina = radijustu(kr) txtla.Text = dužina konvergencija kr = c konv = radijustu(kr) If c < 0 Then Txtkonvst = "-" + konv Else Txtkonvst = konv End If Cmdspremi.Enabled = True Exit Sub End Sub Private Sub txtreducxcijeli_GotFocus() i = o End Sub Private Sub txtreducxcijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txtreducxdec.SetFocus Exit Sub End If End Sub Private Sub txtreducxdec_GotFocus()
42
i = 0 End Sub Private Sub txtreducxdec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then Rač.SetFocus Exit Sub End If End Sub Private Sub txtreducxdec_LostFocus() If txtreducxdec = "" Then Exit Sub If txtreducxdec < 10 And i = 1 Then txtreducxdec = txtreducxdec * 100 ElseIf txtreducxdec < 10 And i = 2 Then txtreducxdec = txtreducxdec * 10 ElseIf txtreducxdec < 100 And i = 2 Then txtreducxdec = txtreducxdec * 10 End If End Sub Private Sub txtreducycijeli_GotFocus() i = 0 End Sub Private Sub txtreducycijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txtreducydec.SetFocus Exit Sub End If End Sub Private Sub txtreducydec_GotFocus() i = 0 End Sub Private Sub txtreducydec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje"
43
KeyAscii = 0 i = i - 1 End If If i = 3 Then txtreducxcijeli.SetFocus Exit Sub End If End Sub Private Sub txtreducydec_LostFocus() If txtreducydec = "" Then Exit Sub If txtreducydec < 10 And i = 1 Then txtreducydec = txtreducydec * 100 ElseIf txtreducydec < 10 And i = 2 Then txtreducydec = txtreducydec * 10 ElseIf txtreducydec < 100 And i = 2 Then txtreducydec = txtreducydec * 10 End If End Sub
4.5. Forma "Zadatak 3"
Slika 4.14: Izgled forme "Zadatak 3"
44
Forma trećeg zadatka služi za računanje redukcije pravca i dužine između dvije po
koordinatama poznate točke. Na lijevu stranu unosimo imena točaka i njihove pravokutne
koordinate u odgovarajuće okvire teksta te, nakon pritiska na tipku "Računaj", dobijemo
vrijednosti za dužinu geodetske linije i dužinu u ravnini te redukcije pravaca u prvoj i drugoj
točki. Da bi ovaj postupak dao točan rezultat, potrebno je provjeriti nalaze li se obje točke u
istom sustavu, što čini sljedeća procedura povezana s tipkom "Računaj":
If Abs(y2 - y1) > 500000 Then MsgBox "Točke nisu u istom sustavu", vbExclamation, "Upozorenje" Call Cmdobriši_Click Exit Sub Else y = y1 End If
Ukoliko je apsolutna razlika Y-koordinata veća od 500000, što znači da točke pripadaju
različitim sustavima, javlja se poruka o grešci i poziva se procedura za slučaj pritiska tipke
"Obriši" (obrišu se svi okviri teksta na lijevoj strani te se skriva desna strana forme).
Ukoliko je ΔY manji od 500000 imamo izraz "Y=Y1", što se koristi za računanje sustava,
pozivom procedure "Sustav" (isti rezultat bismo dobili da smo uvrstili Y2 umjesto Y1).
Slika 4.15:Izgled upozorenja ukoliko točke nisu u istom sustavu
Svi ostali dijelovi ove forme funkcioniraju identično kao na prethodnim pa neće biti ponovno
objašnjeni.
I ovdje prvu pozivamo proceduru "Sustav", radi određivanja sustava Gauss-Krügerove
projekcije, a nakon nje proceduru "Redužip", koja služi za računanje dužine geodetske linije,
dužine u ravnini i redukcije pravca.
Nakon računanja možemo spremiti slijedeće podatke u datoteku: pravokutne reducirane
koordinate obiju točaka, dužinu geodetske linije između točaka, dužinu u ravnini te azimute
normalnih presjeka u prvoj i drugoj točki.
45
4.5.1. Popis komandi na formi "Zadatak 3"
Zadatak3 - naziv forme
Frame1 - okvir na lijevoj strani forme
Frame2 - okvir na desnoj strani forme
Label1-Label18 - oznake za pobliže objašnjenje kontrola
Txtimetočke - okvir teksta za unos naziva prve točke
Txtx1cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate X prve točke
Txty1cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate Y prve točke
Txtx1dec - okvir teksta za unos decimalnog dijela reduc. koordinate X prve točke
Txty1dec - okvir teksta za unos decimalnog dijela reduc. koordinate Y prve točke
Txtimetočke2 - okvir teksta za unos naziva druge točke
Txtx2cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate X druge točke
Txty2cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate Y druge točke
Txtx2dec - okvir teksta za unos decimalnog dijela reduc. koordinate X druge točke
Txty2dec - okvir teksta za unos decimalnog dijela reduc. koordinate Y druge točke
Txts - okvir teksta za ispis izračunate dužine geodetske linije
Txtd - okvir teksta za ispis izračunate dužine u ravnini
Txtomega1 - okvir teksta za ispis izračunatog azimuta normalnog presjeka u prvoj točki
Txtomega2 - okvir teksta za ispis izračunatog azimuta norm. presjeka u drugoj točki
Rač - komandna tipka koja pokreće računanje
Cmdspremi - komandna tipka koja služi za spremanje izračunatih podataka
Cmdobriši - komandna tipka koja briše formu
Povratak - komandna tipka kojom se vraćamo na formu za izbor zadatka
Kraj - komandna tipka kojom prekidamo rad s programom
4.5.2. Programski kôd forme "Zadatak 3"
Option Explicit Dim yp1: Dim XP1 Dim dn: Dim vrijx: Dim vrijy Dim i As Integer Private Sub cmdkraj_Click() End End Sub Private Sub Cmdobriši_Click() Txtimetočke1 = "": Txty1cijeli = "": Txtx1cijeli = "" TxtImeTočke2 = "": Txty2cijeli = "": Txtx2cijeli = "" txty1dec = "": txtx1dec = "": txty2dec = "": txtx2dec = "" Frame2.Visible = False Txtimetočke1.SetFocus End Sub Private Sub cmdpovratak_Click() izbor.Show Unload Me End Sub
46
Private Sub cmdRačunaj_Click() If Txtx1cijeli = "" Or Txty1cijeli = "" Or Txtx2cijeli = "" Or Txty2cijeli = "" Then MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" Frame2.Visible = False Cmdspremi.Enabled = False If Txtimetočke1 = "" Then Txtimetočke1.SetFocus ElseIf Txty1cijeli = "" Then Txty1cijeli.SetFocus ElseIf Txtx1cijeli = "" Then Txtx1cijeli.SetFocus ElseIf TxtImeTočke2 = "" Then TxtImeTočke2.SetFocus ElseIf Txty2cijeli = "" Then Txty2cijeli.SetFocus ElseIf Txtx2cijeli = "" Then Txtx2cijeli.SetFocus End If Exit Sub End If y1 = Val(Txty1cijeli.Text) + Val(txty1dec) / 1000: y2 = Val(Txty2cijeli.Text) + Val(txty2dec) / 1000 x1 = Val(Txtx1cijeli.Text) + Val(txtx1dec) / 1000: x2 = Val(Txtx2cijeli.Text) + Val(txtx2dec) / 1000 If Abs(y2 - y1) > 500000 Then MsgBox "Točke nisu u istom sustavu", vbExclamation, "Upozorenje" Call Cmdobriši_Click Exit Sub Else y = y1 End If yk = sustav(y) yp1 = (y1 - yk) / m0: XP1 = x1 / m0 yp2 = (y2 - yk) / m0: xp2 = x2 / m0 Call redužip(yp1, XP1, yp2, xp2) dn = Sqr(dy * dy + dx * dx) s = dn / ds d = dn * 0.9999 Txts.Text = (Int(s * 1000)) / 1000 Txtd.Text = (Int(d * 1000)) / 1000 Txtomega1.Text = (Int(w12 * 10000)) / 10000 Txtomega2.Text = (Int(w21 * 10000)) / 10000 Frame2.Visible = True Cmdspremi.Enabled = True End Sub Private Sub Cmdspremi_Click() Spremanje.Label1.Caption = "" Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = "" Spremanje.Label4.Caption = "" Spremanje.Label5.Caption = ""
47
Spremanje.Label6.Caption = "" Spremanje.Label7.Caption = "" Spremanje.Label8.Caption = "" On Error GoTo greška Spremanje.Label1.Caption = "Točka 1: " + Txtimetočke1 + " Y1= " + Txty1cijeli.Text + "." + txty1dec + " X1= " + Txtx1cijeli.Text + "." + txtx1dec Spremanje.Label2.Caption = "Točka 2: " + TxtImeTočke2 + " Y2= " + Txty2cijeli.Text + "." + txty2dec + " X2= " + Txtx2cijeli.Text + "." + txtx2dec Spremanje.Label3.Caption = "s= " + Txts.Text + " d= " + Txtd.Text Spremanje.Label4.Caption = "w12= " + Txtomega1 Spremanje.Label5.Caption = "w21= " + Txtomega2 Spremanje.Show greška: Exit Sub End Sub Private Sub Form_Load() zvj = 0 End Sub Private Sub Txtx1cijeli_GotFocus() i = 0 End Sub Private Sub Txtx1cijeli_KeyDown(KeyCode As Integer, Shift As Integer) Txtx1cijeli.SelText = "" End Sub Private Sub Txtx1cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txtx1dec.SetFocus Exit Sub End If End Sub Private Sub txtx1dec_GotFocus() i = 0 End Sub Private Sub txtx1dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If
48
If i = 3 Then TxtImeTočke2.SetFocus Exit Sub End If End Sub Private Sub txtx1dec_LostFocus() If txtx1dec = "" Then Exit Sub If txtx1dec < 10 And i = 1 Then txtx1dec = txtx1dec * 100 ElseIf txtx1dec < 10 And i = 2 Then txtx1dec = txtx1dec * 10 ElseIf txtx1dec < 100 And i = 2 Then txtx1dec = txtx1dec * 10 End If End Sub Private Sub TxtX2cijeli_GotFocus() i = 0 End Sub Private Sub TxtX2cijeli_KeyDown(KeyCode As Integer, Shift As Integer) Txtx2cijeli.SelText = "" End Sub Private Sub TxtX2cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txtx2dec.SetFocus Exit Sub End If End Sub Private Sub txtx2dec_GotFocus() i = 0 End Sub Private Sub txtx2dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then cmdRačunaj.SetFocus Exit Sub
49
End If End Sub Private Sub txtx2dec_LostFocus() If txtx2dec = "" Then Exit Sub If txtx2dec < 10 And i = 1 Then txtx2dec = txtx2dec * 100 ElseIf txtx2dec < 10 And i = 2 Then txtx2dec = txtx2dec * 10 ElseIf txtx2dec < 100 And i = 2 Then txtx2dec = txtx2dec * 10 End If End Sub Private Sub TxtY1cijeli_GotFocus() i = 0 End Sub Private Sub TxtY1cijeli_KeyDown(KeyCode As Integer, Shift As Integer) Txty1cijeli.SelText = "" End Sub Private Sub TxtY1cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txty1dec.SetFocus Exit Sub End If End Sub Private Sub Txty1dec_GotFocus() i = 0 End Sub Private Sub Txty1dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then Txtx1cijeli.SetFocus Exit Sub End If End Sub
50
Private Sub Txty1dec_LostFocus() If txty1dec = "" Then Exit Sub If txty1dec < 10 And i = 1 Then txty1dec = txty1dec * 100 ElseIf txty1dec < 10 And i = 2 Then txty1dec = txty1dec * 10 ElseIf txty1dec < 100 And i = 2 Then txty1dec = txty1dec * 10 End If End Sub Private Sub TxtY2cijeli_GotFocus() i = 0 End Sub Private Sub TxtY2cijeli_KeyDown(KeyCode As Integer, Shift As Integer) Txty2cijeli.SelText = "" End Sub Private Sub TxtY2cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txty2dec.SetFocus Exit Sub End If End Sub Private Sub txty2dec_GotFocus() i = 0 End Sub Private Sub txty2dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then Txtx2cijeli.SetFocus Exit Sub End If End Sub Private Sub txty2dec_LostFocus() If txty2dec = "" Then Exit Sub If txty2dec < 10 And i = 1 Then txty2dec = txty2dec * 100
51
ElseIf txty2dec < 10 And i = 2 Then txty2dec = txty2dec * 10 ElseIf txty2dec < 100 And i = 2 Then txty2dec = txty2dec * 10 End If End Sub
4.6. Forma "Zadatak 4"
Slika 4.16: Izgled forme "Zadatak 4"
Ovaj zadatak služi za računanje pravokutnih koordinata u ravnini iz dužine i azimuta
geodetske linije. Potrebno je unijeti naziv i koordinate prve točke, dužinu i azimut geodetske
linije te naziv druge točke, nakon čega program računa reducirane koordinate druge točke.
Radi određivanja sustava i ovdje prvo pozivamo proceduru "Sustav", a nakon toga proceduru
"Drugatočka", u kojoj se nalaze formule za rješavanje većeg dijela ovog zadatka.
iz procedure "Drugatočka" pozivamo procedure "Širfit", "Konvergencija" i "Redužip".
Prilikom spremanja, u datoteku se spremaju sljedeći podaci: pravokutne reducirane koordinate
prve točke, dužina i azimut geodetske linije, te naziv i izračunate reducirane koordinate druge
točke.
52
4.6.1. Popis komandi na formi "Zadatak 4"
Zadatak4 - naziv forme
Frame1 - okvir na lijevoj strani forme
Frame2 - okvir na desnoj strani forme
Label1-Label13 - oznake za pobliže objašnjenje kontrola
Txtimetočke - okvir teksta za unos naziva prve točke
Txtx1cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate X prve točke
Txty1cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate Y prve točke
Txtx1dec - okvir teksta za unos decimalnog dijela reduc. koordinate X prve točke
Txty1 dec - okvir teksta za unos decimalnog dijela reduc. koordinate Y prve točke
Txts - okvir teksta za unos izračunate dužine geodetske linije
Txtazstu - okvir teksta za unos stupnjeva azimuta geodetske linije
Txtazmin - okvir teksta za unos minuta azimuta geodetske linije
Txtazsek - okvir teksta za unos sekundi azimuta geodetske linije
Txtazdec - okvir teksta za unos decimala azimuta geodetske linije
Txtimetočke2 - okvir teksta za unos naziva druge točke
Txtimeračunate - okvir teksta za ispis naziva druge točke
Txtx2 - okvir teksta za ispis reducirane koordinate X druge točke
Txty2 - okvir teksta za ispis reducirane koordinate Y druge točke
Cmdrač - komandna tipka koja pokreće računanje
Cmdspremi - komandna tipka koja služi za spremanje izračunatih podataka
Cmdobriši - komandna tipka koja briše formu
Cmdpovratak - komandna tipka kojom se vraćamo na formu za izbor zadatka
Cmdkraj - komandna tipka kojom prekidamo rad s programom
4.6.2. Programski kôd forme "Zadatak 4"
Dim decimale As String Dim i As Integer Private Sub cmdkraj_Click() End End Sub Private Sub Cmdobriši_Click() Frame2.Visible = False Cmdspremi.Enabled = False Txtimetočke1.Text = "" Txty1cijeli.Text = "": txty1dec.Text = "" Txtx1cijeli.Text = "": txtx1dec.Text = "" Txts.Text = "" Txtazstu.Text = "" txtazmin.Text = "" txtazsek.Text = "" Txtazdec.Text = "" TxtImeTočke2.Text = "" Txtimetočke1.SetFocus End Sub
53
Private Sub cmdpovratak_Click() izbor.Show Unload Me End Sub Private Sub cmdRač_Click() If Txty1cijeli = "" Or Txtx1cijeli = "" Or Txts = "" Or Txtazstu = "" Or txtazmin = "" Or txtazsek = "" Or Txtazdec = "" Then Frame2.Visible = False Cmdspremi.Enabled = False MsgBox "Unesite sve vrijednosti", vbExclamation, "Upozorenje" If Txtimetočke1 = "" Then Txtimetočke1.SetFocus ElseIf Txty1cijeli = "" Then Txty1cijeli.SetFocus ElseIf Txtx1cijeli = "" Then Txtx1cijeli.SetFocus ElseIf Txts = "" Then Txts.SetFocus ElseIf Txtazstu = "" Then Txtazstu.SetFocus ElseIf txtazmin = "" Then txtazmin.SetFocus ElseIf txtazsek = "" Then txtazsek.SetFocus Else: Txtazdec.SetFocus End If Exit Sub End If y = Val(Txty1cijeli) + Val(txty1dec) / 1000: x = Val(Txtx1cijeli) + Val(txtx1dec) / 1000: s = Val(Txts) ast = Val(Txtazstu): amin = Val(txtazmin): asekunde = Val(txtazsek): adec = Val(Txtazdec) asek = asekunde + adec / 10000 al = (ast + amin / 60 + asek / 3600) * r2 yp = 0: xp = 0 yk = sustav(y) yp1 = (y - yk) / m0: XP1 = x / m0 yp = yp1: xp = XP1 drugatočka yp2 = yp1 + dyp: xp2 = XP1 + dxp y2 = yp2 * m0 + yk: x2 = xp2 * m0 Frame2.Visible = True Cmdspremi.Enabled = True Txty2 = Int(y2 * 1000) / 1000: Txtx2 = Int(x2 * 1000) / 1000 TxtImeRačunate.Text = TxtImeTočke2.Text End Sub Private Sub Cmdspremi_Click() Spremanje.Label1.Caption = "" Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = ""
54
Spremanje.Label4.Caption = "" Spremanje.Label5.Caption = "" Spremanje.Label6.Caption = "" Spremanje.Label7.Caption = "" Spremanje.Label8.Caption = "" decimale = Val(Txtazdec) Spremanje.Label1.Caption = "Točka 1: " + Txtimetočke1 + " Y1= " + Txty1cijeli.Text + "." + txty1dec.Text + " X1= " + Txtx1cijeli.Text + "." + txtx1dec.Text Spremanje.Label2.Caption = "s= " + Txts.Text Spremanje.Label3.Caption = "A= " + Txtazstu.Text + "-" + txtazmin.Text + "-" + txtazsek.Text + "." + decimale Spremanje.Label4.Caption = "Točka 2: " + TxtImeTočke2.Text Spremanje.Label5.Caption = "Y2= " + Txty2.Text + " X2= " + Txtx2.Text Spremanje.Show End Sub Private Sub Form_Load() zvj = 0 End Sub Private Sub Txtazdec_GotFocus() i = 0 End Sub Private Sub Txtazdec_KeyPress(KeyAscii As Integer) i = i + 1 If Txtazstu.Text = "" Or txtazmin = "" Or txtazsek.Text = "" Then KeyAscii = 0 MsgBox "Unesite prvo stupnjeve, minute i sekunde!", vbExclamation, "Upozorenje" If Txtazstu.Text = "" Then Txtazstu.SetFocus ElseIf txtazmin = "" Then txtazmin.SetFocus ElseIf txtazsek.Text = "" Then txtazsek.SetFocus End If i = i - 1 Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If i = 4 Then TxtImeTočke2.SetFocus Exit Sub End If End Sub Private Sub Txtazdec_LostFocus()
55
If Txtazdec < 10 And i = 1 Then Txtazdec = Txtazdec * 1000 ElseIf Txtazdec < 10 And i = 2 Then Txtazdec = Txtazdec * 100 ElseIf Txtazdec < 10 And i = 3 Then Txtazdec = Txtazdec * 10 ElseIf Txtazdec < 100 And i = 2 Then Txtazdec = Txtazdec * 100 ElseIf Txtazdec < 100 And i = 3 Then Txtazdec = Txtazdec * 10 ElseIf Txtazdec < 1000 And i = 3 Then Txtazdec = Txtazdec * 10 End If End Sub Private Sub txtazmin_GotFocus() i = 0 End Sub Private Sub txtazmin_KeyPress(KeyAscii As Integer) i = i + 1 If Txtazstu.Text = "" Then KeyAscii = 0 MsgBox "Unesite prvo stupnjeve!", vbExclamation, "Upozorenje" Txtazstu.SetFocus i = i - 1 Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If Val(txtazmin.Text) >= 6 Then KeyAscii = 0 txtazmin.Text = "" MsgBox "Minute moraju biti manje od 60", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 2 Then txtazsek.SetFocus Exit Sub End If End Sub Private Sub txtazsek_GotFocus() i = 0 End Sub Private Sub txtazsek_KeyPress(KeyAscii As Integer)
56
i = i + 1 If Txtazstu.Text = "" Or txtazmin.Text = "" Then KeyAscii = 0 MsgBox "Unesite prvo stupnjeve i minute!", vbExclamation, "Upozorenje" If Txtazstu.Text = "" Then Txtazstu.SetFocus ElseIf txtazmin = "" Then txtazmin.SetFocus End If i = i - 1 Exit Sub End If If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If Val(txtazsek.Text) >= 6 Then KeyAscii = 0 txtazsek.Text = "" MsgBox "Sekunde moraju biti manje od 60", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 2 Then Txtazdec.SetFocus Exit Sub End If End Sub Private Sub Txtazstu_GotFocus() i = 0 End Sub Private Sub Txtazstu_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 End If If Val(Txtazstu.Text) > 35 Then KeyAscii = 0 Txtazstu.Text = "" MsgBox "Stupnjevi ne smiju biti veći od 360", vbExclamation, "Upozorenje" i = 0 Exit Sub End If If i = 3 Then txtazmin.SetFocus Exit Sub End If
57
End Sub Private Sub Txts_KeyDown(KeyCode As Integer, Shift As Integer) Txts.SelText = "" End Sub Private Sub Txts_KeyPress(KeyAscii As Integer) If KeyAscii = Asc(",") Then KeyAscii = Asc(".") If KeyAscii = Asc(".") Then Exit Sub If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 Txts.SetFocus End If vrijs = Val(Txts) If Len(vrijs) <= 11 Then Exit Sub Else MsgBox "Unijeli ste previše znamenki", vbExclamation, "Upozorenje" KeyAscii = 0 Txts = "" Txts.SetFocus End If End Sub Private Sub Txtx1cijeli_GotFocus() i = 0 End Sub Private Sub Txtx1cijeli_KeyDown(KeyCode As Integer, Shift As Integer) Txtx1cijeli.SelText = "" End Sub Private Sub Txtx1cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txtx1dec.SetFocus Exit Sub End If End Sub Private Sub txtx1dec_GotFocus() i = 0 End Sub Private Sub txtx1dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
58
MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then Txts.SetFocus Exit Sub End If End Sub Private Sub txtx1dec_LostFocus() If txtx1dec = "" Then Exit Sub If txtx1dec < 10 And i = 1 Then txtx1dec = txtx1dec * 100 ElseIf txtx1dec < 10 And i = 2 Then txtx1dec = txtx1dec * 10 ElseIf txtx1dec < 100 And i = 2 Then txtx1dec = txtx1dec * 10 End If End Sub Private Sub TxtY1cijeli_GotFocus() i = 0 End Sub Private Sub TxtY1cijeli_KeyDown(KeyCode As Integer, Shift As Integer) Txty1cijeli.SelText = "" End Sub Private Sub TxtY1cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txty1dec.SetFocus Exit Sub End If End Sub Private Sub Txty1dec_GotFocus() i = 0 End Sub Private Sub Txty1dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1
59
End If If i = 3 Then Txtx1cijeli.SetFocus Exit Sub End If End Sub Private Sub Txty1dec_LostFocus() If txty1dec = "" Then Exit Sub If txty1dec < 10 And i = 1 Then txty1dec = txty1dec * 100 ElseIf txty1dec < 10 And i = 2 Then txty1dec = txty1dec * 10 ElseIf txty1dec < 100 And i = 2 Then txty1dec = txty1dec * 10 End If End Sub
4.7. Forma "Zadatak 5"
Slika 4.17: Izgled forme "Zadatak 5"
Forma petog zadatka se odnosi na računanje dužine i azimuta geodetske linije iz pravokutnih
koordinata u ravnini.
60
Na formu unosimo sljedeće vrijednosti: nazive prve i druge točke te njihove reducirane
koordinate, od čega su Y,X-koordinate točaka neophodne veličine bez kojih ne možemo
računati, a nazivi točaka su opcionalni.
Nakon što unesemo sve podatke program provjerava jesu li točke u istom sustavu, u slučaju
da nisu javlja se poruka o grešci sadržaja već poznatog sa slike 3.14.
Ako su točke u istom sustavu, program određuje koji je to sustav pomoću procedure "Sustav",
nakon toga računa redukcije dužine i pravca pomoću procedure "Redužip", geografsku širinu
koja odgovara duljini luka srednjeg meridijana pomoću procedure "Širfit", konvergenciju
meridijana pomoću procedure "Konvergencija" te, nakon određivanja azimuta, proceduru
"Radijustu" za pretvaranje azimuta iz radijana u stupnjeve.
Pritiskom na tipku "Spremi" možemo spremiti sljedeće podatke: nazive prve i druge točke,
duljinu geodetske linije, duljinu u ravnini te azimute geodetske linije u tim točkama.
4.7.1. Popis komandi na formi "Zadatak 5"
Zadatak5 - naziv forme
Frame1 - okvir na lijevoj strani forme
Frame2 - okvir na desnoj strani forme
Label1-Label17 - oznake za pobliže objašnjenje kontrola
Txtimetočke1 - okvir teksta za unos naziva prve točke
Txtx1cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate X prve točke
Txty1cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate Y prve točke
Txtx1dec - okvir teksta za unos decimalnog dijela reduc. koordinate X prve točke
Txty1dec - okvir teksta za unos decimalnog dijela reduc. koordinate Y prve točke
Txtimetočke2 - okvir teksta za unos naziva druge točke
Txtx2cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate X druge točke
Txty2cijeli - okvir teksta za unos cjelobrojnog dijela reduc. koordinate Y druge točke
Txtx2dec - okvir teksta za unos decimalnog dijela reduc. koordinate X druge točke
Txty2dec - okvir teksta za unos decimalnog dijela reduc. koordinate Y druge točke
Txts - okvir teksta za ispis izračunate dužine geodetske linije
Txtd - okvir teksta za ispis izračunate dužine u ravnini
Txta12 - okvir teksta za ispis azimuta geodetske linije u prvoj točki
Txta21 - okvir teksta za ispis azimuta geodetske linije u drugoj točki
Cmdrač - komandna tipka koja pokreće računanje
Cmdspremi - komandna tipka koja služi za spremanje izračunatih podataka
Cmdobriši - komandna tipka koja briše formu
Cmdpovratak - komandna tipka kojom se vraćamo na formu za izbor zadatka
Cmdkraj - komandna tipka kojom prekidamo rad s programom
4.7.2. Programski kôd forme "Zadatak 5"
Dim i As Integer Private Sub cmdkraj_Click() End End Sub Private Sub Cmdobriši_Click() Txtimetočke1 = "": TxtY1cijeli = "": Txtx1cijeli = "": Txty1dec = "": txtx1dec = ""
61
TxtImeTočke2 = "": TxtY2cijeli = "": TxtX2cijeli = "": txty2dec = "": txtx2dec = "" Txtimetočke1.SetFocus Frame2.Visible = False Cmdspremi.Enabled = False End Sub Private Sub cmdpovratak_Click() izbor.Show Unload Me End Sub Private Sub cmdRač_Click() If TxtY1cijeli = "" Or Txtx1cijeli = "" Or TxtY2cijeli = "" Or TxtX2cijeli = "" Then Frame2.Visible = False Cmdspremi.Enabled = False MsgBox "Unesite sve vrijednosti", vbInformation, "Upozorenje!" If Txtimetočke1 = "" Then Txtimetočke1.SetFocus ElseIf TxtY1cijeli = "" Then TxtY1cijeli.SetFocus ElseIf Txtx1cijeli = "" Then Txtx1cijeli.SetFocus ElseIf TxtImeTočke2 = "" Then TxtImeTočke2.SetFocus ElseIf TxtY2cijeli = "" Then TxtY2cijeli.SetFocus Else TxtX2cijeli.SetFocus End If Exit Sub End If y1 = Val(TxtY1cijeli) + Val(Txty1dec) / 1000: x1 = Val(Txtx1cijeli) + Val(txtx1dec) / 1000 y2 = Val(TxtY2cijeli) + Val(txty2dec) / 1000: x2 = Val(TxtX2cijeli) + Val(txtx2dec) / 1000 If Abs(y2 - y1) > 500000# Then MsgBox "Točke nisu u istom sustavu", vbExclamation, "Upozorenje" Call Cmdobriši_Click Exit Sub End If y = y1 yk = sustav(y) yp1 = (y1 - yk) / m0: XP1 = x1 / m0 yp2 = (y2 - yk) / m0: xp2 = x2 / m0 Call redužip(yp1, XP1, yp2, xp2) d = Sqr(dy * dy + dx * dx) s = d / ds NI12 = (1 - (dx = 0)) * Atn(dy / (dx + (dx = 0) * ((dy = 0) - dy))) - pi * ((dy < 0) * (1 + Sgn(dx)) + (dx < 0)) NI21 = NI12 + pi + 2 * pi * (NI12 >= pi) yp = yp1: xp = XP1 Call širfit(xp, yp) konvergencija AL12 = NI12 + c + w12 / 3600 * r2
62
AL12 = AL12 - 2 * pi * (AL12 < 0) yp = yp2: xp = xp2 Call širfit(xp, yp) konvergencija AL21 = NI21 + c + w21 / 3600 * r2 AL21 = AL21 - 2 * pi * (AL21 < 0) kr = AL12 prvi = radijustu(kr) txtalfa12 = prvi kr = AL21 drugi = radijustu(kr) txtalfa21 = drugi Txts.Text = (Int(s * 1000)) / 1000 dd = d * 0.9999 Txtd.Text = (Int(dd * 1000)) / 1000 TxtA12 = prvi: txtA21 = drugi Frame2.Visible = True Cmdspremi.Enabled = True End Sub Private Sub Cmdspremi_Click() Spremanje.Label1.Caption = "" Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = "" Spremanje.Label4.Caption = "" Spremanje.Label5.Caption = "" Spremanje.Label6.Caption = "" Spremanje.Label7.Caption = "" Spremanje.Label8.Caption = "" Spremanje.Label1.Caption = "Točka 1: " + Txtimetočke1 + " Točka 2: " + TxtImeTočke2 Spremanje.Label2.Caption = "s = " + Txts.Text Spremanje.Label3.Caption = "d = " + Txtd.Text Spremanje.Label4.Caption = "A12 = " + TxtA12.Text Spremanje.Label5.Caption = "A21 = " + txtA21.Text + " " Spremanje.Show End Sub Private Sub Form_Load() zvj = 0 End Sub Private Sub Txtx1cijeli_GotFocus() i = 0 End Sub Private Sub Txtx1cijeli_KeyDown(KeyCode As Integer, Shift As Integer) Txtx1cijeli.SelText = "" End Sub Private Sub Txtx1cijeli_KeyPress(KeyAscii As Integer) i = i + 1
63
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txtx1dec.SetFocus Exit Sub End If End Sub Private Sub txtx1dec_GotFocus() i = 0 End Sub Private Sub txtx1dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then TxtImeTočke2.SetFocus Exit Sub End If End Sub Private Sub txtx1dec_LostFocus() If txtx1dec = "" Then Exit Sub If txtx1dec < 10 And i = 1 Then txtx1dec = txtx1dec * 100 ElseIf txtx1dec < 10 And i = 2 Then txtx1dec = txtx1dec * 10 ElseIf txtx1dec < 100 And i = 2 Then txtx1dec = txtx1dec * 10 End If End Sub Private Sub TxtX2cijeli_GotFocus() i = 0 End Sub Private Sub TxtX2cijeli_KeyDown(KeyCode As Integer, Shift As Integer) TxtX2cijeli.SelText = "" End Sub Private Sub TxtX2cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0
64
i = i - 1 End If If i = 7 Then txtx2dec.SetFocus Exit Sub End If End Sub Private Sub txtx2dec_GotFocus() i = 0 End Sub Private Sub txtx2dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then cmdRač.SetFocus Exit Sub End If End Sub Private Sub txtx2dec_LostFocus() If txtx2dec = "" Then Exit Sub If txtx2dec < 10 And i = 1 Then txtx2dec = txtx2dec * 100 ElseIf txtx2dec < 10 And i = 2 Then txtx2dec = txtx2dec * 10 ElseIf txtx2dec < 100 And i = 2 Then txtx2dec = txtx2dec * 10 End If End Sub Private Sub TxtY1cijeli_GotFocus() i = 0 End Sub Private Sub TxtY1cijeli_KeyDown(KeyCode As Integer, Shift As Integer) TxtY1cijeli.SelText = "" End Sub Private Sub TxtY1cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then
65
Txty1dec.SetFocus Exit Sub End If End Sub Private Sub Txty1dec_GotFocus() i = 0 End Sub Private Sub Txty1dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then Txtx1cijeli.SetFocus Exit Sub End If End Sub Private Sub Txty1dec_LostFocus() If Txty1dec = "" Then Exit Sub If Txty1dec < 10 And i = 1 Then Txty1dec = Txty1dec * 100 ElseIf Txty1dec < 10 And i = 2 Then Txty1dec = Txty1dec * 10 ElseIf Txty1dec < 100 And i = 2 Then Txty1dec = Txty1dec * 10 End If End Sub Private Sub TxtY2cijeli_GotFocus() i = 0 End Sub Private Sub TxtY2cijeli_KeyDown(KeyCode As Integer, Shift As Integer) TxtY2cijeli.SelText = "" End Sub Private Sub TxtY2cijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 7 Then txty2dec.SetFocus Exit Sub End If
66
End Sub Private Sub txty2dec_GotFocus() i = 0 End Sub Private Sub txty2dec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then TxtX2cijeli.SetFocus Exit Sub End If End Sub Private Sub txty2dec_LostFocus() If txty2dec = "" Then Exit Sub If txty2dec < 10 And i = 1 Then txty2dec = txty2dec * 100 ElseIf txty2dec < 10 And i = 2 Then txty2dec = txty2dec * 10 ElseIf txty2dec < 100 And i = 2 Then txty2dec = txty2dec * 10 End If End Sub
67
4.8. Forma "Zadatak 6"
Slika 4.18: Izgled forme "Zadatak 6"
Ovaj dio programa služi za transformaciju pravokutnih koordinata iz jednog koordinatnog
sustava u susjedni sustav.
Na lijevoj strani se zadaje ime točke i pravokutne reducirane koordinate točke u jednom
sustavu, dok nakon računanja dobijemo nereducirane i reducirane koordinate u susjednom
sustavu. Prigodom računanja, a nakon pritiska tipke "Računaj", pozivamo samo proceduru
"Transformacija" koja sadrži najveći dio matematičkih računanja pri transformaciji koordinata.
Na ovoj formi se koriste, kao i na svim drugim: algoritam za ograničavanje unosa samo na
brojeve, za pretvaranje zareza u točku, za ograničavanje unosa koordinata na 11 znakova i
algoritam koji javlja grešku ako pokušamo računati bez svih neophodnih podataka.
Nakon pritiska na tipku "Spremi" spremamo podatke u datoteku po izboru u obliku koji je
prikazan na sljedećoj stranici.
68
Slika 4.19: Izgled spremljene datoteke šestog zadatka
4.8.1. Popis kontrola na formi "Zadatak 6"
Zadatak6 - naziv forme
Frame1 - okvir na lijevoj strani forme
Frame2 - okvir na desnoj strani forme
Label1-Label12 - oznake za pobliže objašnjenje kontrola
Txtimetočke - okvir teksta za unos naziva točke
Txtreducxcijeli - okvir teksta za unos cjelobrojnog dijela reducirane koordinate X točke
Txtreducycijeli - okvir teksta za unos cjelobrojnog dijela reducirane koordinate Y točke
Txtreducxdec - okvir teksta za unos decimalnog dijela reducirane koordinate X točke
Txtreducydec - okvir teksta za unos decimalnog dijela reducirane koordinate Y točke
Txtimetočke2 - okvir teksta za ispis naziva točke
Txtneredx - okvir teksta za ispis nereducirane koordinate X točke
Txtneredy - okvir teksta za unos nereducirane koordinate Y točke
Txtreducy2 - okvir teksta za ispis izračunate reducirane koordinate u drugom sustavu
Txtreducx2 - okvir teksta za ispis izračunate reducirane koordinate u drugom sustavu
Cmdrač - komandna tipka koja pokreće računanje
Cmdspremi - komandna tipka koja služi za spremanje izračunatih podataka
Cmdobriši - komandna tipka koja briše formu
Cmdpovratak - komandna tipka kojom se vraćamo na formu za izbor zadatka
Cmdkraj - komandna tipka kojom prekidamo rad s programom
4.8.2. Programski kôd forme "Zadatak 6" Option Explicit Dim vrijx As Single Dim vrijy As Single Dim i As Integer Private Sub cmdkraj_Click() End
69
End Sub Private Sub Cmdobriši_Click() Frame2.Visible = False Txtimetočke = "" txtreducxcijeli = "": txtreducxdec = "" txtreducycijeli = "": txtreducydec = "" Txtimetočke.SetFocus End Sub Private Sub cmdpovratak_Click() izbor.Show Unload Me End Sub Private Sub cmdRač_Click() If txtreducycijeli = "" Or txtreducxcijeli = "" Then Frame2.Visible = False Cmdspremi.Enabled = False MsgBox "Unesite sve vrijednosti", vbInformation, "Upozorenje!" If txtreducycijeli = "" Then txtreducycijeli.SetFocus Else txtreducxcijeli.SetFocus End If Exit Sub End If Frame2.Visible = True If txtreducxcijeli = "" Or txtreducycijeli = "" Then MsgBox "Unesite sve vrijednosti", vbInformation, "Upozorenje!" If Txtimetočke = "" Then Txtimetočke.SetFocus ElseIf txtreducxcijeli = "" Then txtreducxcijeli.SetFocus ElseIf txtreducycijeli = "" Then txtreducycijeli.SetFocus End If Exit Sub End If y = Val(txtreducycijeli) + Val(txtreducydec) / 1000 x = Val(txtreducxcijeli) + Val(txtreducxdec) / 1000 transformacija TxtImeTočke2 = Txtimetočke Txtneredy.Text = (Int(ypc * 1000)) / 1000 Txtneredx.Text = (Int(xpc * 1000)) / 1000 Txtreducy2.Text = (Int(yc * 1000)) / 1000 Txtreducx2.Text = (Int(xc * 1000)) / 1000 Cmdspremi.Enabled = True End Sub Private Sub Cmdspremi_Click() Spremanje.Label1.Caption = ""
70
Spremanje.Label2.Caption = "" Spremanje.Label3.Caption = "" Spremanje.Label4.Caption = "" Spremanje.Label5.Caption = "" Spremanje.Label6.Caption = "" Spremanje.Label7.Caption = "" Spremanje.Label8.Caption = "" On Error GoTo greška Spremanje.Label1.Caption = "Točka: " + Txtimetočke.Text Spremanje.Label2.Caption = "Y= " + txtreducycijeli.Text + "." + txtreducydec + " X= " + txtreducxcijeli.Text + "." + txtreducxdec Spremanje.Label3.Caption = "Yp= " + Txtneredy.Text + " Xp= " + Txtneredx.Text Spremanje.Label4.Caption = "Transformirane koordinate :" Spremanje.Label5.Caption = "Yc= " + Txtreducy2 + " Xc= " + Txtreducx2 Spremanje.Show greška: Exit Sub End Sub Private Sub Form_Load() zvj = 0 End Sub Private Sub txtreducxcijeli_GotFocus() i = 0 End Sub Private Sub txtreducxcijeli_KeyDown(KeyCode As Integer, Shift As Integer) txtreducxcijeli.SelText = "" End Sub Private Sub txtreducxcijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If i = 7 Then txtreducxdec.SetFocus Exit Sub End If End Sub Private Sub txtreducxdec_GotFocus() i = 0 End Sub Private Sub txtreducxdec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
71
MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 End If If i = 3 Then cmdRač.SetFocus Exit Sub End If End Sub Private Sub txtreducxdec_LostFocus() If txtreducxdec = "" Then Exit Sub If txtreducxdec < 10 And i = 1 Then txtreducxdec = txtreducxdec * 100 ElseIf txtreducxdec < 10 And i = 2 Then txtreducxdec = txtreducxdec * 10 ElseIf txtreducxdec < 100 And i = 2 Then txtreducxdec = txtreducxdec * 10 End If End Sub Private Sub txtreducycijeli_GotFocus() i = 0 End Sub Private Sub txtreducycijeli_KeyDown(KeyCode As Integer, Shift As Integer) txtreducycijeli.SelText = "" End Sub Private Sub txtreducycijeli_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva!", vbExclamation, "Upozorenje" KeyAscii = 0 i = i - 1 Exit Sub End If If i = 7 Then txtreducydec.SetFocus Exit Sub End If End Sub Private Sub txtreducydec_GotFocus() i = 0 End Sub Private Sub txtreducydec_KeyPress(KeyAscii As Integer) i = i + 1 If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then MsgBox "Dozvoljen unos samo brojeva", vbExclamation, "Upozorenje" KeyAscii = 0
72
i = i - 1 End If If i = 3 Then txtreducxcijeli.SetFocus Exit Sub End If End Sub Private Sub txtreducydec_LostFocus() If txtreducydec = "" Then Exit Sub If txtreducydec < 10 And i = 1 Then txtreducydec = txtreducydec * 100 ElseIf txtreducydec < 10 And i = 2 Then txtreducydec = txtreducydec * 10 ElseIf txtreducydec < 100 And i = 2 Then txtreducydec = txtreducydec * 10 End If End Sub
4.9. Forma "Spremanje"
Slika 4.20: Izgled forme "Spremanje"
73
Forma "Spremanje" se koristi za spremanje izračunatih vrijednosti u datoteku po vlastitom
izboru. Nakon što smo uspješno izračunali bilo koji od šest zadataka aktivira se tipka
"Spremi", pomoću koje otvaramo prozor za spremanje.
Na njoj su nam ponuđene sljedeće kontrole, koje su posebno namijenjene za ovu svrhu:
okvir liste jedinica (koji služi za odabir tražene jedinice za pohranu podataka), okvir liste
imenika (odabir željenog imenika na dotičnoj jedinici), te okvir liste datoteka (namijenjen
odabiru datoteke unutar željenog imenika).
Pokušao sam, u granicama svojih mogućnosti, napraviti prozor za spremanje što sličniji
standardim prozorima u većini WINDOWS-utemeljenih aplikacija, tako da osim navedenih
kontrola imamo i okvir teksta "Ekstenzija" pomoću kojeg odabiremo s kakvom će se
ekstenzijom datoteka spremiti. U okviru liste datoteka se pojavljuju samo datoteke ekstenzije
koja je navedena u gorespomenutom okviru teksta, dok pomoću specijalnog znaka "*" ( u
obliku *.*) možemo izlistati sve datoteke, kao i u većini drugih standardnih aplikacija.
Osim navedenog na lijevoj strani se nalazi pet oznaka koje sadrže tekst koji će biti spremljen,
iznad okvira liste datoteka imamo prikazan put (path) datoteke a iznad okvira liste datoteka se
nalazi okvir teksta s imenom datoteke. Taj okvir teksta prikazuje prvu datoteku u listi, osim
ako korisnik ne klikne na jednu od datoteka u listi, kada taj okvir teksta poprima ime
novooznačene datoteke. Da bismo unijeli novo ime dovoljno je kliknuti u okvir teksta
predviđen za ime datoteke, pri čemu se briše postojeći tekst, te možemo unijeti novo ime.
Ako želimo podatke spremiti u postojeću datoteku dovoljno je dvostruko kliknuti na njeno
ime u okviru liste datoteka, što za sobom povlači proceduru za slučaj pritiska na tipku "U
redu".
U programu postoji potreba spremanja podataka sa šest različitih formi, a zbog veličine
programa (da ne bi svaka forma imala svoju posebnu formu za spremanje), ta je potreba
riješena na način koji je opisan u nastavku.
Na formi "Spremanje" postoji pet oznaka predviđenih za prikaz podataka koje ćemo spremiti.
Svaki od zadataka zasebno definira tekst koji je njemu bitan na te oznake, na taj način
prebacujemo potrebne podatke na formu "Spremanje" te ih sad možemo bez ikakvih problema
spremiti. Za slučaj da smo spremili više točaka u istu datoteku, a zbog čitkosti podataka, na
početak se sprema red zvjezdica a nakon njega računati podaci, i tako redom za svaku
sljedeću točku.
4.9.1. Popis komandi na formi "Spremanje"
Spremanje - naziv forme
Frmdatoteke - okvir u kojem se nalaze sve komande
Label1-label10 - oznake za opisni tekst
Drvjedinice - padajući okvir s popisom jedinica
Dirlista - okvir liste imenika
Fildatoteke - okvir liste jedinica
Txtimedatoteke - okvir teksta za unos imena datoteke
Txtext - okvir teksta za unos željene ekstenzije
Cmduredu - komandna tipka za potvrdu spremanja
Cmdodustani - komandna tipka za odustajanje od spremanja i zatvaranje prozora za
spremanje
74
4.9.2. Programski kôd forme "Spremanje"
Public spr$ Public extenzija Private Sub CmdOdustani_Click() Spremanje.Tag = "" Spremanje.Hide End Sub Private Sub CmdUredu_Click() zvj = zvj + 1 On Error GoTo greška If Txtimedatoteke.Text = "" Then MsgBox "nema označene datoteke", 48, "Upozorenje" Exit Sub End If spr$ = Lbldir.Caption + Txtimedatoteke.Text + extenzija Spremanje.Tag = spr$ broj = FreeFile() Open Spremanje.Tag For Append As #broj Print #broj, Print #broj, If zvj > 1 Then GoTo dalje Print #broj, String(25, "*") Print #broj, Label7.Caption If Label8.Caption = "" Then GoTo dalje Print #broj, Label8.Caption dalje: Print #broj, Print #broj, Label1.Caption Print #broj, Label2.Caption Print #broj, Label3.Caption Print #broj, Label4.Caption If Label5.Caption <> "" Then Print #broj, Label5.Caption Else Close GoTo kraj End If If Label6.Caption <> "" Then Print #broj, Label6.Caption Else Close GoTo kraj End If Close kraj: Spremanje.Visible = False Exit Sub greška: MsgBox "Nije dozvoljeno upisivanje u datoteku", vbExclamation, "Upozorenje"
75
Txtimedatoteke.Text = "" Exit Sub End Sub Private Sub Dirlista_Change() Fildatoteke.Path = Dirlista.Path If (Fildatoteke.ListCount > 0) Then Fildatoteke.ListIndex = 0 Else Txtimedatoteke.Text = "" End If Lbldir.Caption = Fildatoteke.Path + "\" End Sub Private Sub drvjedinice_Change() Dirlista.Path = drvjedinice.Drive End Sub Private Sub Fildatoteke_Click() Txtimedatoteke.Text = Fildatoteke.FileName extenzija = "" End Sub Private Sub Fildatoteke_DblClick() Txtimedatoteke.Text = Fildatoteke.FileName extenzija = "" Call CmdUredu_Click End Sub Private Sub Form_Load() drvjedinice.Drive = "c:" Dirlista.Path = "c:\" Lbldir.Caption = Dirlista.Path Txtext.Text = "*.txt" Txtimedatoteke.Text = Fildatoteke.FileName extenzija = "" End Sub Private Sub Txtext_Change() Fildatoteke.Pattern = Txtext.Text extenzija = Right$(Txtext.Text, 4) End Sub Private Sub Txtimedatoteke_GotFocus() Txtimedatoteke = "" End Sub Private Sub Txtimedatoteke_Keyup(KeyCode As Integer, Shift As Integer) extenzija = Right$(Txtext.Text, 4) End Sub
76
4.10. Modul "Konstante"
Moduli u Visual Basicu sadrže programski kôd funkcija koje se pozivaju sa različitih mjesta u
programu, čime se pojednostavnjuje i skraćuje pisanje programa. Na početku se nalaze
definicije globalnih konstanti i varijabli, čije vrijednosti se mogu pozivati s bilo kojeg mjesta
unutar programa, pri čemu za varijable definiramo tip podataka (ako ne definiramo tip
podataka automatski mu se dodjeljuje tip Variant. Ostatak modula se sastoji iz funkcija
preuzetih iz programa GAUSHN, to su:
Radijustu - funkcija za pretvaranje kuta izraženog u radijanima u stupnjeve
Širfit - računanje geografske širine koja odgovara duljini luka srednjeg meridijana,
te veličina Nt ,, .
Fifi - računanje geografske širine
Konvergencija - računanje konvergencije meridijana
Sustav - određivanje sustava točke, konstante kY i geografske širine srednjeg
meridijana
Transformacija - transformacija koordinata točke iz jednog sustava u susjedni
Redužip - redukcija dužine i pravca
Srrad - računanje srednjeg radijusa
Drugatočka - Računanje pravokutnih koordinata druge točke iz pravokutnih koordinata
jedne točke, azimuta i duljine geodetske linije
4.10.1. Programski kôd modula "Konstante"
Option Explicit Global zvj Global Const A = 6377397.155 Global Const b = 6356078.96325 Global Const pi = 3.14159265358979 Global Const r1 = 180# / pi Global Const r2 = pi / 180# Global Const m0 = 0.9999 Global Const e = 8.16968303965053E-02 Global Const ec = 8.19708403176893E-02 Global Const AO = 1.00503730594646 Global Const BO = 5.04784913836498E-03 Global Const CO = 1.05637864667293E-05 Global Const d00 = 2.06333485024118E-08 Global br$: Global xp$: Global t: Global yk: Global et2 Global y1: Global y2: Global x1: Global x2 Global n2: Global fi1: Global fi: Global fi2: Global fi3 Global n: Dim e2: Global cf: Global y: Global x: Global k: Global l0 Dim ce: Dim f2: Dim f4: Global f6: Global f8: Global g Global sf: Global t2: Global eta: Global n4: Global ypk Global yp4: Dim c3: Dim c4: Global c: Dim c5: Global yp Dim ks: Dim md: Dim st: Dim mi: Dim se Dim yk1: Dim z: Dim z2: Dim z3: Dim z4: Dim z5: Dim yp3: Dim yp5 Dim t4: Dim q1: Dim q2: Dim q3: Dim q4: Dim q5: Dim q6: Dim q7 Dim g1: Dim g2: Dim g3: Dim g4: Dim g5 Global ypc: Global xpc: Global yc: Global xc: Global ysustava
77
Dim rm: Dim rm2: Dim rm4: Dim om
Global s: Global d: Global w12: Global w21: Global dy: Global dx Global ds: Global xpm: Global ypm: Global om1: Global om2: Global r1s: Global k1 Global k2: Global k3: Global k4: Global ps1: Global ps2 Global astu: Global amin: Global asekunde: Global asek: Global adec: Global az Global yp1: Global XP1: Global al: Global q12: Global dyp0: Global dxp0 Global yp2: Global xp2: Global n12: Global dyp: Global dxp Public Function radijustu(ByVal kr) ks = Abs(kr * r1) + 1 / 72000000: st = Int(ks): md = (ks - st) * 60 mi = Int(md): se = Int((md - mi) * 600000) / 10000 radijustu = CStr(st) + "-" + CStr(mi) + "-" + CStr(se) End Function Public Sub širfit(xp, yp) ce = 111120.619606 * r1 f2 = 0.14388535813 f4 = 0.00021077857 f6 = 0.00000042311 f8 = 0.0000000009 g = xp / ce fi1 = g + (f2 * Sin(2 * g) + f4 * Sin(4 * g) + f6 * Sin(6 * g) + f8 * Sin(8 * g)) * r2 cf = Cos(fi1): e2 = e * e: sf = Sin(fi1) t = Tan(fi1): t2 = t * t eta = ec * cf: et2 = eta * eta n = A / Sqr(1 - e2 * sf * sf): n2 = n * n: n4 = n2 * n2 ypk = yp * yp: yp4 = ypk * ypk End Sub Public Sub fifi() fi2 = -t * (1 + et2) / (2 * n2) fi3 = t * (5 + 3 * t * t + 6 * et2 - 6 * t * t * et2) / (24 * n2 * n2) fi = fi1 + fi2 * ypk + fi3 * yp4 End Sub Public Sub konvergencija() c3 = t / n c4 = -t * (1 + t2 - et2) / (3 * n2 * n) c5 = t * (2 + 5 * t2 + 3 * t2 * t2) / (15 * n4 * n) c = c3 * yp + c4 * ypk * yp + c5 * yp4 * yp End Sub Public Function sustav(ByVal y) k = Int(y * 0.000001) sustav = k * 1000000 + 500000 l0 = k * 3 * r2 End Function Public Sub transformacija() yk = sustav(y)
78
yk1 = (6 - (1 + (y < 6500000) * 2) * (k = 6)) * 1000000 + 500000 xp = x / m0 yp = (y - yk) / m0 Call širfit(xp, yp) z = yp - n * 3 * r2 * Sgn(yk1 - yk) * cf z2 = z * z: z3 = z2 * z: z4 = z3 * z: z5 = z4 * z yp3 = ypk * yp: yp5 = yp4 * yp t4 = t2 * t2 q1 = (1 - t2 + et2) * z3 / 6 + t2 * z * ypk / 2 q2 = (-1 - 2 * t2 - et2) * yp3 / 6 q3 = (5 - 18 * t2 + t4) * z5 / 10 q4 = (5 * t2 - t4) * z3 * ypk q5 = (-1 - t2 + 2 * t4) * z2 * yp3 q6 = (-8 * t2 - 3 * t4) * z * yp4 / 2 q7 = (5 + 18 * t2 + 4 * t4) * yp5 / 10 ypc = z + (q1 + q2) / n2 + (q3 + q4 + q5 + q6 + q7) / (12 * n4) g1 = xp + t * (z2 - ypk) / (2 * n) g2 = (5 - t2 + 9 * et2) * z4 / 24 g3 = (-1 + t2 - et2) * z2 * ypk / 4 g4 = (-1 - 2 * t2 - et2) * z * yp3 / 6 g5 = (5 + 3 * t2 + et2) * yp4 / 24 xpc = g1 + t * (g2 + g3 + g4 + g5) / (n2 * n) yc = ypc * m0 + yk1 xc = xpc * m0 End Sub Public Sub redužip(yp1, XP1, yp2, xp2) dy = yp2 - yp1: dx = xp2 - XP1 ypm = yp1 + dy / 2: xpm = XP1 + dx / 2 yp = yp1: xp = XP1 srrad om1 = om yp = yp2: xp = xp2 srrad om2 = om yp = ypm: xp = xpm srrad ds = (om1 + 4 * om + om2) / 6 r1s = r1 * 3600 k1 = r1s / (2 * rm2) k2 = r1s / (6 * rm4) k3 = r1s * ec * ec * Cos(fi) ^ 2 * Tan(fi) / (rm2 * rm) k4 = r1s / (12 * rm2) ps1 = k1 * dx * yp - k2 * ypk * yp * dx + k3 * ypk * dy ps2 = k4 * dy * dx w12 = ps1 - ps2 w21 = -(ps1 + ps2) End Sub Public Sub srrad() Call širfit(xp, yp) fifi
79
rm = A * Sqr(1 - e2) / (1 - e2 * Sin(fi) ^ 2): rm2 = rm * rm: rm4 = rm2 * rm2 om = 1 + ypk / (2 * rm2) + yp4 / (24 * rm4) End Sub Public Sub drugatočka() Call širfit(xp, yp) konvergencija q12 = al - c dyp0 = s * Sin(q12): dxp0 = s * Cos(q12) yp2 = yp1 + dyp0: xp2 = XP1 + dxp0 Call redužip(yp1, XP1, yp2, xp2) n12 = al - c - w12 / 3600 * r2 d = s * ds dyp = d * Sin(n12): dxp = d * Cos(n12) End Sub
80
5. Testiranje programa
Pri testiranju programa korišten je program GAUSHN, koji je poslužio kao predložak za
usporedbu izračunatih rezultata ovog programa. U ovom poglavlju je dan usporedni prikaz
rezultata oba programa. Pri nekim rezultatima dolazi do odstupanja od jednog milimetra ili
tisućinke sekunde, što se pojavljuje zbog različitih tipova podataka korištenih u programima.
GAUSHN koristi Integer tip podataka, koji se koristi s manjim brojem znamenki iza
decimalne točke, dok VisualGAUSS koristi Variant tip podataka, koji koristi veći broj.
Navedeni su samo rezultati usporedbe novog programa sa programom GAUSHN jer nema
potrebe za dodatnim objašnjenjima.
5.1. Testiranje prvog zadatka
Pri testiranju prvog zadatka korištene su dvije točke, za koje GAUSHN sprema podatke
računanja u datoteku u sljedećem obliku:
GAUSH1
RACUNANJE PRAVOKUTNIH KOORDINATA U RAVNINI I
KONVERGENCIJE MERIDIJANA IZ GEOGRAFSKIH KOORDINATA
1 fi= 45 44 14.8847 la= 15 40 23.5089
yp= 52387.758 xp= 5066612.011
y= 5552382.519 x= 5066105.350
c= 0 28 55.6335
2 fi= 46 28 36.1658 la= 16 11 33.0661
yp= 91568.439 xp= 5149243.022
y= 5591559.282 x= 5148728.098
c= 0 51 53.0940
81
Rezultati računanja pomoću programa VisualGAUSS su sljedeći:
************************* RAČUNANJE PRAVOKUTNIH KOORDINATA U RAVNINI I
KONVERGENCIJE MERIDIJANA IZ GEOGRAFSKIH KOORDINATA
Točka: 1
Fi= 45-44-14.8847 La= 15-40-23.5089
Yp= 52387.758 Xp= 5066612.011
Y= 5552382.519 X= 5066105.349
c= 0-28-55.6335
*************************
Točka: 2
Fi= 46-28-36.1658 La= 16-11-33.0661
Yp= 91568.438 Xp= 5149243.022
Y= 5591559.281 X= 5148728.098
c= 0-51-53.094
82
5.2. Testiranje drugog zadatka
Rezultati računanja pomoću programa GAUSHN:
GAUSH2
RACUNANJE GEOGRAFSKIH KOORDINATA I KONVERGENCIJE
MERIDIJANA IZ PRAVOKUTNIH KOORDINATA U RAVNINI
1 y= 5552382.519 x= 5066105.350
fi= 45 44 14.8847 la= 15 40 23.5089
c= 0 28 55.6335
2 y= 5591559.282 x= 5148728.098
fi= 46 28 36.1658 la= 16 11 33.0661
c= 0 51 53.0940
Rezultati dobiveni pomoću programa VisualGAUSS:
*************************
RAČUNANJE GEOGRAFSKIH KOORDINATA I KONVERGENCIJE
MERIDIJANA IZ PRAVOKUTNIH KOORDINATA U RAVNINI
Točka: 1
Y= 5552382.519 X= 5066105.350
Fi= 45-44-14.8847 La=15-40-23.5089
c= 0-28-55.6335
*************************
Točka: 2
Y= 5591559.282 X= 5148728.098
Fi= 46-28-36.1658 La=16-11-33.0661
c= 0-51-53.094
83
5.3. Testiranje trećeg zadatka
Rezultati računanja iz programa GAUSHN:
GAUSH3
RACUNANJE REDUKCIJE PRAVCA I DUZINE
555 y1= 5455769.067 x1= 5038731.397
666 y2= 5427152.640 x2= 5067309.650
s= 40445.062 d= 40442.754
w12= -3.897 w21= 4.588
7 y1= 5500000.000 x1= 5050000.000
40 y2= 5500000.000 x2= 5050179.982
s= 180.000 d= 179.982
w12= 0.000 w21= 0.000
Rezultati računanja iz programa VisualGAUSS:
*************************
RAČUNANJE REDUKCIJE PRAVCA I DUŽINE
Točka 1: 555 Y1= 5455769.067 X1= 5038731.397
Točka 2: 666 Y2= 5427152.640 X2= 5067309.650
s= 40445.061 d= 40442.755
w12= -3.897 w21= 4.5882
*************************
Točka 1: 7 Y1= 5500000.000 X1= 5050000.000
Točka 2: 40 Y2= 5500000.000 X2= 5050179.982
s= 180 d= 179.982
w12= 0 w21= 0
84
5.4. Testiranje četvrtog zadatka
Rezultati programa GAUSHN:
GAUSH4
RACUNANJE PRAVOKUTNIH KOORDINATA U RAVNINI
IZ DUZINE I AZIMUTA GEODETSKE LINIJE
555 y1= 5455769.067 x1= 5038731.397
s= 40445.062 alfa= 314 33 25.4042
666 y2= 5427152.640 x2= 5067309.650
7 y1= 5500000.000 x1= 5050000.000
s= 180.000 alfa= 0 0 0.0000
40 y2= 5500000.000 x2= 5050179.982
Rezultati programa VisualGAUSS:
*************************
RAČUNANJE PRAVOKUTNIH KOORDINATA U RAVNINI
IZ DUŽINE I AZIMUTA GEODETSKE LINIJE
Točka 1: 555 Y1= 5455769.067 X1= 5038731.397
s= 40445.062 A= 314-33-25.4042
Točka 2: 666 Y2= 5427152.639 X2= 5067309.65
*************************
Točka 1: 7 Y1= 5500000.000 X1= 5050000.000
s= 180 A= 0-0-0.0
Točka 2: 40 Y2= 5500000 X2= 5050179.982
85
5.5. Testiranje petog zadatka
Rezultat programa GAUSHN:
GAUSH5
RACUNANJE DUZINE I AZIMUTA GEODETSKE LINIJE
IZ PRAVOKUTNIH KOORDINATA U RAVNINI
555 y1= 5455769.067 x1= 5038731.397
666 y2= 5427152.640 x2= 5067309.650
s= 40445.062 d= 40442.754
alfa12= 314 33 25.4042 alfa21= 134 17 32.3985
7 y1= 5500000.000 x1= 5050000.000
40 y2= 5500000.000 x2= 5050179.982
s= 180.000 d= 179.982
alfa12= 0 0 0.0000 alfa21= 180 0 0.0000
Rezultat programa VisualGAUSS:
*************************
RAČUNANJE DUŽINE I AZIMUTA GEODETSKE LINIJE
IZ PRAVOKUTNIH KOORDINATA U RAVNINI
Točka 1: 555 Y1=5455769.067 X1=5038731.397
Točka 2: 666 Y2=5427152.640 X2=5067309.650
d = 40442.755 s = 40445.061
A21 = 134-17-32.3985 A12 = 314-33-25.4042
*************************
Točka 1: 7 Y1=5500000.000 X1=5050000.000
Točka 2: 40 Y2=5500000.000 X2=5050179.982
d = 179.982 s = 180
A21 = 180-0-0 A12 = 0-0-0
86
5.6. Testiranje šestog zadatka
Rezultati programa GAUSHN:
GAUSH6
TRANSFORMACIJA PRAVOKUTNIH KOORDINATA IZ JEDNOG
KOORDINATNOG SUSTAVA U SUSJEDNI SUSTAV
218 y= 5610821.171 x= 5067029.450
ypc= -122619.401 xpc= 5067757.254
yc= 6377392.861 xc= 5067250.478
11 y= 5600000.000 x= 5000000.000
ypc= -135935.599 xpc= 5001166.855
yc= 6364077.994 xc= 5000666.739
Rezultati programa VisualGAUSS:
*************************
TRANSFORMACIJA PRAVOKUTNIH KOORDINATA IZ JEDNOG
KOORDINATNOG SUSTAVA U SUSJEDNI SUSTAV
Točka: 218
Y= 5610821.171 X= 5067029.450
Yp= -122619.402 Xp= 5067757.254
Transformirane koordinate :
Yc= 6377392.86 Xc= 5067250.478
*************************
Točka: 11
Y= 5600000.000 X= 5000000.000
Yp= -135935.6 Xp= 5001166.855
Transformirane koordinate :
Yc= 6364077.994 Xc= 5000666.738
87
6. Literatura
Borčić, B. (1976): Gauss-Krügerova projekcija meridijanskih zona, Sveučilišna naklada
Liber, Zagreb.
Craig, J.C. (1996): Microsoft Visual Basic 4.0:Programerska radionica, Znak, Zagreb.
Frančula, N. (2000): Kartografske projekcije, Geodetski fakultet Sveučilišta u Zagrebu,
Zagreb.
88
7. Sažetak
Gauss-Krügerova projekcija je službena kartografska projekcija u Republici Hrvatskoj.
Postoji šest osnovnih zadataka za računanja u toj projekciji, čije formule predstavljaju osnovu
programa VisualGAUSS. U njemu sam koristio matematičke izraze prilagođene računalnoj
obradi iz programa GAUSHN (napravljen za istu svrhu u programskom jeziku QBASIC).
Za izradu programa koristio sam programski jezik Visual Basic jer sam otprije poznavao
osnove rada u njemu.
Program je podijeljen u nekoliko zasebnih dijelova (formi) a to su: početna forma s osnovnim
podacima o programu, forma za odabir željenog zadatka, šest formi za računanja i forma za
spremanje rezultata računanja u datoteku.
Program in Visual Basic for computations in Transverse
Mercator Projection
Transverse Mercator Projection is the official map projection in the Republic of Croatia.
There are six basic tasks for the calculation in this projection, whose formulas represent the
basics of program VisualGAUSS. In that program I used mathematical expressions adapted
for computer processing from the program GAUSHN (made for the same purpose with
program language QBASIC). In creation of my program I used program language Visual
Basic in which I already had some basic knowledge.
Program is divided in a number of separate parts (forms) which are: startup form with some
basic data about the program, form for choosing the desired task, six forms for calculations
and the form for saving resuls of calculation in file.