Viết chương trình bình sai gián tiếp lưới mặt bằng bằng ngôn ngữ C - Phần 2

vào lúc 19:45
(Tiếp tục)

III. Tổ chức dữ liệu

 

1)      Đối tượng
Ø  Điểm No : Tên, Tọa độ (X,Y) , loại (gốc hay mới)
Ø  Trị đo
§ Góc : No(Trái, Giữa, Phải) , mβ.
§ Cạnh: No(Máy, Gương), S, mS.
Ø  Đánh số điểm: Đánh số từ 1 cho đến hết, điểm mới đánh số trước, điểm gốc đánh số sau.
2)      Tổ chức dữ liệu
Ø  Tên lưới: Dùng để đọc ra xem là lưới đo ở đâu.
Ø  Các thông số: Số góc, số cạnh, số phương vị, số điểm mới, số điểm gốc.
Ø  Sai số đo góc, sai số đo cạnh (a,b).
Ø  Tọa độ điểm gốc (1 điểm/ dòng)
Ø  Tọa độ điểm mới (1 điểm/ dòng)
Ø  Góc đo (1 góc/ dòng)
Ø  Cạnh đo (1 cạnh/ dòng)
Cấu trúc File dữ liệu:

IV. Lập các Modul chương trình.

Ø  Định nghĩa dữ liệu các dạng điểm, góc, cạnh trong lưới.
o   Điểm
typedef struct diem
{
     char ten[10];
     float x,y;
     int loai;
};
o   Góc
typedef struct goc
{
               int trai,giua,phai;
              float trido,mgoc;
};
o   Cạnh
typedef struct canh
{
              int dau,cuoi;
              float chieudai;
              float mchieudai;
};
Ø  Các hằng số sử dụng trong trắc địa.
const float pi=3.14159265;
const float ro=206265;
Ø  Hàm đổi từ Độ ra Radian.
float doidoraradian(int d,int p,float g)
{
        float R;
        R=(float(d)+float(p)/60+g/3600)/360*2*pi;
        return R;
}
Ø  Hàm lập hệ phương trình số hiệu chỉnh.
o   Phương trình số hiệu chỉnh góc
void hieuchinhgoc(int i,int k,int j,int t,diem *d,float a[],float gocdo)
{
int i1;
           float dx,dy,s1,s2,a1,a2;
           for(i1=1;i1<=2*t+1;i1++) a[i1]=0;
           dx=d[i].x-d[k].x;
           dy=d[i].y-d[k].y;
           s1=sqrt(dx*dx+dy*dy);
           a1=fmod(atan2(dy,dx)+2*pi,2*pi);
           if(d[i].loai<=t)
           {
              a[2*d[i].loai-1]=ro*sin(a1)/s1;
              a[2*d[i].loai]=-ro*cos(a1)/s1;
           }
           dx=d[j].x-d[k].x;
           dy=d[j].y-d[k].y;
           s2=sqrt(dx*dx+dy*dy);
           a2=fmod(atan2(dy,dx)+2*pi,2*pi);
           if(d[j].loai<=t)
           {
              a[2*d[j].loai-1]=-ro*sin(a1)/s2;
              a[2*d[j].loai]=ro*cos(a1)/s2;
           }
           if(d[k].loai<=t)
           {
              if(d[i].loai<=t && d[j].loai<=t)
              {
                   a[2*d[k].loai-1]=a[2*d[j].loai-1]-a[2*d[i].loai-1];
                   a[2*d[k].loai]=a[2*d[j].loai]-a[2*d[i].loai];
              }
              else
                   if(d[i].loai<=t)
                   {
                        a[2*d[k].loai-1]=-a[2*d[i].loai-1];
                        a[2*d[k].loai]=-a[2*d[i].loai];
                   }
                   else if(d[j].loai<=t)
                   {
                        a[2*d[k].loai-1]=a[2*d[j].loai-1];
                        a[2*d[k].loai]=a[2*d[j].loai];
                   }
           }
           a[2*t+1]=(gocdo-fmod(2*pi+a2-a1,2*pi))*ro;
}
o   Phương trình số hiệu chỉnh cạnh
void hieuchinhcanh(int dau,int cuoi,int t,diem d[],float *a,float sdo)
{
     int i1;
     float dx,dy,s1,a1;
     for(i1=1;i1<=2*t+1;i1++) a[i1]=0;
     dx=d[cuoi].x-d[dau].x;
     dy=d[cuoi].y-d[dau].y;
     s1=sqrt(dx*dx+dy*dy);
     a1=fmod(atan2(dy,dx)+2*pi,2*pi);
     if(d[dau].loai<=t)
     {
       a[2*d[dau].loai-1]=-cos(a1);
       a[2*d[dau].loai]=-sin(a1);
     }
     if(d[cuoi].loai<=t)
     {
       a[2*d[cuoi].loai-1]=cos(a1);
       a[2*d[cuoi].loai]=sin(a1);
     }
     a[2*t+1]=s1-sdo;
}
Ø  Các bước lập hệ phương trình chuẩn, giải hệ phương trình chuẩn, tính tọa độ các điểm mới sau khi bình sai, đánh giá độ chính xác sẽ được thực hiện vào trực tiếp chương trình chính.


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