计算GDOP
#include <iostream>
#include <fstream>
#include "..\include\CPosition.h"
#include "..\include\Constant.h"
#include "..\include\Data.h"
#include<stdio.h>
#define MATHRES 1E-12
#define FOUR 4
typedf struct{ int prn;
XYZCoor pos;
}SVPosStruct;
int Maxsat;
int ReadSatPosFile(FILE*SVPosFile,SVPosStruct*SV);
int fun(int n);
void ComputeDOP2(XYZCoor Obs,XYZCoor SV[],DOPStruct*DOP);
void main()
{ double a=6378137.0;
double e2=0.00669342162297;
double PAI=3.1415926535898;
double P0=PAI/180.0;
double N;
XYZCoor ObsPos;
int LatDeg,LonDeg,LatMin,LonMin;
float LatSec,LonSec,H,B,L;
FILE*SVPosFile,*SVDOPFile;
int i,j,k,ri,num;
int array[];
int temp;
XYZCoor SV[];
int SVNo[];
SVPosStruct*SVPos;
DOPStruct DOP;
prinf("Please Input local Lat(dd mm.mmmm):");
scanf("%i %f",&LatDeg,&LatMin);
B=((float)LatDeg+LatMin/60.0)*P0;
prinf("Please Input local Lon(ddd mm.mmmm):");
scanf("%i %f",&LonDeg,&LonMin);
L=((float)LonDeg+LonMin/60.0)*P0;
prinf("Please Input local Height(meter):");
scanf("%f",&H);
B=(LatDeg+LatMin/60.0+LatSec/3600.0)*P0;
L=(LonDeg+LonMin/60.0+LonSec/3600.0)*P0;
N=a/sqr(1.0-e2*sin(B)*sin(B));
ObsPos.X=(N+H)*cos(B)*cos(L);
ObsPos.Y=(N+H)*cos(B)*sin(L);
ObsPos.Z=(N*(1.0-e2)+H)*sin(B);
if((SVPosFile=fopen("satpos.out","r"))==NULL)
{
prinf("cannot open input file\n");
exit(); }
if((SVDOPFile=fopen("satdop.out","w"))==NULL)
{
prinf("cannot open output file\n");
exit(); }
if((SVPos=(SVPosStruct*)malloc(sizeof(SVPosStruct)*))==NULL)
{
prinf("not enough memory to allocate buffer\n");
exit(); }
MaxSat=;
i=;
do
{ if(ReadSatPosFile(SVPosFile,(SVPos+i)))break;
i++;
if(i>=)break; }while();
if(MaxSat<)
{
prinf("not enough satellite to compute DOP\n");
exit(); }
num=fun(MaxSat)/(fun(MaxSat-)*fun());
fprinf(SVDOPFile,"SV Combinnation GDOP\n");
ri=;
array[]=MaxSat;
do
{ if(ri!=FOUR)
if((ri+array[ri])>FOUR)
{
array[ri+]=array[ri]-;
ri++: }
else
{
ri--;array[ri]--;
}
else
{
for(j=;j<=FOUR;j++)
{
SVNo[j-]=(SVPos+array[j]-)->prn;
SV[j-].X=(SVPos+array[j]-)->pos.X
SV[j-].Y=(SVPos+array[j]-)->pos.Y
SV[j-].Z=(SVPos+array[j]-)->pos.Z; }
ComputeDOP2(ObsPos,SV,&DOP);
fprinf(SVDOPFile,"%02d %02d-%02d-%02d %6.1f\n",SVNo[],SVNo[],SVNo[],SVNo[],DOP.GDOP);
if(array[FOUR]--)
{
ri--;array[ri]--;
}
else
{
array[ri]--;
} } }while(array[]!=FOUR-);
fclose(SVPosFile);
fclose(SVDOPFile);
free(SVPos);
int fun(int n)
{
int i;
int res;
if(n<)return0;
res=;
for(i=;i<=n;i++)res*=i;
return res; }
int ReadSatPosFile(FILE*SVPosFile,SVPosStruct*SV)
{
char t1[],t2[],t3[];
if(fscanf(SVPosFile,"%d%s%s%s\n",&SV->prn,t1,t2,t3))
return ;
SV->pos.X=atof(t1);
SV->pos.Y=atof(t2);
SV->pos.Z=atof(t3);
MaxSat++;
if(MaxSat>=)return ;
return ; }
void ComputeDOP2(XYZCoor Obs.XYZCoor SV[],DOPStract*DOP)
{
double PAI=3.1415926535898;
double P0=PAI/180.0;
int Row=,Col=;
int n=Row;
double Qp[][];
double Qpt[][];
double QptXQp[][];
double Q[][];
int i,j,k,ii,jj;
double Temp;
double b,max,A[][];
int *z;
for(i=;i<Row;i++)
{
Temp=sqrt((Obs.X-SV[i].X)*(Obs.X-SV[i].X)+(Obs.Y-SV[i].Y)*(Obs.X-SV[i].Y)+(Obs.Z-SV[i].Z)*(Obs.X-SV[i].Z));
Qp[i][]=(SV[i].X-Obs.X)/Temp;
Qp[i][]=(SV[i].Y-Obs.Y)/Temp;
Qp[i][]=(SV[i].Z-Obs.Z)/Temp;
Qp[i][]=1.0; }
for(i=;i<Row;i++)
for(j=;j<Col;j++)
Qpt[i][j]=Qpt[j][i];
for(i=;i<Row;i++)
{
for(j=;j<Col;j++)
{
Temp=0.0;
for(k=;k<;k++)Temp=Qpt[i][k]*Qp[k][j];
QptXQp[i][j]=Temp; } }
z=(int*)malloc(sizeof(int)**n);
for(i=;i<Row;i++)
{
for(j=;j<Col;j++)
A[i][j]=QptXQp[j][i]; }
for(k=;k<n;k++)
{
max=;
for(i=k;i<n;i++)
for(j=k;j<n;j++)
{
b=fabs(A[i][j]);
if(max<b)
{
ii=i;jj=j;max=b; } }
if(max<MATHRES)
{
free(z);
prinf(The matrix isn't rank enough..."); }
max=1.0/((A[ii][jj]));
A[ii][jj]=;
z[*k]=ii;
A[*k+]=jj
if(ii!=k)
{
for(j=;j<n;j++)
{
b=A[ii][j];A[ii][j]=A[k][j];A[k][j]=b; } }
if(jj!=k)
{
for(j=;j<n;j++)
{
b=A[j][jj];A[jj][j]=A[j][k];A[j][k]=b; } }
for(j=;j<n;j++)
A[k][j]*=max;
for(i=;i<n;i++)
{
if(i!=k)
{
max=A[i][k]; A[i][k]=0.0;
for(j=;j<n;j++) A[i][j]=A[i][j]-max*A[k][j]; } }
for(k=n-;k>=;k--)
{
ii=z[*k+];jj=[*k];
if(ii!=k)
{
for(j=;j<n;j++)
{
b=A[ii][j];A[ii][j]=A[k][j];A[k][j]=b; } }
if(jj!=k)
{
for(j=;j<n;j++)
{
b=A[j][ii];A[j][ii]=A[j][k];A[j][k]=b; } } }
for(i=;i<Row;i++)
{
for(j=;j<Col;j++)
Q[i][j]=A[i][j]; }
free(z);
Temp=0.0;for(i=;i<n;i++)Temp+=Q[i][i];DOP->GDOP=sqrt(Temp); }
计算GDOP的更多相关文章
- GPS精度因子(GDOP,PDOP,HDOP,VDOP,TDOP)
PDOP:位置精度因子(Position Dilution of Precision),直译为“精度强弱度”,通常翻译为“相对误差”.具体含义是:由于观测成果的好坏与被测量的人造卫星和接收仪间的几何形 ...
- 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧
记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- C语言 · 薪水计算
问题描述 编写一个程序,计算员工的周薪.薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么他/她的总收入等于工作时间乘以每小时的薪水.如果员工工作的时间在40 到50 ...
- C语言 · 阶乘计算 · 基础练习
问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表 ...
- C语言 · 最大值与最小值计算
输入11个整数,计算它们的最大值和最小值. 样例输入 0 1 2 3 4 5 6 7 8 9 10 样例输出 10 0 #include<stdio.h> int main(){ ]; ...
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查。。。
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Ser ...
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- SQL Server-聚焦计算列持久化(二十一)
前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...
随机推荐
- Bzoj5251 线段树+贪心
Bzoj5251 线段树+贪心 记录本蒟蒻省选后的第一篇题解!国际惯例的题面:首先这个东西显然是一棵树.如果我们把数值排序,并建立这棵树的dfs序,显然dfs序上的一个区间对应数值的一个区间,且根为数 ...
- Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...
- BZOJ2915 : [Poi1997] gen
设f[i][j]表示串ij可以由哪些字母成长过来,用二进制压位表示. 设g[i][j]表示给定串中[i,j]这个区间一开始可以由哪些字母成长多来,用二进制压位表示. 设h[i]表示给定串前i位最少需要 ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A. Broken Clock 水题
A. Broken Clock 题目连接: http://codeforces.com/contest/722/problem/A Description You are given a broken ...
- javascript 正则限制文本输入框只允许输入数字,简单实现。
<input type="text" id="memberId" lay-verify="title" autocomplete=&q ...
- MikroTik RouterOS使用VirtualBox挂载物理硬盘作为虚拟机硬盘进行安装
说明:这一切似乎在Windows下更好操作.虚拟机操作不是难点,难点在于虚拟磁盘的转换挂载 一.先挂载硬盘 # 创建虚拟镜像并映射到物理硬盘 cd "c:\Program Files\Ora ...
- 【转载】Android dip,px,pt,sp 的区别
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. ...
- hdu4467 Graph
Graph Problem Description P. T. Tigris is a student currently studying graph theory. One day, when h ...
- 百度地图api---实现新建地图
调用这个函数 function refresh() { history.go(0); } 实现了地图新建
- 在ASP.NET MVC中使用Knockout实践04,控制View Model的json格式内容
通常,需要把View Model转换成json格式传给服务端.但在很多情况下,View Model既会包含字段,还会包含方法,我们只希望把字段相关的键值对传给服务端. 先把上一篇的Product转换成 ...