Professional Documents
Culture Documents
dengan model ellipsoid WGS '84. diperoleh data sbb : A = 30o LU; A = 110o BT; hA = +1000 m B = 40o LS; B = 100o BB; hB = +500 m Tentukan : Koordinat Kartesi 3D terhadap titik A dan titik B jika rotasi = 15 o searah dengan putaran jarum jam dan translasi (X, Y, Z) = +5 m, +7 m dan +8 m. Jawab : Diagram flowchart untuk penyelesaian masalah tersebut :
Mulai
, h titik
ke-M Menghitung N, X, Y dan Z titik ke-M
Input ,
Masuk toleransi ?
Y
Masukkan besar rotasi dan translasi masing-masing sumbu
Mengalikan matrix rotasi dengan matrix koordinat awal Menjumlahkan hasil perkalian dengan matrix translasi Output hasil Transformasi titik ke-M M=M+1
M> K?
Y Selesai
Dari algoritma tersebut dibuat suatu program dalam bahasa pemrograman Pascal untuk menghitung hasil transformasi kedua titik yang dicari. Tampilan program tersebut dengan nilai parameter pada soal adalah seperti di bawah ini:
Dari program tersebut didapat hasil sebagai berikut: a. Titik 1 (titik A) : = 30o; = 110o; h = 1000 m - Transformasi pertama ke koordinat kartesi 3D : XA = 1891071.3263 YA = 5195675.7674 ZA = 3170873.7353 - Transformasi Kedua ke koordinat kartesi 3D (setelah ditransformasi): XA' = 1779780.0583 YA' = 4822939.0003 ZA' = 3767947.1381 Berikut dilampirkan listing program tersebut :
program transformasi_koordinat; uses crt; const tlrn = 0.00029088; var a,b,e,f,N,N2,x,y,z,h,h2, lat,long,lat2,long2, rotx,roty,rotz count,count2,dx,dy,dz,k,m mtawal,mthasil,mttemp mtrot mttrans ulang ch function degtorad(x : real):real; var py : real; begin py := arctan(1)*4.0; degtorad := x*py/180; end; begin clrscr; writeln(' Input a dan b ellipsoid yang akan digunakan : '); writeln('(Contoh pada WGS ''84: a = 6378137; b=6356752.3142)'); readln(a,b); {a := 6378137; b :=6356752.3142;} while (a<b) do begin clrscr; writeln('a harus lebih besar dari b!!'); writeln('Input a dan b ellipsoid yang dimaksud :'); readln(a,b); end; e := sqrt(a*a-b*b)/a; f := (a-b)/a; writeln('Masukkan Jumlah titik yang akan dicari koordinatnya :'); readln(k); m := 1; {==============MAIN LOOP==============} repeat writeln; writeln('Titik Ke : ',m); writeln('Inputkan koordinat titik dalam koordinat geodetik'); writeln('Berurutan latitude, longitude, dan h :'); readln(lat, long, h); if ((lat = 180) or (lat=360)) then lat := 0
b. Titik 2 (titik B) : = 40o; = 100o; h = 500 m - Transformasi pertama ke koordinat kartesi 3D : XB = 1673535.556 YB = 4598001.1506 ZB = 4078306.966 - Transformasi Kedua ke koordinat kartesi 3D (setelah ditransformasi): XB' = 7105108.7972 YB' = 2951118.5111 ZB' = 8127670.314
: : : : : : :
real; integer; array[1..3] of real; array[1..3,1..3] of real; array[1..3] of integer; boolean; char;
else if (lat = 270) then lat := -90 else if (lat > 270) then lat := 360-lat else if (lat > 180) then lat := 270-lat else if (lat > 90) then lat := 180-lat; if ((long = 180) or (long=360)) then long := 0 else if (long = 270) then long := -90 else if (long > 270) then long := 360-long else if (long > 180) then long := 270-long else if (long > 90) then long := 180-long; lat := degtorad(lat); long := degtorad(long); N x y z {---------RUMUS UTAMA DISINI-------------} := a/sqrt(1-sqr(e)*sqr(sin(lat))); := (h+N)*cos(lat)*cos(long); := (h+N)*cos(lat)*sin(long); := (h+(1-sqr(e))*N)*sin(lat); { --------------}
writeln('Hasil transformasi pertama ke koordinat kartesi 3D : '); writeln('nilai x = ',x:13:5); writeln('nilai y = ',y:13:5); writeln('nilai z = ',z:13:5); {koreksi dan pengecekan hitungan disini untuk iterasi awal lat=0} writeln; writeln('Tekan <enter> untuk memulai pengecekan nilai transformasi '); readln; writeln('Pengecekan nilai hasil transformasi pertama...'); lat2 := 0; count:= 1; N2 := a; repeat h2 := sqrt(sqr(x)+sqr(y)) / cos(lat2)-N2; lat2 := arctan(z/(sqrt (sqr(x)+sqr(y)) * (1-sqr(e)*N2/(N2+h2)))); N2 := a / (sqrt(1-(f*(2-f)*sqr(sin(lat2))))); long2 := arctan(y/x); writeln; if (count=1) then begin writeln('Nilai awalnya : '); writeln('N = ',N:0:5); writeln('h = ',h:0:5); writeln('lat = ',lat:0:5); writeln('long = ',long:0:5); end; writeln; writeln('Hasil hitungan iterasi ke-',count,' adalah :'); writeln('N = ',N2:16:9,' Selisihnya adalah : ',(N-N2):13:9); writeln('h = ',h2:16:9,' Selisihnya adalah : ',(h-h2):13:9); writeln('lat = ',lat2:16:9,' Selisihnya adalah : ',(lat-lat2):13:9); writeln('long= ',long2:16:9,' Selisihnya adalah : ',(long-long2):13:9); if ( (abs(N-N2)<= 0.01) and (abs(h-h2)<= 0.01) and (abs(lat-lat2)<= tlrn) and (abs(longlong2)<= tlrn) ) then begin writeln; writeln('Semua hitungan sudah masuk toleransi pada iterasi ke-',count); ulang := false; end else begin writeln('Satu atau lebih hitungan belum masuk toleransi (1 menit dan 0.01 m)'); writeln('Ulang iterasi? <y/t>'); ch := readkey; if ((ch = 'y') or (ch = 'Y')) then ulang := true else ulang := false; end; inc(count); until (ulang = false); {menghitung transformasi ke kartesi 3D kedua} writeln;
writeln; writeln('Masukkan besar sudut rotasi masing-masing sumbu.'); writeln('Jika berlawanan arah jarum jam, masukkan dalam bentuk negatif.'); writeln('Berurutan sb-X, sb-Y dan sb-Z :'); readln(rotx, roty, rotz); rotx := degtorad(rotx); roty := degtorad(roty); rotz := degtorad(rotz); writeln('Masukkan besar translasi masing-masing sumbu'); writeln('Berurutan sb-X, sb-Y dan sb-Z :'); readln(dx, dy, dz); {memasukkan ke matrix koordinat awal} mtawal[1] := x; mtawal[2] := y; mtawal[3] := z; {memasukkan ke matrix rotasi} mtrot[1,1] := cos(roty)*cos(rotz); mtrot[1,2] := -cos(rotx)*sin(rotz)+sin(rotx)*sin(roty)*cos(rotz); mtrot[1,3] := sin(rotx)*sin(rotz)+cos(rotx)*sin(roty)*cos(rotz); mtrot[2,1] := cos(roty)*sin(rotz); mtrot[2,2] := cos(rotx)*cos(rotz)+sin(rotx)*sin(roty)*sin(rotz); mtrot[2,3] := -sin(rotx)*cos(rotz)+cos(rotx)*sin(roty)*sin(rotz); mtrot[3,1] := -sin(roty); mtrot[3,2] := sin(rotx)*cos(roty); mtrot[3,3] := cos(rotx)*cos(roty); {memasukkan ke matrix translasi} mttrans[1] := dx; mttrans[2] := dy; mttrans[3] := dz; {tulis ke layar} clrscr; writeln('Matrix koordinat awal :'); for count := 1 to 3 do writeln(mtawal[count]:13:5); writeln; writeln('Matrix rotasinya :'); for count := 1 to 3 do begin for count2 := 1 to 3 do write(mtrot[count,count2]:13:9); writeln; end; writeln; writeln('Matrix translasinya :'); for count := 1 to 3 do writeln(mttrans[count]:5); {mengalikan matrix.. matrix rotasi x matrix koordinat awal} for count := 1 to 3 do for count2 := 1 to 3 do begin mttemp[count] := mtrot[count,count2]*mtawal[count2]; mthasil[count] := mttemp[count] + mthasil[count]; end; {matrix hasil rotasi + matrix translasi} for count := 1 to 3 do mthasil[count] := mthasil[count]+mttrans[count]; writeln; writeln('Matrix hasil transformasi (X'',Y'',Z'') titik ke-',m,' : '); for count := 1 to 3 do writeln(mthasil[count]:13:7); inc(m); until (m > k); writeln; writeln; writeln(' Program Selesai'); writeln(' Diprogram oleh : Dany Puguh Laksono'); writeln(' Jurusan Teknik Geodesi dan Geomatika UGM Yogyakarta'); writeln(' Tahun 2008'); readln; end.