TransformProviderUtils.java

  1. /* Copyright 2002-2025 CS GROUP
  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.frames;

  18. import org.hipparchus.CalculusFieldElement;
  19. import org.orekit.time.AbsoluteDate;
  20. import org.orekit.time.FieldAbsoluteDate;

  21. /** Utility for Transform providers.
  22.  * @author Luc Maisonobe
  23.  * @since 9.2
  24.  */
  25. public class TransformProviderUtils {

  26.     /** Identity provider.
  27.      * <p>
  28.      * The transforms generated by this providers are always {@link Transform#IDENTITY}.
  29.      * </p>
  30.      */
  31.     public static final TransformProvider IDENTITY_PROVIDER = new TransformProvider() {

  32.         /** {@inheritDoc}
  33.          * <p>
  34.          * Always returns {@link Transform#IDENTITY}
  35.          * </p>
  36.          */
  37.         @Override
  38.         public Transform getTransform(final AbsoluteDate date) {
  39.             return Transform.IDENTITY;
  40.         }

  41.         /** {@inheritDoc} */
  42.         @Override
  43.         public StaticTransform getStaticTransform(final AbsoluteDate date) {
  44.             return StaticTransform.getIdentity();
  45.         }

  46.         /** {@inheritDoc}
  47.          * <p>
  48.          * Always returns {@link FieldTransform#getIdentity(org.hipparchus.Field)}
  49.          * </p>
  50.          */
  51.         @Override
  52.         public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
  53.             return FieldTransform.getIdentity(date.getField());
  54.         }

  55.         /** {@inheritDoc} */
  56.         @Override
  57.         public <T extends CalculusFieldElement<T>> FieldStaticTransform<T> getStaticTransform(final FieldAbsoluteDate<T> date) {
  58.             return FieldStaticTransform.getIdentity(date.getField());
  59.         }
  60.     };

  61.     /** Private constructor.
  62.      * <p>This class is a utility class, it should neither have a public
  63.      * nor a default constructor. This private constructor prevents
  64.      * the compiler from generating one automatically.</p>
  65.      */
  66.     private TransformProviderUtils() {
  67.     }

  68.     /** Reverse a transform provider.
  69.      * @param provider provider to reverse
  70.      * @return a new provider which provide a transform similar to
  71.      * {@code provider.getTransform(date).getInverse()}
  72.      */
  73.     public static TransformProvider getReversedProvider(final TransformProvider provider) {
  74.         return new TransformProvider() {

  75.             /** {@inheritDoc} */
  76.             @Override
  77.             public Transform getTransform(final AbsoluteDate date) {
  78.                 return provider.getTransform(date).getInverse();
  79.             }

  80.             @Override
  81.             public KinematicTransform getKinematicTransform(final AbsoluteDate date) {
  82.                 return provider.getKinematicTransform(date).getInverse();
  83.             }

  84.             @Override
  85.             public StaticTransform getStaticTransform(final AbsoluteDate date) {
  86.                 return provider.getStaticTransform(date).getInverse();
  87.             }

  88.             /** {@inheritDoc} */
  89.             @Override
  90.             public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
  91.                 return provider.getTransform(date).getInverse();
  92.             }

  93.             /** {@inheritDoc} */
  94.             @Override
  95.             public <T extends CalculusFieldElement<T>> FieldKinematicTransform<T> getKinematicTransform(final FieldAbsoluteDate<T> date) {
  96.                 return provider.getKinematicTransform(date).getInverse();
  97.             }

  98.             /** {@inheritDoc} */
  99.             @Override
  100.             public <T extends CalculusFieldElement<T>> FieldStaticTransform<T> getStaticTransform(final FieldAbsoluteDate<T> date) {
  101.                 return provider.getStaticTransform(date).getInverse();
  102.             }

  103.         };
  104.     }

  105.     /** Combine two transform providers.
  106.      * @param first first provider to apply
  107.      * @param second second provider to apply
  108.      * @return a new provider which provide a transform similar to
  109.      * {@code new Transform(date, first.getTransform(date), second.getTransform(date))}
  110.      */
  111.     public static TransformProvider getCombinedProvider(final TransformProvider first,
  112.                                                         final TransformProvider second) {
  113.         return new TransformProvider() {
  114.             /** {@inheritDoc} */
  115.             @Override
  116.             public Transform getTransform(final AbsoluteDate date) {
  117.                 return new Transform(date, first.getTransform(date), second.getTransform(date));
  118.             }

  119.             /** {@inheritDoc} */
  120.             @Override
  121.             public StaticTransform getStaticTransform(final AbsoluteDate date) {
  122.                 return StaticTransform.compose(
  123.                         date,
  124.                         first.getStaticTransform(date),
  125.                         second.getStaticTransform(date)
  126.                 );
  127.             }

  128.             /** {@inheritDoc} */
  129.             @Override
  130.             public KinematicTransform getKinematicTransform(final AbsoluteDate date) {
  131.                 return KinematicTransform.compose(
  132.                         date,
  133.                         first.getKinematicTransform(date),
  134.                         second.getKinematicTransform(date)
  135.                 );
  136.             }

  137.             /** {@inheritDoc} */
  138.             @Override
  139.             public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
  140.                 return new FieldTransform<>(date, first.getTransform(date), second.getTransform(date));
  141.             }

  142.             /** {@inheritDoc} */
  143.             @Override
  144.             public <T extends CalculusFieldElement<T>> FieldKinematicTransform<T> getKinematicTransform(final FieldAbsoluteDate<T> date) {
  145.                 return FieldKinematicTransform.compose(
  146.                         date,
  147.                         first.getKinematicTransform(date),
  148.                         second.getKinematicTransform(date)
  149.                 );
  150.             }

  151.             /** {@inheritDoc} */
  152.             @Override
  153.             public <T extends CalculusFieldElement<T>> FieldStaticTransform<T> getStaticTransform(final FieldAbsoluteDate<T> date) {
  154.                 return FieldStaticTransform.compose(
  155.                         date,
  156.                         first.getStaticTransform(date),
  157.                         second.getStaticTransform(date)
  158.                 );
  159.             }

  160.         };
  161.     }

  162. }