Lập trình các bài toán trắc địa cơ bản bằng C++

vào lúc 09:21
Trong trắc địa có các bài toán cơ bản sau là: Đổi Độ ra Radian & ngược lại, Giải bài toán trắc địa thuận, Giải bài toán trắc địa nghịch, Tính toạ độ điểm I là điểm của một tam giác biết toạ độ hai điểm còn lại, Tính toạ độ của điểm giao hội nghịch, Tính toạ độ điểm giao hội cạnh. Những bài toán này ta dễ dàng lập trình thành một ứng dụng để tiện tính toán. Sau đây giới thiệu cách viết ứng dụng với C++.

I. Cơ sở lý thuyết
1)      Đổi Độ ra Radian & ngược lại.
a)      Mục đích của việc chuyển đổi.
Độ và Radian là hai đơn vị đo góc phổ biến. Độ là đơn vị được dùng trong đo đạc. Radian là đơn vị dùng trong tính toán, đặc biệt là khi sử dụng các phép nội suy giá trị các hàm lượng giác. Vì vậy để thuận tiện cho việc chuyển đổi từ đo đạc sang tính toán ta cần có chương trình chuyển đổi.
b)      Cơ sở lý thuyết chuyển đổi.
            1 góc tròn =2p rad =360o
            ®Quan hệ để chuyển đổi hai đơn vị này là:
                  2p rad =360o  ®α rado.p/180; αorad.180/p
2)      Giải bài toán trắc địa thuận.
a)      Mục đích giải bài toán trắc địa thuận.
      Từ một điểm gốc biết toạ độ X và Y ta xác định toạ độ của một điểm khác gần đó dựa vào điểm gốc trên, bằng cách đo khoảng cách và phương vị của điểm gốc đó và điểm cần xác định.
b)      Cơ sở lý thuyết tính toán.
Ta biết X1, Y1, α12, S12. Tính X2, Y2?
Tính X2, Y2 dựa vào công thức sau:
X2 =∆X12 +X1 ; ∆X12 =Cosα12 .S12
Y2 =∆Y12 +Y1 ; ∆Y12 =Sinα12 .S12
3)      Giải bài toán trắc địa nghịch.
a)      Mục đích giải bài toán trắc địa nghịch.
      Dùng để xác định khoảng cách và phương vị của hai điểm, khi biết toạ độ hai điểm đó.
b)      Cơ sở lý thuyết tính toán.
Ta biết toạ độ hai điểm X1, Y1, X2, Y2. Tính α12, S12?
Tính α12 =acrtg((Y2 -Y1)/(X2 -X1))
Tính S212 =(X2 -X1)2+(Y2 -Y1)2
4)      Tính toạ độ điểm I là điểm của một tam giác biết toạ độ hai điểm còn lại. 
a)      Mục đích.
      Dùng để xác định toạ độ điểm I, khi ở gần điểm I có hai điểm biết toạ độ. Ta đo thêm hai góc tương ứng.
b)      Cơ sơ lý thuyết tính toán.
                  Ta biết toạ độ hai điểm trái và phải và đồng thời đo hai góc trái và phải. Tính toạ độ điểm I?
             
Ø      Khi dung máy tính bấm tay:
ü      Giải bài toán trắc địa nghịch tính phương vị và chiều dài cạnh hai cạnh đã biết toạ độ(điểm trái và phải so với điểm I).
S2PT =(XT -XP)2 +(YT -YP)2 ; αPT =acrtg((YT -YP)/(XT -XP))
ü      Tính chiều dài các cạnh STI, SPI.
STI =SPT .SinβT /Sin(βTP)
SPI =SPT .SinβP /Sin(βTP)
ü      Tính phương vị các cạnh dựa vào phương vị cạnh gốc αTP và các góc đo βT, βP.
            αPITP –βP +180o ; αTIPTT -180o
