View Javadoc
1   /*
2    * Copyright (C) 2019 Alberto Irurueta Carro (alberto@irurueta.com)
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *         http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package com.irurueta.navigation.frames;
17  
18  import com.irurueta.geometry.Point3D;
19  import com.irurueta.navigation.gnss.ECEFPositionAndVelocity;
20  import com.irurueta.units.Distance;
21  import com.irurueta.units.Speed;
22  
23  /**
24   * Contains position, velocity and coordinates transformation matrix expressed in ECEF frame.
25   * Position and velocity of this frame is expressed along ECEF axes as described here:
26   * {@link FrameType#EARTH_CENTERED_EARTH_FIXED_FRAME}.
27   */
28  public class ECEFFrame extends ECIorECEFFrame<ECEFFrame> implements Cloneable {
29  
30      /**
31       * Constructor.
32       * Initializes position and velocity coordinates to zero and the coordinate transformation matrix to the
33       * identity.
34       */
35      public ECEFFrame() {
36          super(ECEFFrame.class);
37          c = new CoordinateTransformation(FrameType.BODY_FRAME, FrameType.EARTH_CENTERED_EARTH_FIXED_FRAME);
38      }
39  
40      /**
41       * Constructor.
42       *
43       * @param c Body to ECEF coordinate transformation matrix to be set.
44       * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
45       */
46      public ECEFFrame(final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
47          super(c);
48      }
49  
50      /**
51       * Constructor.
52       *
53       * @param x cartesian x coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
54       *          ECEF-frame axes.
55       * @param y cartesian y coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
56       *          ECEF-frame axes.
57       * @param z cartesian z coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
58       *          ECEF-frame axes.
59       */
60      public ECEFFrame(final double x, final double y, final double z) {
61          this();
62          setCoordinates(x, y, z);
63      }
64  
65      /**
66       * Constructor.
67       *
68       * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
69       */
70      public ECEFFrame(final Point3D position) {
71          this();
72          setPosition(position);
73      }
74  
75      /**
76       * Constructor.
77       *
78       * @param positionX cartesian x coordinate of body position to be set resolved along ECEF-frame axes.
79       * @param positionY cartesian y coordinate of body position to be set resolved along ECEF-frame axes.
80       * @param positionZ cartesian z coordinate of body position to be set resolved along ECEF-frame axes.
81       */
82      public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ) {
83          this();
84          setPositionCoordinates(positionX, positionY, positionZ);
85      }
86  
87      /**
88       * Constructor.
89       *
90       * @param position cartesian position.
91       */
92      public ECEFFrame(final ECEFPosition position) {
93          this();
94          setPosition(position);
95      }
96  
97      /**
98       * Constructor.
99       *
100      * @param x  cartesian x coordinate of body position expressed in meters (m) and resolved along ECEF-frame axes.
101      * @param y  cartesian y coordinate of body position expressed in meters (m) and resolved along ECEF-frame axes.
102      * @param z  cartesian z coordinate of body position expressed in meters (m) and resolved along ECEF-frame axes.
103      * @param vx x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
104      *           ECEF-frame axes.
105      * @param vy y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
106      *           ECEF-frame axes.
107      * @param vz z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
108      *           ECEF-frame axes.
109      */
110     public ECEFFrame(final double x, final double y, final double z,
111                      final double vx, final double vy, final double vz) {
112         this(x, y, z);
113         setVelocityCoordinates(vx, vy, vz);
114     }
115 
116     /**
117      * Constructor.
118      *
119      * @param position cartesian position.
120      * @param vx       x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
121      *                 ECEF-frame axes.
122      * @param vy       y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
123      *                 ECEF-frame axes.
124      * @param vz       z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
125      *                 ECEF-frame axes.
126      */
127     public ECEFFrame(final ECEFPosition position, final double vx, final double vy, final double vz) {
128         this(position);
129         setVelocityCoordinates(vx, vy, vz);
130     }
131 
132     /**
133      * Constructor.
134      *
135      * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
136      * @param vx       x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
137      *                 ECEF-frame axes.
138      * @param vy       y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
139      *                 ECEF-frame axes.
140      * @param vz       z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
141      *                 ECEF-frame axes.
142      */
143     public ECEFFrame(final Point3D position, final double vx, final double vy, final double vz) {
144         this(position);
145         setVelocityCoordinates(vx, vy, vz);
146     }
147 
148     /**
149      * Constructor.
150      *
151      * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
152      * @param speedX   x coordinate of velocity to be set resolved along ECEF-frame axes.
153      * @param speedY   y coordinate of velocity to be set resolved along ECEF-frame axes.
154      * @param speedZ   z coordinate of velocity to be set resolved along ECEF-frame axes.
155      */
156     public ECEFFrame(final Point3D position, final Speed speedX, final Speed speedY, final Speed speedZ) {
157         this(position);
158         setSpeedCoordinates(speedX, speedY, speedZ);
159     }
160 
161     /**
162      * Constructor.
163      *
164      * @param position cartesian position.
165      * @param speedX   x coordinate of velocity to be set resolved along ECEF-frame axes.
166      * @param speedY   y coordinate of velocity to be set resolved along ECEF-frame axes.
167      * @param speedZ   z coordinate of velocity to be set resolved along ECEF-frame axes.
168      */
169     public ECEFFrame(final ECEFPosition position, final Speed speedX, final Speed speedY, final Speed speedZ) {
170         this(position);
171         setSpeedCoordinates(speedX, speedY, speedZ);
172     }
173 
174     /**
175      * Constructor.
176      *
177      * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
178      * @param velocity velocity to be set resolved along ECEF-frame axes.
179      */
180     public ECEFFrame(final Point3D position, final ECEFVelocity velocity) {
181         this(position);
182         setVelocity(velocity);
183     }
184 
185     /**
186      * Constructor.
187      *
188      * @param x      cartesian x coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
189      *               along ECEF-frame axes.
190      * @param y      cartesian y coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
191      *               along ECEF-frame axes.
192      * @param z      cartesian z coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
193      *               along ECEF-frame axes.
194      * @param speedX x coordinate of velocity to be set resolved along ECEF-frame axes.
195      * @param speedY y coordinate of velocity to be set resolved along ECEF-frame axes.
196      * @param speedZ z coordinate of velocity to be set resolved along ECEF-frame axes.
197      */
198     public ECEFFrame(final double x, final double y, final double z,
199                      final Speed speedX, final Speed speedY, final Speed speedZ) {
200         this(x, y, z);
201         setSpeedCoordinates(speedX, speedY, speedZ);
202     }
203 
204     /**
205      * Constructor.
206      *
207      * @param x        cartesian x coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
208      *                 along ECEF-frame axes.
209      * @param y        cartesian y coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
210      *                 along ECEF-frame axes.
211      * @param z        cartesian z coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
212      *                 along ECEF-frame axes.
213      * @param velocity velocity to be set resolved along ECEF-frame axes.
214      */
215     public ECEFFrame(final double x, final double y, final double z, final ECEFVelocity velocity) {
216         this(x, y, z);
217         setVelocity(velocity);
218     }
219 
220     /**
221      * Constructor.
222      *
223      * @param positionX cartesian x coordinate of body position to be set, resolved along ECEF-frame axes.
224      * @param positionY cartesian y coordinate of body position to be set, resolved along ECEF-frame axes.
225      * @param positionZ cartesian z coordinate of body position to be set, resolved along ECEF-frame axes.
226      * @param vx        x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
227      *                  ECEF-frame axes.
228      * @param vy        y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
229      *                  ECEF-frame axes.
230      * @param vz        z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
231      *                  ECEF-frame axes.
232      */
233     public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ,
234                      final double vx, final double vy, final double vz) {
235         this(positionX, positionY, positionZ);
236         setVelocityCoordinates(vx, vy, vz);
237     }
238 
239     /**
240      * Constructor.
241      *
242      * @param positionX cartesian x coordinate of body position to be set, resolved along ECEF-frame axes.
243      * @param positionY cartesian y coordinate of body position to be set, resolved along ECEF-frame axes.
244      * @param positionZ cartesian z coordinate of body position to be set, resolved along ECEF-frame axes.
245      * @param speedX    x coordinate of velocity to be set, resolved along ECEF-frame axes.
246      * @param speedY    y coordinate of velocity to be set, resolved along ECEF-frame axes.
247      * @param speedZ    z coordinate of velocity to be set, resolved along ECEF-frame axes.
248      */
249     public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ,
250                      final Speed speedX, final Speed speedY, final Speed speedZ) {
251         this(positionX, positionY, positionZ);
252         setSpeedCoordinates(speedX, speedY, speedZ);
253     }
254 
255     /**
256      * Constructor.
257      *
258      * @param positionX cartesian x coordinate of body position to be set, resolved along ECEF-frame axes.
259      * @param positionY cartesian y coordinate of body position to be set, resolved along ECEF-frame axes.
260      * @param positionZ cartesian z coordinate of body position to be set, resolved along ECEF-frame axes.
261      * @param velocity  velocity to be set resolved along ECEF-frame axes.
262      */
263     public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ,
264                      final ECEFVelocity velocity) {
265         this(positionX, positionY, positionZ);
266         setVelocity(velocity);
267     }
268 
269     /**
270      * Constructor.
271      *
272      * @param position cartesian position.
273      * @param velocity velocity to be set resolved along ECEF-frame axes.
274      */
275     public ECEFFrame(final ECEFPosition position, final ECEFVelocity velocity) {
276         this(position);
277         setVelocity(velocity);
278     }
279 
280     /**
281      * Constructor.
282      *
283      * @param positionAndVelocity position and velocity to be set resolved
284      *                            along ECEF-frame axes.
285      */
286     public ECEFFrame(final ECEFPositionAndVelocity positionAndVelocity) {
287         this();
288         setPositionAndVelocity(positionAndVelocity);
289     }
290 
291     /**
292      * Constructor.
293      *
294      * @param x cartesian x coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
295      *          ECEF-frame axes.
296      * @param y cartesian y coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
297      *          ECEF-frame axes.
298      * @param z cartesian z coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
299      *          ECEF-frame axes.
300      * @param c Body to ECEF coordinate transformation matrix to be set.
301      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
302      */
303     public ECEFFrame(final double x, final double y, final double z, final CoordinateTransformation c)
304             throws InvalidSourceAndDestinationFrameTypeException {
305         this(x, y, z);
306         setCoordinateTransformation(c);
307     }
308 
309     /**
310      * Constructor.
311      *
312      * @param position cartesian position.
313      * @param c        Body to ECEF coordinate transformation matrix to be set.
314      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
315      */
316     public ECEFFrame(final ECEFPosition position, final CoordinateTransformation c)
317             throws InvalidSourceAndDestinationFrameTypeException {
318         this(position);
319         setCoordinateTransformation(c);
320     }
321 
322     /**
323      * Constructor.
324      *
325      * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
326      * @param c        Body to ECEF coordinate transformation matrix to be set.
327      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
328      */
329     public ECEFFrame(final Point3D position, final CoordinateTransformation c)
330             throws InvalidSourceAndDestinationFrameTypeException {
331 
332         this(position);
333         setCoordinateTransformation(c);
334     }
335 
336     /**
337      * Constructor.
338      *
339      * @param positionX cartesian x coordinate of body position to be set, resolved along ECEF-frame axes.
340      * @param positionY cartesian y coordinate of body position to be set, resolved along ECEF-frame axes.
341      * @param positionZ cartesian z coordinate of body position to be set, resolved along ECEF-frame axes.
342      * @param c         Body to ECEF coordinate transformation matrix to be set.
343      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
344      */
345     public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ,
346                      final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
347 
348         this(positionX, positionY, positionZ);
349         setCoordinateTransformation(c);
350     }
351 
352     /**
353      * Constructor.
354      *
355      * @param x  cartesian x coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
356      *           ECEF-frame axes.
357      * @param y  cartesian y coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
358      *           ECEF-frame axes.
359      * @param z  cartesian z coordinate of body position expressed in meters (m) with respect ECEF frame, resolved along
360      *           ECEF-frame axes.
361      * @param vx x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
362      *           ECEF-frame axes.
363      * @param vy y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
364      *           ECEF-frame axes.
365      * @param vz z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
366      *           ECEF-frame axes.
367      * @param c  Body to ECEF coordinate transformation matrix to be set.
368      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
369      */
370     public ECEFFrame(final double x, final double y, final double z, final double vx, final double vy, final double vz,
371                      final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
372         this(x, y, z, vx, vy, vz);
373         setCoordinateTransformation(c);
374     }
375 
376     /**
377      * Constructor.
378      *
379      * @param position cartesian position.
380      * @param vx       x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
381      *                 ECEF-frame axes.
382      * @param vy       y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
383      *                 ECEF-frame axes.
384      * @param vz       z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
385      *                 ECEF-frame axes.
386      * @param c        Body to ECEF coordinate transformation matrix to be set.
387      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
388      */
389     public ECEFFrame(final ECEFPosition position, final double vx, final double vy, final double vz,
390                      final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
391         this(position, vx, vy, vz);
392         setCoordinateTransformation(c);
393     }
394 
395     /**
396      * Constructor.
397      *
398      * @param x        cartesian x coordinate of body position expressed in meters (m) with respect ECEF frame,
399      *                 resolved along ECEF-frame axes.
400      * @param y        cartesian y coordinate of body position expressed in meters (m) with respect ECEF frame,
401      *                 resolved along ECEF-frame axes.
402      * @param z        cartesian z coordinate of body position expressed in meters (m) with respect ECEF frame,
403      *                 resolved along ECEF-frame axes.
404      * @param velocity velocity to be set resolved along ECEF-frame axes.
405      * @param c        Body to ECEF coordinate transformation matrix to be set.
406      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
407      */
408     public ECEFFrame(final double x, final double y, final double z, final ECEFVelocity velocity,
409                      final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
410         this(x, y, z, velocity);
411         setCoordinateTransformation(c);
412     }
413 
414     /**
415      * Constructor.
416      *
417      * @param position cartesian position.
418      * @param velocity velocity to be set resolved along ECEF-frame axes.
419      * @param c        Body to ECEF coordinate transformation matrix to be set.
420      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
421      */
422     public ECEFFrame(final ECEFPosition position, final ECEFVelocity velocity, final CoordinateTransformation c)
423             throws InvalidSourceAndDestinationFrameTypeException {
424         this(position, velocity);
425         setCoordinateTransformation(c);
426     }
427 
428     /**
429      * Constructor.
430      *
431      * @param positionAndVelocity position and velocity to be set resolved along
432      *                            ECEF-frame axes.
433      * @param c                   Body to ECEF coordinate transformation matrix to be
434      *                            set.
435      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
436      */
437     public ECEFFrame(final ECEFPositionAndVelocity positionAndVelocity, final CoordinateTransformation c)
438             throws InvalidSourceAndDestinationFrameTypeException {
439         this(positionAndVelocity);
440         setCoordinateTransformation(c);
441     }
442 
443     /**
444      * Constructor.
445      *
446      * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
447      * @param vx       x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
448      *                 ECEF-frame axes.
449      * @param vy       y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
450      *                 ECEF-frame axes.
451      * @param vz       z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
452      *                 ECEF-frame axes.
453      * @param c        Body to ECEF coordinate transformation matrix to be set.
454      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
455      */
456     public ECEFFrame(final Point3D position, final double vx, final double vy, final double vz,
457                      final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
458         this(position, vx, vy, vz);
459         setCoordinateTransformation(c);
460     }
461 
462     /**
463      * Constructor.
464      *
465      * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
466      * @param velocity velocity to be set resolved along ECEF-frame axes.
467      * @param c        Body to ECEF coordinate transformation matrix to be set.
468      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
469      */
470     public ECEFFrame(final Point3D position, final ECEFVelocity velocity, final CoordinateTransformation c)
471             throws InvalidSourceAndDestinationFrameTypeException {
472         this(position, velocity);
473         setCoordinateTransformation(c);
474     }
475 
476     /**
477      * Constructor.
478      *
479      * @param position body position expressed in meters (m) and resolved along ECEF-frame axes.
480      * @param speedX   x coordinate of velocity to be set, resolved along ECEF-frame axes.
481      * @param speedY   y coordinate of velocity to be set, resolved along ECEF-frame axes.
482      * @param speedZ   z coordinate of velocity to be set, resolved along ECEF-frame axes.
483      * @param c        Body to ECEF coordinate transformation matrix to be set.
484      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
485      */
486     public ECEFFrame(final Point3D position, final Speed speedX, final Speed speedY, final Speed speedZ,
487                      final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
488         this(position, speedX, speedY, speedZ);
489         setCoordinateTransformation(c);
490     }
491 
492     /**
493      * Constructor.
494      *
495      * @param position cartesian position.
496      * @param speedX   x coordinate of velocity to be set, resolved along ECEF-frame axes.
497      * @param speedY   y coordinate of velocity to be set, resolved along ECEF-frame axes.
498      * @param speedZ   z coordinate of velocity to be set, resolved along ECEF-frame axes.
499      * @param c        Body to ECEF coordinate transformation matrix to be set.
500      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
501      */
502     public ECEFFrame(final ECEFPosition position, final Speed speedX, final Speed speedY, final Speed speedZ,
503                      final CoordinateTransformation c) throws InvalidSourceAndDestinationFrameTypeException {
504         this(position, speedX, speedY, speedZ);
505         setCoordinateTransformation(c);
506     }
507 
508     /**
509      * Constructor.
510      *
511      * @param x      cartesian x coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
512      *               along ECEF-frame axes.
513      * @param y      cartesian y coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
514      *               along ECEF-frame axes.
515      * @param z      cartesian z coordinate of body position expressed in meters (m) with respect ECEF frame, resolved
516      *               along ECEF-frame axes.
517      * @param speedX x coordinate of velocity to be set, resolved along ECEF-frame axes.
518      * @param speedY y coordinate of velocity to be set, resolved along ECEF-frame axes.
519      * @param speedZ z coordinate of velocity to be set, resolved along ECEF-frame axes.
520      * @param c      Body to ECEF coordinate transformation matrix to be set.
521      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
522      */
523     public ECEFFrame(final double x, final double y, final double z,
524                      final Speed speedX, final Speed speedY, final Speed speedZ, final CoordinateTransformation c)
525             throws InvalidSourceAndDestinationFrameTypeException {
526         this(x, y, z, speedX, speedY, speedZ);
527         setCoordinateTransformation(c);
528     }
529 
530     /**
531      * Constructor.
532      *
533      * @param positionX cartesian x coordinate of body position to be set, resolved along ECEF-frame axes.
534      * @param positionY cartesian y coordinate of body position to be set, resolved along ECEF-frame axes.
535      * @param positionZ cartesian z coordinate of body position to be set, resolved along ECEF-frame axes.
536      * @param vx        x coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
537      *                  ECEF-frame axes.
538      * @param vy        y coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
539      *                  ECEF-frame axes.
540      * @param vz        z coordinate of velocity of body frame expressed in meters per second (m/s) and resolved along
541      *                  ECEF-frame axes.
542      * @param c         Body to ECEF coordinate transformation matrix to be set.
543      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
544      */
545     public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ,
546                      final double vx, final double vy, final double vz, final CoordinateTransformation c)
547             throws InvalidSourceAndDestinationFrameTypeException {
548         this(positionX, positionY, positionZ, vx, vy, vz);
549         setCoordinateTransformation(c);
550     }
551 
552     /**
553      * Constructor.
554      *
555      * @param positionX cartesian x coordinate of body position to be set, resolved along ECEF-frame axes.
556      * @param positionY cartesian y coordinate of body position to be set, resolved along ECEF-frame axes.
557      * @param positionZ cartesian z coordinate of body position to be set, resolved along ECEF-frame axes.
558      * @param velocity  velocity to be set resolved along ECEF-frame axes.
559      * @param c         Body to ECEF coordinate transformation matrix to be set.
560      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
561      */
562     public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ,
563                      final ECEFVelocity velocity, final CoordinateTransformation c)
564             throws InvalidSourceAndDestinationFrameTypeException {
565         this(positionX, positionY, positionZ, velocity);
566         setCoordinateTransformation(c);
567     }
568 
569     /**
570      * Constructor.
571      *
572      * @param positionX cartesian x coordinate of body position to be set, resolved along ECEF-frame axes.
573      * @param positionY cartesian y coordinate of body position to be set, resolved along ECEF-frame axes.
574      * @param positionZ cartesian z coordinate of body position to be set, resolved along ECEF-frame axes.
575      * @param speedX    x coordinate of velocity to be set, resolved along ECEF-frame axes.
576      * @param speedY    y coordinate of velocity to be set, resolved along ECEF-frame axes.
577      * @param speedZ    z coordinate of velocity to be set, resolved along ECEF-frame axes.
578      * @param c         Body to ECEF coordinate transformation matrix to be set.
579      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
580      */
581     public ECEFFrame(final Distance positionX, final Distance positionY, final Distance positionZ,
582                      final Speed speedX, final Speed speedY, final Speed speedZ, final CoordinateTransformation c)
583             throws InvalidSourceAndDestinationFrameTypeException {
584         this(positionX, positionY, positionZ, speedX, speedY, speedZ);
585         setCoordinateTransformation(c);
586     }
587 
588     /**
589      * Constructor.
590      *
591      * @param input ECEF frame to copy data from.
592      */
593     public ECEFFrame(final ECEFFrame input) {
594         this();
595         copyFrom(input);
596     }
597 
598     /**
599      * Gets cartesian position.
600      *
601      * @param result instance where cartesian position will be stored.
602      */
603     public void getECEFPosition(final ECEFPosition result) {
604         result.setCoordinates(x, y, z);
605     }
606 
607     /**
608      * Gets cartesian position.
609      *
610      * @return cartesian position.
611      */
612     public ECEFPosition getECEFPosition() {
613         return new ECEFPosition(x, y, z);
614     }
615 
616     /**
617      * Sets cartesian position.
618      *
619      * @param position cartesian position to be set.
620      */
621     public void setPosition(final ECEFPosition position) {
622         x = position.getX();
623         y = position.getY();
624         z = position.getZ();
625     }
626 
627     /**
628      * Gets cartesian velocity.
629      *
630      * @param result instance where cartesian velocity will be stored.
631      */
632     public void getECEFVelocity(final ECEFVelocity result) {
633         result.setCoordinates(vx, vy, vz);
634     }
635 
636     /**
637      * Gets cartesian velocity.
638      *
639      * @return cartesian velocity.
640      */
641     public ECEFVelocity getECEFVelocity() {
642         return new ECEFVelocity(vx, vy, vz);
643     }
644 
645     /**
646      * Sets cartesian velocity.
647      *
648      * @param velocity cartesian velocity to be set.
649      */
650     public void setVelocity(final ECEFVelocity velocity) {
651         vx = velocity.getVx();
652         vy = velocity.getVy();
653         vz = velocity.getVz();
654     }
655 
656     /**
657      * Gets cartesian position and velocity.
658      *
659      * @param result instance where cartesian position and velocity will be stored.
660      */
661     public void getPositionAndVelocity(final ECEFPositionAndVelocity result) {
662         result.setPositionCoordinates(x, y, z);
663         result.setVelocityCoordinates(vx, vy, vz);
664     }
665 
666     /**
667      * Gets cartesian position and velocity.
668      *
669      * @return cartesian position and velocity.
670      */
671     public ECEFPositionAndVelocity getPositionAndVelocity() {
672         return new ECEFPositionAndVelocity(x, y, z, vx, vy, vz);
673     }
674 
675     /**
676      * Sets cartesian position and velocity.
677      *
678      * @param positionAndVelocity cartesian position and velocity.
679      */
680     public void setPositionAndVelocity(final ECEFPositionAndVelocity positionAndVelocity) {
681         x = positionAndVelocity.getX();
682         y = positionAndVelocity.getY();
683         z = positionAndVelocity.getZ();
684 
685         vx = positionAndVelocity.getVx();
686         vy = positionAndVelocity.getVy();
687         vz = positionAndVelocity.getVz();
688     }
689 
690     /**
691      * Gets coordinate transformation matrix.
692      *
693      * @return coordinate transformation matrix.
694      */
695     @Override
696     public CoordinateTransformation getCoordinateTransformation() {
697         final var result = new CoordinateTransformation(FrameType.BODY_FRAME,
698                 FrameType.EARTH_CENTERED_EARTH_FIXED_FRAME);
699         getCoordinateTransformation(result);
700         return result;
701     }
702 
703     /**
704      * Gets coordinate transformation matrix.
705      *
706      * @param result instance where coordinate transformation matrix will be copied to.
707      */
708     @Override
709     public void getCoordinateTransformation(final CoordinateTransformation result) {
710         c.copyTo(result);
711     }
712 
713     /**
714      * Sets coordinate transformation matrix.
715      * Provided value must be a body to ECEF transformation matrix.
716      *
717      * @param c coordinate transformation matrix to be set.
718      * @throws InvalidSourceAndDestinationFrameTypeException if source or destination frame types are invalid.
719      */
720     @Override
721     public void setCoordinateTransformation(final CoordinateTransformation c)
722             throws InvalidSourceAndDestinationFrameTypeException {
723         if (!isValidCoordinateTransformation(c)) {
724             throw new InvalidSourceAndDestinationFrameTypeException();
725         }
726 
727         this.c = c;
728     }
729 
730     /**
731      * Checks whether provided coordinate transformation is valid or not.
732      * Only body to ECEF transformation matrices are considered to be valid.
733      *
734      * @param c coordinate transformation matrix to be checked.
735      * @return true if provided value is valid, false otherwise.
736      */
737     public static boolean isValidCoordinateTransformation(final CoordinateTransformation c) {
738         return c.getSourceType() == FrameType.BODY_FRAME
739                 && c.getDestinationType() == FrameType.EARTH_CENTERED_EARTH_FIXED_FRAME;
740     }
741 
742     /**
743      * Makes a copy of this instance.
744      *
745      * @return a copy of this instance.
746      * @throws CloneNotSupportedException if clone fails for some reason.
747      */
748     @Override
749     protected Object clone() throws CloneNotSupportedException {
750         final var result = (ECEFFrame) super.clone();
751         copyTo(result);
752         clazz = ECEFFrame.class;
753         return result;
754     }
755 }