123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- namespace Leo2SatTaskServer54
- {
- public static class ErrEllipseHepler
- {
- private const string ErrellipDll = @"AddIns\误差椭圆\DLL_GDOP_Analysis0415";
- /// <summary>
- /// 两星一地误差椭圆
- /// </summary>
- /// <param name="main_eph">主星位置 长度6</param>
- /// <param name="neigh_eph">邻星位置 长度6</param>
- /// <param name="cdbAnt">超短波 长度3</param>
- /// <param name="refStation">参考站 长度3</param>
- /// <param name="Select_Point">定位点 长度3</param>
- /// <param name="dto_err">时差误差(s)</param>
- /// <param name="eph_err"></param>
- /// <param name="Pe">0.5</param>
- /// <param name="LOP_Len"></param>
- /// <returns></returns>
- [DllImport(ErrellipDll, EntryPoint = "Error_Ellipse_2X1D", CallingConvention = CallingConvention.Cdecl)]
- public extern static IntPtr Error_Ellipse_2X1D(double[] main_eph, double[] neigh_eph, double[] cdbAnt, double[] refStation, double[] Select_Point, double dto_err,
- double eph_err, double Pe, ref int LOP_Len);
- /// <summary>
- /// 获取误差椭圆的长轴(m)、短轴(m)、倾角(°)
- /// </summary>
- /// <param name="posLon"></param>
- /// <param name="posLat"></param>
- /// <param name="mainEph"></param>
- /// <param name="adajEph"></param>
- /// <param name="cdbPos"></param>
- /// <param name="RefGeod"></param>
- /// <param name="DtoErrus"></param>
- /// <param name="EphErrm"></param>
- /// <returns></returns>
- public static double[] ErrorEllipse2X1D(double posLon, double posLat, double[] mainEph, double[] adajEph, double[] cdbPos, double[] RefGeod, double DtoErrus, double EphErrm)
- {
- IEnumerable<double> res = new List<double>();
- int LOP_Len = 0;
- /// <summary>
- /// 概率 默认0.5
- /// </summary>
- double Pe = 0.5;
- IntPtr LOP_ValuePtr =Error_Ellipse_2X1D(
- mainEph,
- adajEph,
- cdbPos,
- RefGeod,
- new double[3] { posLon, posLat, 0 },
- DtoErrus * 1e-6,
- EphErrm,//单位m
- Pe, ref LOP_Len);
- double[] LOP_Value = new double[LOP_Len];
- if (LOP_Len > 0)
- {
- Marshal.Copy(LOP_ValuePtr, LOP_Value, 0, LOP_Value.Length);
- int lastcount = LOP_Len - 3;
- res = LOP_Value.Skip(lastcount).Take(3);
- }
- return res.ToArray();
- }
- }
- }
|