ü      Tính các gia số toạ độ.
∆XPI =SPI .CosαPI ; ∆YPI =SPI .SinαPI
∆XTI =STI .CosαTI ; ∆YPI =STI .SinαTI
ü      Tính toạ độ điểm I theo hai đường.
XI =XP +∆XPI ; YI= YP +∆YPI
XI =XT +∆XTI ; YI= YT +∆YTI
ü      Tính toạ độ điểm giao hội I chính thức bằng cách lấy trị trung bình.
(XI)TB =((XI)A +(XI)B) /2 ; (YI)TB =((YI)A +(YI)B) /2
Ø      Tính theo công thức IUNGA:
XI =(XP .CotgβT +XT .CotgβP +(YT -YP)) /(CotgβP +CotgβT)
YI =(YP .CotgβT +YT .CotgβP -(XT -XP)) /(CotgβP +CotgβT)
Kiểm tra tính toán:
Tính góc I =180o –(βP +βT)
Tính góc I theo công thức sau:
tgI =((XT -XI)(YP -YI) +(XP -XI)(YT -YI)) /(( XT -XI)(XP -XI) +(YP -YI)(YT -YI))
Trong phần lập trình này sử dụng công thức IUNGA.
5)      Tính toạ độ của điểm giao hội nghịch.
a)      Mục đích.
      Dùng để xác định toạ độ điểm giao hội Q, khi ở gần điểm Q có ba điểm biết toạ độ. Và ta đo hai góc(góc hợp bởi điểm trái với Q và điểm giữa, và góc hợp bởi điểm trái với Q và điểm phải).
b)      Cơ sở lý thuyết tính toán.
      Ta biết toạ độ ba điểm trái, phải, giữa, và hai góc β1, β2(lần lượt là góc hợp bởi điểm trái với Q và điểm giữa, và góc hợp bởi điểm trái với Q và điểm phải). Tính toạ độ giao điểm Q?
     
ü      Tính phương vị cạnh QT theo công thức:
tgαQT =((YG -YT).Cotgβ1 +(YT -YP).Cotgβ2 +(XP -XG)) /((XG -XP).Cotgβ1 +(XT -XP).Cotgβ2 –(YP -YT))
ü      Tính phương vị cạnh QG và QP theo công thức:
αQGQT1 -180o
αQPQT2 -180o
ü      Tính toạ độ điểm giao hội nghịch Q
      XQ =(XT .tgαQT –XG .tgαQG +(YG -YT)) /(tgαQT -tgαQG)
      YQ =(XQ -XT) .tgαQT +YT
hoặc  YQ =(XQ -XG) .tgαQG +YG
hoặc  YQ =(XQ -XP) .tgαQP +YP
6)      Tính toạ độ điểm giao hội cạnh.
a)      Mục đích.
      Dùng để xác định toạ độ điểm giao hội, khi biết toạ độ hai điểm gần điểm cần xác định và khoảng cách từ điểm cần xác định tới hai điểm đó.
b)      Cơ sở lý thuyết tính toán.
      Ta biết toạ độ điểm A, B và khoảng cách SAI, SBI. Tính toạ độ điểm giao hội I?
      Tính toạ độ điểm I dựa vào mối quan hệ sau:
            S2AI =(XI -XA)2 +(YI -YA)2;
            S2BI =(XI -XB)2 +(YI -YA)2;
II. Chương trình viết bằng C++
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
#include<math.h>
const double pi=3.141592654;

void doraradian()
{
      int Do,Phut,Giay;
      double R;
      cout<<"\nNhap Do can doi sang Radian";
      cout<<"\n Do Phut Giay la: ";
      cin>>Do>>Phut>>Giay;
      R=double(Do+double(Phut)/60+double(Giay)/3600)/360*2*pi;
      cout<<"\n Luong Radian doi ra duoc la:"<<setw(6)<<R<<"(Rad)";
}

void radianrado()
{
      double r,tg;
      int Do,Phut,Giay;
      cout<<"\nNhap Radian can doi sang Do:";
      cin>>r;
      tg=360*r/(2*pi);
      Do=ceil(tg);
      if(Do>tg)
            Do=Do-1;
      tg=tg-Do;
      tg=tg*60;
      Phut=ceil(tg);
      if(Phut>tg)
            Phut=Phut-1;
      tg=tg-Phut;
      tg=tg*60;
      Giay=ceil(tg);
      tg=Giay-tg;
      if(tg>0.5)
            Giay=Giay-1;
      if(Giay>=60)
      {
            int t=Giay/60;
            Giay=Giay-t*60;
            Phut=Phut+t;
      }
      if(Phut>=60)
      {
            int k=Phut/60;
            Phut=Phut-k*60;
            Do=Do+k;
     
      }
      if(Giay==0)
            if(Phut==0)
            cout<<"\n Luong Do doi ra duoc la:"<<setw(6)<<Do<<" 00"<<" 00";
            else
            cout<<"\n Luong Do doi ra duoc la:"<<setw(6)<<Do<<setw(3)<<Phut<<" 00";
      else
            if(Phut==0)
            cout<<"\n Luong Do doi ra duoc la:"<<setw(6)<<Do<<" 00"<<setw(3)<<Giay;
            else
            cout<<"\n Luong Do doi ra duoc la:"<<setw(6)<<Do<<setw(3)<<Phut<<setw(3)<<Giay;
}

