Как нарисовать орбиту из орбитальных элементов с помощью Transform3DGroup - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь нарисовать орбиту, используя класс Transform3DGroup в C # .NET Framework. У меня есть орбитальные элементы a, e, i, RAAN, ArgPer, trueAnom. Алгоритм, который их выдает, также дает мне координаты x y z в ECI. По какой-то причине, когда я пытаюсь использовать Transform3DGroup, чтобы сделать мои вращения, чтобы в основном вытянуть, куда спутник должен идти в ECI (используя элементы орбиты, которые я дал выше), мой результат не совпадает с координатами ECI, что Оригинальный алгоритм выплевывает.

Этот оригинальный алгоритм - мои данные правды. Но я не хочу использовать эти координаты, я хочу нарисовать орбиту с помощью элементов Keplarian, используя Transform3DGroup.

Вот мой код:

public Point3D calculatePosition(double trueAnomaly)
{
    double angle = trueAnomaly;
    double a = semiMajorAxis;
    double e = eccentricity;
    double b = (a * (1 - e * e)) / (1 + e * Math.Cos(angle));
    double SA = Math.Sin(angle);
    double X = b * CA;//(CA * CR + SA * CI * SR); 
    double Y = b * SA; //(CA * SR + SA * CI);
    double Z = 0; //b * SA * SI;
    Point3D p = new Point3D(X, Y, Z);//new Point3D(Math.Cos(angle) * b, 
    Math.Sin(angle) * b, 0);
    return p;
}
public void orient2OrbitalElements(double _time)
{

    orbitNorm = new Vector3D(0, 0, 1);
    positionPoint = calculatePosition(trueAnomaly);//Position of Orbiter
    Transform3DGroup tg = new Transform3DGroup();
    tg.Children.Add(new TranslateTransform3D(positionVec));//Translates to Orbit Position (relative to Parent)
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), inclinationDeg)));//Rotates Orbit to the set Inclination
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), RAAN)));//Rotates Orbiter's model RAAN
    orbitNorm = tgNoTranslation(tg).Transform(orbitNorm);
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(orbitNorm, argOfPerigee)));//Rotates Orbiter's model to the Arg of Perigee
    Transform = tg;
    if (HasEphem)
    {
        Console.WriteLine(ObjectName + ": " + Transform.Value.OffsetX + ", " + Transform.Value.OffsetY + ", " + Transform.Value.OffsetZ);
        Console.WriteLine(ObjectName + ": " + cartesElems.xPos[ephemIndex] + ", " + cartesElems.yPos[ephemIndex] + ", " + cartesElems.zPos[ephemIndex]);
    }
}
public Transform3DGroup tgNoTranslation(Transform3DGroup tgWithTranslations)
{
    Transform3DGroup tempTg = tgWithTranslations.Clone();
    tempTg.Children.RemoveAt(0);
    return tempTg;
}

По сути, я вычисляю положение x, y на плоскости орбиты относительно положения Земли, используя формулу эксцентриситета, большой полуоси и формулы истинной аномалии, как вы увидите. Затем я помещаю полученные координаты в мою Transform3DGroup как TranslateTransform3D. Это первый объект, который я вставил.

Затем я выполняю повороты: --- добавляется вращение для наклона, вращая положение Vec около единица оси X (1,0,0) --- вращение по RAAN, около единицы по оси z (0,0,1) --- затем я создаю нормальную орбиту из этого и выполняю вращение argPer об этой новой оси

Мое понимание того, как работает Transform3DGroup, заключается в том, что он будет применять первый, затем второй и так далее. Это означает, что выполняется positionVec (который является просто координатами x, y в системе отсчета 2-й орбитальной плоскости), тогда все вращения будут выполняться, поскольку матрица вращения была оставлена ​​после того, что было сделано до нее.

Я неправильно выполняю вращение argPer? RAAN или inc? Возможно, есть более точный способ рассчитать мою позицию на орбитальной плоскости или определенный порядок операций, которых я должен придерживаться?

Чем больше я об этом думаю, тем больше я продолжаю приходить к мысли, что все кажется очень простым, если я использую Transform3DGroup и что я должен делать это правильно, но результаты ECI не совпадают до.

Но, о чудо, Transform.Value.OffsetX / Y / Z действительно хочет приблизиться к согласию с данными истинности. Возможно Transform.Value.Offset не X, Y, Z, как я думаю об этом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...