1   /* Copyright 2022-2026 Romain Serra
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.utils;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.hipparchus.Field;
21  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22  import org.hipparchus.geometry.euclidean.threed.Vector3D;
23  import org.orekit.frames.Frame;
24  import org.orekit.time.AbsoluteDate;
25  import org.orekit.time.FieldAbsoluteDate;
26  
27  
28  /** Fixed-position (in a given frame) provider. The point might be fictitious.
29   * @author Romain Serra
30   * @since 14.0
31   * @see PVCoordinatesProvider
32   */
33  public class ConstantPositionProvider implements ExtendedPositionProvider {
34  
35      /** Constant Cartesian position vector. */
36      private final Vector3D constantPosition;
37  
38      /** Reference frame. */
39      private final Frame referenceFrame;
40  
41      /** Simple constructor.
42       * @param constantPosition constant position vector in input frame
43       * @param referenceFrame frame where constant position is given
44       */
45      public ConstantPositionProvider(final Vector3D constantPosition, final Frame referenceFrame) {
46          this.constantPosition = constantPosition;
47          this.referenceFrame = referenceFrame;
48      }
49  
50      /**
51       * Getter for constant position in reference frame.
52       * @return position in reference frame
53       */
54      public Vector3D getConstantPosition() {
55          return constantPosition;
56      }
57  
58      /** {@inheritDoc} */
59      @Override
60      public Vector3D getPosition(final AbsoluteDate date, final Frame frame) {
61          if (referenceFrame == frame) {
62              return constantPosition;
63          }
64          return referenceFrame.getStaticTransformTo(frame, date).transformPosition(constantPosition);
65      }
66  
67      /** {@inheritDoc} */
68      @Override
69      public <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(final FieldAbsoluteDate<T> date,
70                                                                              final Frame frame) {
71          if (referenceFrame == frame) {
72              return new FieldVector3D<>(date.getField(), constantPosition);
73          }
74          return referenceFrame.getStaticTransformTo(frame, date).transformPosition(constantPosition);
75      }
76  
77      /** {@inheritDoc} */
78      @Override
79      public Vector3D getVelocity(final AbsoluteDate date, final Frame frame) {
80          if (referenceFrame == frame) {
81              return Vector3D.ZERO;
82          }
83          final PVCoordinates pvCoordinates = new PVCoordinates(constantPosition);
84          return referenceFrame.getKinematicTransformTo(frame, date).transformOnlyPV(pvCoordinates).getVelocity();
85      }
86  
87      /** {@inheritDoc} */
88      @Override
89      public <T extends CalculusFieldElement<T>> FieldVector3D<T> getVelocity(final FieldAbsoluteDate<T> date,
90                                                                              final Frame frame) {
91          if (referenceFrame == frame) {
92              return FieldVector3D.getZero(date.getField());
93          }
94          final Field<T> field = date.getField();
95          final FieldVector3D<T> fieldconstantPosition = new FieldVector3D<>(field, constantPosition);
96          final FieldPVCoordinates<T> fieldPVCoordinates = new FieldPVCoordinates<>(fieldconstantPosition, FieldVector3D.getZero(field));
97          return referenceFrame.getKinematicTransformTo(frame, date).transformOnlyPV(fieldPVCoordinates).getVelocity();
98      }
99  
100     /** {@inheritDoc} */
101     @Override
102     public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date, final Frame frame) {
103         final TimeStampedPVCoordinates pvCoordinates = new TimeStampedPVCoordinates(date, constantPosition, Vector3D.ZERO);
104         if (referenceFrame == frame) {
105             return pvCoordinates;
106         }
107         return referenceFrame.getTransformTo(frame, date).transformPVCoordinates(pvCoordinates);
108     }
109 
110     /** {@inheritDoc} */
111     @Override
112     public <T extends CalculusFieldElement<T>> TimeStampedFieldPVCoordinates<T> getPVCoordinates(final FieldAbsoluteDate<T> date,
113                                                                                                  final Frame frame) {
114         final Field<T> field = date.getField();
115         final FieldVector3D<T> fieldconstantPosition = new FieldVector3D<>(field, constantPosition);
116         final TimeStampedFieldPVCoordinates<T> fieldPVCoordinates = new TimeStampedFieldPVCoordinates<>(date,
117                 new FieldPVCoordinates<>(fieldconstantPosition, FieldVector3D.getZero(field)));
118         if (referenceFrame == frame) {
119             return fieldPVCoordinates;
120         }
121         return referenceFrame.getTransformTo(frame, date).transformPVCoordinates(fieldPVCoordinates);
122     }
123 
124 }