void tracdiathuan()
{
      double x1,x2,y1,y2,s12,x12,y12,tg;
      int Do,Phut,Giay;
      cout<<"\nNhap toa do diem dau la:";
      cout<<"\n X1=";cin>>x1;
      cout<<"\n Y1=";cin>>y1;
      do
      {
            cout<<"\nNhap chieu dai 2 diem >0";
            cout<<"\n S12=";cin>>s12;
      }
      while(s12==0);
      do
      {
            cout<<"\nNhap phuong vi 2 diem <=360 do";
            cout<<"\n Do Phut Giay la: ";
            cin>>Do>>Phut>>Giay;
            tg=double(Do+double(Phut)/60+double(Giay)/3600)/360*2*pi;
      }
      while(tg>360);
      x12=cos(tg)*s12;
      y12=sin(tg)*s12;
      x2=x1+x12;
      y2=y1+y12;
      cout<<"\n Toa do diem can xac dinh la:";
      cout<<"\n  X2="<<setw(8)<<x2;
      cout<<"\n  Y2="<<setw(8)<<y2;
}

void tracdianghich()
{
      double x1,x2,y1,y2,s12,x12,y12,a,b,tg;
      int Do,Phut,Giay;
      do
      {
            cout<<"\nNhap 2 diem khong duoc trung nhau";
            cout<<"\nNhap toa do diem dau la:";
            cout<<"\n X1=";cin>>x1;
            cout<<"\n Y1=";cin>>y1;
            cout<<"\nNhap toa do diem cuoi la:";
            cout<<"\n X2=";cin>>x2;
            cout<<"\n Y2=";cin>>y2;
      }
      while((x1==x2)&&(y1==y2));
      x12=x2-x1; a=abs(x12);
      y12=y2-y1; b=abs(y12);
      s12=sqrt(x12*x12+y12*y12);
      if(y12==0)
            if(x12>0) tg=2*pi;
            else tg=pi;
      if(x12==0)
            if(y12>0) tg=pi/2;
            else tg=3*pi/2;
      if((x12>0)&&(y12>0))
            tg=atan(b/a);
      if((x12>0)&&(y12<0))
            tg=180-atan(b/a);
      if((x12<0)&&(y12<0))
            tg=180+atan(b/a);
      if((x12>0)&&(y12<0))
            tg=360-atan(b/a);
      tg=360*tg/(2*pi);
      Do=ceil(tg);
      if(Do>tg)
            Do=Do-1;
      tg=tg-Do;
      tg=tg*60;
      Phut=ceil(tg);
      if(Phut>tg)
            Phut=Phut-1;
      tg=tg-Phut;
      tg=tg*60;
      Giay=ceil(tg);
      tg=Giay-tg;
      if(tg>0.5)
            Giay=Giay-1;
      if(Giay>=60)
      {
            int t=Giay/60;
            Giay=Giay-t*60;
            Phut=Phut+t;
      }
      if(Phut>=60)
      {
           
            int k=Phut/60;
            Phut=Phut-k*60;
            Do=Do+k;
      }
      if(Giay==0)
            if(Phut==0)
            cout<<"\n Phuong vi 2 diem la:"<<setw(6)<<Do<<" 00"<<" 00";
            else
            cout<<"\n Phuong vi 2 diem la:"<<setw(6)<<Do<<setw(3)<<Phut<<" 00";
      else
            if(Phut==0)
            cout<<"\n Phuong vi 2 diem la:"<<setw(6)<<Do<<" 00"<<setw(3)<<Giay;
            else
            cout<<"\n Phuong vi 2 diem la:"<<setw(6)<<Do<<setw(3)<<Phut<<setw(3)<<Giay;
      cout<<"\n Khoang cach giua 2 diem la:"<<setw(6)<<s12;
}

