卫星位置计算小程序(C#版)

一、最终画面
在这里插入图片描述
二、程序代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace wx
{ public partial class Form1 : Form
    {  public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        { //计算半长轴a:
            double a_sqrt;
            a_sqrt = double.Parse(textBoxa.Text);//输入半长轴的平方根
            double a = a_sqrt * a_sqrt;
            String Sa = "" + a;
            textBoxa_1.Text = Sa.ToString();
            //计算运动的平均角速度n:
            double ln;
            ln = double.Parse(textBoxln.Text);//输入摄动改正数
            double u = double.Parse(textBoxu.Text);//输入椭球引力常数
            double n0 = Math.Pow(u / Math.Pow(a, 3), 0.5);//二次根号下u比三次根号下a
            double n = n0 + ln;//n=n0+ln
            String Sn = "" + n;
            textBoxn.Text = Sn.ToString();  
            //计算归划时间
            double toe = double.Parse(textBoxtoe.Text);//星历基准时间
            double toc = double.Parse(textBoxtoc.Text);//秒数据
            double t1 = double.Parse(textBoxt1.Text);//观测时间t1
            double a0 = double.Parse(textBoxa0.Text);//卫星中飘参数
            double a1 = double.Parse(textBoxa1.Text);
            double a2 = double.Parse(textBoxa2.Text);
            // 计算卫星钟差,a0+a1*(t1-toc)+a2*((t1-toc)*(t1-toc))
            double lt = a0 + a1 * (t1 - toc) + a2 * ((t1 - toc) * (t1 - toc));
            double t = t1 - lt;
            double tk = t - toe;
            String Stk = "" + tk;
            textBoxtk.Text = Stk.ToString();
            //计算真近点角Vk
            double M0 = double.Parse(textBoxM0.Text);//平近点角M0
            double e1 =double.Parse(textBoxe1.Text);//轨道离心率e1
            double Mk = M0 + n * tk;//观测时刻平近点角Mk
            String SMk = "" + Mk;
            textBoxMk.Text = SMk.ToString();
            double Ek_old = Mk;
            double Ek_new = Mk + e1 * Math.Sin(Ek_old);//Ek=Mk+e1*SinEk
            int i = 1;
            //迭代求解E
            while (Math.Abs(Ek_new - Ek_old) > 10e-8)
            {
                Ek_old = Ek_new;
                Ek_new = Mk + e1 * Math.Sin(Ek_old);
                i += 1;
                if (i > 10)
                    break;
            }
            double Ek = Ek_new;//Ek_new为最终解,即偏近点角
            String SEk = "" + Ek;
            textBoxEk.Text = SEk.ToString();
            //计算真近点角Vk
            double Vk1 = (Math.Pow(1 - e1 * e1, 0.5) * Math.Sin(Ek)) / (1 - e1 * Math.Cos(Ek));
            double Vk2 = (Math.Cos(Ek) - e1) / (1 - e1 * Math.Cos(Ek)); 
            double Vk;
            if (Vk2 == 0)
            {
                if (Vk1 > e1)
                    Vk = Math.PI / 2;
                else
                    Vk = -Math.PI / 2;
            } else 
            {
                Vk = Math.Atan(Vk1/Vk2);
                if (Vk2<0) 
                { if (Vk1 >= 0)
                    { Vk += Math.PI; }
                    else 
                    { Vk -= Math.PI; } 
                }
            }
            String SVk = "" + Vk;
            textBoxVk.Text = SVk.ToString();
            //计算升交距角u0
            double w = double.Parse(textBoxw.Text);//近地点角距w
            double u0 = Vk + w;
            String Su0 = "" + u0;
            textBoxu0.Text = Su0.ToString();
            //计算经过摄动改正的升交距角uk,卫星的地心距离rk,轨道倾角ik
            double Crs = double.Parse(textBoxCrs.Text);//六个摄动改正参数
            double Crc = double.Parse(textBoxCrc.Text);
            double Cuc = double.Parse(textBoxCuc.Text);
            double Cus = double.Parse(textBoxCus.Text);
            double Cic = double.Parse(textBoxCic.Text);
            double Cis = double.Parse(textBoxCis.Text);
            double i0 = double.Parse(textBoxi0.Text);//参考时刻toe的轨道倾角
            double I = double.Parse(textBoxI.Text);//I为轨道倾角i的变化率
            //计算摄动改正项
            double u_k = Cus * Math.Sin(2 * u0) + Cuc * Math.Cos(2 * u0);
            double r_k = Crs * Math.Sin(2 * u0) + Crc * Math.Cos(2 * u0);
            double i_k = Cis * Math.Sin(2 * u0) + Cic * Math.Cos(2 * u0);
            String Su_k = "" + u_k;
            textBoxu_k.Text = Su_k.ToString();
            String Sr_k = "" + r_k;
            textBoxr_k.Text = Sr_k.ToString();
            String Si_k = "" + i_k;
            textBoxi_k.Text = Si_k.ToString();
            double uk = u0 + u_k;//摄动改正后的升交距角
            double rk = a * (1 - e1 * Math.Cos(Ek)) + r_k;//摄动改正后的卫星矢径
            double ik = i0 + i_k + I * tk;//摄动改正后的轨道倾角
            String Suk = "" + uk;
            textBoxuk.Text = Suk.ToString();
            String Srk = "" + rk;
            textBoxrk.Text = Srk.ToString();
            String Sik = "" + ik;
            textBoxik.Text = Sik.ToString();
            //卫星的轨道平面直角坐标
            double xk = rk * Math.Cos(uk);
            double yk = rk * Math.Sin(uk);
            String Sxk = "" + xk;
            textBoxxk.Text = Sxk.ToString();
            String Syk = "" + yk;
            textBoxyk.Text = Syk.ToString();
            //坐标转换
            double omega = double.Parse(textBoxomega.Text);//参考时刻toe时的升交点赤经
            double omega0 = double.Parse(textBoxomega0.Text);//升交点经度的变化率
            double we = double.Parse(textBoxwe.Text);//we地球自转角速度
            double L = omega0 + omega * (t - toe) - we * t;
            String SL = "" + L;
            textBoxL.Text = SL.ToString();
            //计算卫星在地固系下坐标
            double xk1 = xk * Math.Cos(omegak) - yk * Math.Cos(ik) * Math.Sin(omegak);
            double yk1 = xk * Math.Sin(omegak) + yk * Math.Cos(ik) * Math.Cos(omegak);
            double zk1 = yk * Math.Sin(ik);
            String Sxk1 = "" + xk1;
            textBoxxk1.Text = Sxk1.ToString();
            String Syk1 = "" + yk1;
            textBoxyk1.Text = Syk1.ToString();
            String Szk1 = "" + zk1;
            textBoxzk1.Text=Szk1.ToString();
        }
      private void Form1_Load(object sender, EventArgs e) {}
     private void button2_Click(object sender, EventArgs e)
        {
            double a_sqrt;
            a_sqrt= 5153.7127704599998;
            String Sa_sqrt = "" + a_sqrt;
            textBoxa.Text = Sa_sqrt.ToString();
            double ln;
            ln = 4.1115998360700002e-009;
            String Sln = "" + ln;
            textBoxln.Text = Sln.ToString();
            double u;
            u = 3.986005e14;
            String Su = "" + u;
            textBoxu.Text = Su.ToString();
            double a0, a1, a2;
            a0 = 0.00028600683435800001;
            a1 = 1.7053025658199999e-012;
            a2 = 0;
            String Sa0 = "" + a0;
            String Sa1 = "" + a1;
            String Sa2 = "" + a2;
            textBoxa0.Text = Sa0.ToString();
            textBoxa1.Text = Sa1.ToString();
            textBoxa2.Text = Sa2.ToString();
            double toc;
            double toe;
            toc = 0.00000000000000000;
            toe = 0.00000000000000000;
            String Stoc = "" + toc;
            String Stoe = "" + toe;
            textBoxtoc.Text = Stoc.ToString();
            textBoxtoe.Text = Stoe.ToString();
            double t1;
            t1 = 4800.0;
            String St1 = "" + t1;
            textBoxt1.Text = St1.ToString();
            double M0;
            M0 = 1.2263973009600000;
            String SM0 = "" + M0;
            textBoxM0.Text = SM0.ToString();
            double e1;
            e1 = 0.0053100715158500003;
            String Se1 = "" + e1;
            textBoxe1.Text = Se1.ToString();
            double w;
            w = -1.6819446292500000;
            String Sw = "" + w;
            textBoxw.Text = Sw.ToString();
            double Crs, Crc, Cuc, Cus, Cic, Cis;
            Crs = -105.43750000000000;
            Crc = 175.34375000000000;
            Cuc = -5.5264681577700003e-006;
            Cus = 1.1192634701700000e-005;
            Cic = -9.6857547759999998e-008;
            Cis = -7.8231096267699997e-008;
            String SCrs = "" + Crs;
            String SCrc = "" + Crc;
            String SCuc = "" + Cuc;
            String SCus = "" + Cus;
            String SCic = "" + Cic;
            String SCis = "" + Cis;
            textBoxCrs.Text = SCrs.ToString();
            textBoxCrc.Text = SCrc.ToString();
            textBoxCuc.Text = SCuc.ToString();
            textBoxCus.Text = SCus.ToString();
            textBoxCic.Text = SCic.ToString();
            textBoxCis.Text = SCis.ToString();
            double i0, I;
            i0 = 0.97432927738800001;
            I = 1.8643633724999999e-010;
            String Si0 = "" + i0;
            String SI = "" + I;
            textBoxi0.Text = Si0.ToString();
            textBoxI.Text = SI.ToString();
            double omega, omega0,we;
            omega = -7.7124641122299999e-009;
            omega0 = -2.9080127721900002;
            we = 7.2921151467e-5;
            String Swe = "" + we;
            String Somega = "" + omega;
            String Somega0= "" + omega0;
            textBoxomega.Text = Somega.ToString();
            textBoxomega0.Text = Somega0.ToString();
            textBoxwe.Text = Swe.ToString();
        }
    }
}

卫星位置计算(C#版1.0).exe文件及源码下载连接:https://download.youkuaiyun.com/download/weixin_47062907/19390603

卫星位置计算(C#版2.0).exe文件及源码下载连接:https://download.youkuaiyun.com/download/weixin_47062907/19390650

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值