GPS课第一次作业,懒得编2个EXE,全弄一起了,分享下。。。
界面如下:
依照惯例分享下代码。。。BS下无穷无尽的伸手党。。。
/// <summary>
/// 计算大地经度L
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public double cal_l(double x, double y)
{
return Math.Atan(y / x);
}
/// <summary>
/// 计算原始的B
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public double cal_orginb(double b)
{
return a / Math.Sqrt(1 - e * square(Math.Sin(b)));
}
/// <summary>
/// 计算新的B
/// </summary>
/// <param name="n"></param>
/// <param name="h"></param>
/// <returns></returns>
public double cal_nb(double n, double h)
{
double a = z * (n + h);
double ba = Math.Sqrt(square(x) + square(y)) * (n * (1 - e) + h);
return Math.Atan(a/ba);
}
//计算高程
public double cal_h(double n, double b)
{
//double tmp = Math.Sin(b);
return (z / Math.Sin(b)) - n * (1 - e);
}
/// <summary>
/// 运算过程
/// </summary>
/// <param name="err"></param>
/// <returns></returns>
public double[] ConvertProcess(double err)
{
try
{
double[] tmp = new double[3];
double n = 0;
double b = originb;
double h = 0;
double rb = b;
tmp[0] = ConvertToDegree(cal_l(x, y));
if (tmp[0]<0)
{
tmp[0] += 180;
}
do
{
b = rb;
n = cal_orginb(b);
h = cal_h(n, b);
rb = cal_nb(n, h);
} while (Math.Abs(rb - b) > err);
tmp[1] = ConvertToDegree(rb);
tmp[2] = h;
return tmp;
}
catch (System.Exception ex)
{
return null;
}
}
算B用迭代法,误差以参数形式给出,可以自定义误差范围。
下面是GPS时间的计算:
/// <summary>
/// 儒略日的计算
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="day"></param>
/// <returns></returns>
public static double jd(double year, double month, double day)
{
int G = 0;
double n = 0;
if(year * 372 + month *31 +Math.Floor(day)>=588829)
G=1; //判断是否为格里高利历日1582*372+10*31+15
if (G==1)
{
n = Math.Floor(year / 100);
n = 2 - n + Math.Floor(n / 4); //加百年闰
}
if (month == 1 || month == 2)
{
month += 12;
year -= 1;
}
return Math.Floor(365.25 * (year + 4716)) + Math.Floor(30.6001 * (month + 1)) + day + n - 1524.5;
//return Convert.ToInt64(day - 32075 + 1461 * (year + 4800 + (month - 14) / 12) / 4 + 367 * (month - 2 - (month - 14) / 12 * 12) / 12 - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4);
}
public static string weekday(double jd)
{
int no = Convert.ToInt32(Math.Floor((jd + 1.5) % 7));
switch(no)
{
case 0:
return "星期日";
case 1:
return "星期一";
case 2:
return "星期二";
case 3:
return "星期三";
case 4:
return "星期四";
case 5:
return "星期五";
case 6:
return "星期六";
default:
return null;
}
}
作业都要编程。。。真费事。。。THU坑爹。。。