void toadodiemI()
{
      double xt,xp,yt,yp,xi,yi,tgt,tgp;
      int Dot,Phutt,Giayt,Dop,Phutp,Giayp;
      do
      {
            cout<<"\nNhap 2 diem khong duoc trung nhau va 2 goc khac 0 do";
            cout<<"\nNhap thong tin cho diem Phai";
            cout<<"\n Toa do la:";
            cout<<"\n  XP=";cin>>xp;
            cout<<"\n  YP=";cin>>yp;
            cout<<"\n Goc la:";
            cout<<"\n Do Phut Giay:";cin>>Dop>>Phutp>>Giayp;
            cout<<"\nNhap thong tin cho diem Trai";
            cout<<"\n Toa do la:";
            cout<<"\n  XT=";cin>>xt;
            cout<<"\n  YT=";cin>>yt;
            cout<<"\n Goc la:";
            cout<<"\n Do Phut Giay:";cin>>Dot>>Phutt>>Giayt;
            tgp=double(Dop+double(Phutp)/60+double(Giayp)/3600)/360*2*pi;
            tgt=double(Dot+double(Phutt)/60+double(Giayt)/3600)/360*2*pi;
      }
      while(((xt==xp)&&(yt==yp))||(tgp==0)||(tgt==0));
      xi=(xp/tan(tgt)+xt/tan(tgp)+(yt-yp))/(1/tan(tgp)+1/tan(tgt));
      yi=(yp/tan(tgt)+yt/tan(tgp)-(xt-xp))/(1/tan(tgp)+1/tan(tgt));
      cout<<"\n Toa do diem I can xac dinh la:";
      cout<<"\n  XI="<<setw(6)<<xi;
      cout<<"\n  YI="<<setw(6)<<yi;
}

void giaohoinghich()
{
      double xt,xp,xg,yt,yp,yg,tg1,tg2,xq,yq,p1,p2,k;
      int Don,Phutn,Giayn,Dol,Phutl,Giayl;
     
      do
      {
            cout<<"\nBan hay nhap 3 diem khong duoc trung nhau";
            cout<<"\nNhap toa do diem phai";
            cout<<"\n XP=";cin>>xp;
            cout<<"\n YP=";cin>>yp;
            cout<<"\nNhap toa do diem giua";
            cout<<"\n XG=";cin>>xg;
            cout<<"\n YG=";cin>>yg;
            cout<<"\nNhap toa do diem trai";
            cout<<"\n XT=";cin>>xt;
            cout<<"\n YT=";cin>>yt;
      }
      while((xt==xp)&&(yt==yp)||(xt==xg)&&(yt==yg)||(xp==xg)&&(yp==yg));

      do
      {
            cout<<"\nNhap 2 goc do khac 0 do";
            cout<<"\n Nhap goc nho la:";
            cout<<"\n  Do Phut Giay:";cin>>Don>>Phutn>>Giayn;
            cout<<"\n Nhap goc lon la:";
            cout<<"\n  Do Phut Giay:";cin>>Dol>>Phutl>>Giayl;
            tg1=double(Don+double(Phutn)/60+double(Giayn)/3600)/360*2*pi;
            tg2=double(Dol+double(Phutl)/60+double(Giayl)/3600)/360*2*pi;
      }
      while((tg1==0)||(tg2==0));
      k=((yg-yt)/tan(tg1)+(yt-yp)/tan(tg2)+(xp-xg))/((xg-xp)/tan(tg1)+(xt-xp)/tan(tg2)-(yp-yg));
      p1=atan(k);
      p2=p1+tg1-pi;
      if(p2>2*pi)
            p2=p2-2*pi;
      xq=((xt*tan(p1)-xg*tan(p2)+(yg-yt))/(tan(p1)-tan(p2)));
      yq=(xp-xt)*tan(p1)+yt;
      cout<<"\n Toa do diem giao hoi nghich la:";
      cout<<"\n  Xp="<<setw(6)<<xq;
      cout<<"\n  Yp="<<setw(6)<<yq;
}

