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.bodies; 18 19 import org.hipparchus.CalculusFieldElement; 20 import org.hipparchus.geometry.euclidean.threed.FieldLine; 21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D; 22 import org.hipparchus.geometry.euclidean.threed.Line; 23 import org.hipparchus.geometry.euclidean.threed.Vector3D; 24 import org.orekit.frames.Frame; 25 import org.orekit.time.AbsoluteDate; 26 import org.orekit.time.FieldAbsoluteDate; 27 import org.orekit.utils.TimeStampedPVCoordinates; 28 29 30 /** Interface representing the rigid surface shape of a natural body. 31 * <p>The shape is not provided as a single complete geometric 32 * model, but single points can be queried ({@link #getIntersectionPoint}).</p> 33 * @author Luc Maisonobe 34 */ 35 public interface BodyShape { 36 37 /** Get body frame related to body shape. 38 * @return body frame related to body shape 39 */ 40 Frame getBodyFrame(); 41 42 /** Get the intersection point of a line with the surface of the body. 43 * <p>A line may have several intersection points with a closed 44 * surface (we consider the one point case as a degenerated two 45 * points case). The close parameter is used to select which of 46 * these points should be returned. The selected point is the one 47 * that is closest to the close point.</p> 48 * @param line test line (may intersect the body or not) 49 * @param close point used for intersections selection 50 * @param frame frame in which line is expressed 51 * @param date date of the line in given frame 52 * @return intersection point at altitude zero or null if the line does 53 * not intersect the surface 54 */ 55 GeodeticPoint getIntersectionPoint(Line line, Vector3D close, 56 Frame frame, AbsoluteDate date); 57 58 /** Get the intersection point of a line with the surface of the body. 59 * <p>A line may have several intersection points with a closed 60 * surface (we consider the one point case as a degenerated two 61 * points case). The close parameter is used to select which of 62 * these points should be returned. The selected point is the one 63 * that is closest to the close point.</p> 64 * @param line test line (may intersect the body or not) 65 * @param close point used for intersections selection 66 * @param frame frame in which line is expressed 67 * @param date date of the line in given frame 68 * @param <T> type of the field elements 69 * @return intersection point at altitude zero or null if the line does 70 * not intersect the surface 71 * @since 9.0 72 */ 73 <T extends CalculusFieldElement<T>> FieldGeodeticPoint<T> getIntersectionPoint(FieldLine<T> line, FieldVector3D<T> close, 74 Frame frame, FieldAbsoluteDate<T> date); 75 76 /** Project a point to the ground. 77 * @param point point to project 78 * @param date current date 79 * @param frame frame in which moving point is expressed 80 * @return ground point exactly at the local vertical of specified point, 81 * in the same frame as specified point 82 * @see #projectToGround(TimeStampedPVCoordinates, Frame) 83 * @since 7.0 84 */ 85 Vector3D projectToGround(Vector3D point, AbsoluteDate date, Frame frame); 86 87 /** Project a moving point to the ground. 88 * @param pv moving point 89 * @param frame frame in which moving point is expressed 90 * @return ground point exactly at the local vertical of specified point, 91 * in the same frame as specified point 92 * @see #projectToGround(Vector3D, AbsoluteDate, Frame) 93 * @since 7.0 94 */ 95 TimeStampedPVCoordinates projectToGround(TimeStampedPVCoordinates pv, Frame frame); 96 97 /** Transform a Cartesian point to a surface-relative point. 98 * @param point Cartesian point 99 * @param frame frame in which Cartesian point is expressed 100 * @param date date of the computation (used for frames conversions) 101 * @return point at the same location but as a surface-relative point 102 */ 103 GeodeticPoint transform(Vector3D point, Frame frame, AbsoluteDate date); 104 105 /** Transform a Cartesian point to a surface-relative point. 106 * @param point Cartesian point 107 * @param <T> type of the filed elements 108 * @param frame frame in which Cartesian point is expressed 109 * @param date date of the computation (used for frames conversions) 110 * @return point at the same location but as a surface-relative point 111 * @since 9.0 112 */ 113 <T extends CalculusFieldElement<T>> FieldGeodeticPoint<T> transform(FieldVector3D<T> point, Frame frame, 114 FieldAbsoluteDate<T> date); 115 116 /** Transform a surface-relative point to a Cartesian point. 117 * @param point surface-relative point 118 * @return point at the same location but as a Cartesian point 119 */ 120 Vector3D transform(GeodeticPoint point); 121 122 /** Transform a surface-relative point to a Cartesian point. 123 * @param point surface-relative point 124 * @param <T> type of the filed elements 125 * @return point at the same location but as a Cartesian point 126 * @since 9.0 127 */ 128 <T extends CalculusFieldElement<T>> FieldVector3D<T> transform(FieldGeodeticPoint<T> point); 129 130 }