void giaohoicanh()
{
      double XA,XB,YA,YB,XI,YI,SAI,SBI,XI1,XI2,t1,t2,a1,a2,a3,dt;
      do
      {
            cout<<"\nNhap 2 diem khong duoc trung nhau";
            cout<<"\n Nhap toa do diem dau la:";
            cout<<"\n  XA=";cin>>XA;
            cout<<"\n  YA=";cin>>YA;
            cout<<"\n Nhap toa do diem cuoi la:";
            cout<<"\n  XB=";cin>>XB;
            cout<<"\n  YB=";cin>>YB;
      }
     
      while((XA==XB)&&(YA==YB));
      do
      {
            cout<<"\nNhap chieu dai 2 canh >0";
            cout<<"\n Nhap chieu dai canh AI,SAI=";cin>>SAI;
            cout<<"\n Nhap chieu dai canh BI,SBI=";cin>>SBI;
     
      }
      while(SAI==0||SBI==0);
      t1=(XA-XB)/(YB-YA);
      t2=((SAI*SAI-SBI*SBI-XA*XA+XB*XB-YA*YA+YB*YB)/(2*(YB-YA)));
      a1=1+t1*t1;
      a2=-2*XA+2*t1*t2-2*t1*YA;
      a3=XA*XA+t2*t2-2*t2*YA+YA*YA-SAI*SAI;
      dt=a2*a2-4*a1*a3;
      if(dt<0)
            cout<<"\n  Khong co diem I thoa man dieu kien vua nhap";
      else
            if(dt==0)
            {
            cout<<"\n  Co 1 diem I thoa man";
            cout<<"\n  Toa do diem I la:";
            XI=-a2/(2*a1);
            cout<<"\n   XI="<<setw(6)<<XI;
            cout<<"\n   YI="<<setw(6)<<XI*t1+t2;
            }
            else
            {
            cout<<"\n  Co 2 diem I thoa man";
            cout<<"\n   Toa do diem 1 la:";
            XI1=(-a2+sqrt(dt))/(2*a1);
            cout<<"\n    XI1="<<setw(6)<<XI1;
            cout<<"\n    YI1="<<setw(6)<<XI1*t1+t2;
            cout<<"\n   Toa do diem 2 la:";
            XI2=(-a2-sqrt(dt))/(2*a1);
            cout<<"\n    XI2="<<setw(6)<<XI2;
            cout<<"\n    YI2="<<setw(6)<<XI2*t1+t2;
            }
}

void menu()
{
      cout<<"\n1.Doi tu Do ra Radian";
      cout<<"\n2.Doi tu Radian ra Do";
      cout<<"\n3.Giai bai toan trac dia thuan";
      cout<<"\n4.Giai bai toan trac dia nghich";
      cout<<"\n5.Tinh toa do diem I";
      cout<<"\n6.Tinh toa do cua diem giao hoi nghich";
      cout<<"\n7.Tinh toa do cua diem giao hoi canh";
      cout<<"\n9.Thoat khoi chuong trinh";
}

void main()
{
      int yc;
      do
      {

            menu();
            cout<<"\n Ban hay chon 1 trong cac chuc nang tren:";cin>>yc;
            switch(yc)
            {
            case 1:
            cout<<"\n*************************************************************";
            doraradian();
            cout<<"\n*************************************************************";
            break;

            case 2:
            cout<<"\n*************************************************************";
            radianrado();
            cout<<"\n*************************************************************";
            break;

            case 3:
            cout<<"\n*************************************************************";
            tracdiathuan();
            cout<<"\n*************************************************************";
            break;

            case 4:
            cout<<"\n*************************************************************";
            tracdianghich();
            cout<<"\n*************************************************************";
            break;
           
            case 5:
            cout<<"\n*************************************************************";
            toadodiemI();
            cout<<"\n*************************************************************";
            break;

            case 6:
            cout<<"\n*************************************************************";
            giaohoinghich();
            cout<<"\n*************************************************************";
            break;

            case 7:
            cout<<"\n*************************************************************";
            giaohoicanh();
      cout<<"\n*************************************************************";
            break;

            }
      }
      while(yc!=9);
}

Bạn tải code về ở đây. Lưu ý để chạy code thì máy tính bạn phải cài đặt chương trình C++ (Dùng đĩa Visual)
Hãy like nếu bài viết có ích →
Kết bạn với gisgpsrs trên Facebook để nhận bài viết mới nóng hổi