View Javadoc
1   /*
2    * Copyright (C) 2020 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.inertial.calibration;
17  
18  import com.irurueta.units.MagneticFluxDensity;
19  import com.irurueta.units.MagneticFluxDensityConverter;
20  import com.irurueta.units.MagneticFluxDensityUnit;
21  
22  import java.io.Serial;
23  
24  /**
25   * Contains a triad of magnetic flux density measurements.
26   */
27  public class MagneticFluxDensityTriad extends Triad<MagneticFluxDensityUnit, MagneticFluxDensity, MagneticFluxDensityTriad>
28          implements Cloneable {
29  
30      /**
31       * Default magnetic flux density unit.
32       */
33      public static final MagneticFluxDensityUnit DEFAULT_UNIT = MagneticFluxDensityUnit.TESLA;
34  
35      /**
36       * Serialization version. This is used to ensure compatibility of deserialization of permanently stored serialized
37       * instances.
38       */
39      @Serial
40      private static final long serialVersionUID = 0L;
41  
42      /**
43       * Constructor.
44       */
45      public MagneticFluxDensityTriad() {
46          this(DEFAULT_UNIT);
47      }
48  
49      /**
50       * Constructor.
51       *
52       * @param unit magnetic flux density unit for stored values.
53       */
54      public MagneticFluxDensityTriad(final MagneticFluxDensityUnit unit) {
55          super(unit);
56      }
57  
58      /**
59       * Constructor.
60       *
61       * @param valueX x-coordinate of measurement value expressed in default unit.
62       * @param valueY y-coordinate of measurement value expressed in default unit.
63       * @param valueZ z-coordinate of measurement value expressed in default unit.
64       */
65      public MagneticFluxDensityTriad(final double valueX, final double valueY, final double valueZ) {
66          this(DEFAULT_UNIT, valueX, valueY, valueZ);
67      }
68  
69      /**
70       * Constructor.
71       *
72       * @param unit   magnetic flux density unit for stored values.
73       * @param valueX x-coordinate of measurement value expressed in
74       *               provided unit.
75       * @param valueY y-coordinate of measurement value expressed in
76       *               provided unit.
77       * @param valueZ z-coordinate of measurement value expressed in
78       *               provided unit.
79       */
80      public MagneticFluxDensityTriad(
81              final MagneticFluxDensityUnit unit, final double valueX, final double valueY, final double valueZ) {
82          super(unit, valueX, valueY, valueZ);
83      }
84  
85      /**
86       * Constructor.
87       *
88       * @param measurementX x-coordinate of measurement.
89       * @param measurementY y-coordinate of measurement.
90       * @param measurementZ z-coordinate of measurement.
91       */
92      public MagneticFluxDensityTriad(
93              final MagneticFluxDensity measurementX, final MagneticFluxDensity measurementY,
94              final MagneticFluxDensity measurementZ) {
95          super(DEFAULT_UNIT);
96          setMeasurementCoordinates(measurementX, measurementY, measurementZ);
97      }
98  
99      /**
100      * Copy constructor.
101      *
102      * @param other instance to copy from.
103      */
104     public MagneticFluxDensityTriad(final MagneticFluxDensityTriad other) {
105         super(other);
106     }
107 
108     /**
109      * Gets x coordinate of measurement value.
110      *
111      * @return x coordinate of measurement value.
112      */
113     @Override
114     public MagneticFluxDensity getMeasurementX() {
115         return new MagneticFluxDensity(getValueX(), getUnit());
116     }
117 
118     /**
119      * Gets x coordinate of measurement value.
120      *
121      * @param result instance where x coordinate of measurement value
122      *               will be stored.
123      */
124     @Override
125     public void getMeasurementX(final MagneticFluxDensity result) {
126         result.setValue(getValueX());
127         result.setUnit(getUnit());
128     }
129 
130     /**
131      * Sets x coordinate of measurement value.
132      *
133      * @param measurementX x coordinate of measurement value.
134      */
135     @Override
136     public void setMeasurementX(final MagneticFluxDensity measurementX) {
137         setValueX(MagneticFluxDensityConverter.convert(measurementX.getValue(), measurementX.getUnit(),
138                 getUnit()).doubleValue());
139     }
140 
141     /**
142      * Gets y coordinate of measurement value.
143      *
144      * @return y coordinate of measurement value.
145      */
146     @Override
147     public MagneticFluxDensity getMeasurementY() {
148         return new MagneticFluxDensity(getValueY(), getUnit());
149     }
150 
151     /**
152      * Gets y coordinate of measurement value.
153      *
154      * @param result instance where y coordinate of measurement value
155      *               will be stored.
156      */
157     @Override
158     public void getMeasurementY(final MagneticFluxDensity result) {
159         result.setValue(getValueY());
160         result.setUnit(getUnit());
161     }
162 
163     /**
164      * Sets y coordinate of measurement value.
165      *
166      * @param measurementY y coordinate of measurement value.
167      */
168     @Override
169     public void setMeasurementY(final MagneticFluxDensity measurementY) {
170         setValueY(MagneticFluxDensityConverter.convert(measurementY.getValue(), measurementY.getUnit(),
171                 getUnit()).doubleValue());
172     }
173 
174     /**
175      * Gets z coordinate of measurement value.
176      *
177      * @return z coordinate of measurement value.
178      */
179     @Override
180     public MagneticFluxDensity getMeasurementZ() {
181         return new MagneticFluxDensity(getValueZ(), getUnit());
182     }
183 
184     /**
185      * Gets z coordinate of measurement value.
186      *
187      * @param result instance where z coordinate of measurement value
188      *               will be stored.
189      */
190     @Override
191     public void getMeasurementZ(final MagneticFluxDensity result) {
192         result.setValue(getValueZ());
193         result.setUnit(getUnit());
194     }
195 
196     /**
197      * Sets z coordinate of measurement value.
198      *
199      * @param measurementZ z coordinate of measurement value.
200      */
201     @Override
202     public void setMeasurementZ(final MagneticFluxDensity measurementZ) {
203         setValueZ(MagneticFluxDensityConverter.convert(measurementZ.getValue(), measurementZ.getUnit(),
204                 getUnit()).doubleValue());
205     }
206 
207     /**
208      * Sets measurement coordinates.
209      *
210      * @param measurementX x coordinate of measurement value.
211      * @param measurementY y coordinate of measurement value.
212      * @param measurementZ z coordinate of measurement value.
213      */
214     @Override
215     public void setMeasurementCoordinates(
216             final MagneticFluxDensity measurementX, final MagneticFluxDensity measurementY,
217             final MagneticFluxDensity measurementZ) {
218         setMeasurementX(measurementX);
219         setMeasurementY(measurementY);
220         setMeasurementZ(measurementZ);
221     }
222 
223     /**
224      * Gets norm as a magnetic flux density.
225      *
226      * @return magnetic flux density containing triad norm.
227      */
228     @Override
229     public MagneticFluxDensity getMeasurementNorm() {
230         return new MagneticFluxDensity(getNorm(), getUnit());
231     }
232 
233     /**
234      * Creates and returns a new instance having exactly the same contents
235      * as this instance.
236      *
237      * @return a copy of this instance.
238      */
239     @Override
240     public MagneticFluxDensityTriad copy() {
241         final var result = new MagneticFluxDensityTriad();
242         result.copyFrom(this);
243         return result;
244     }
245 
246     /**
247      * Makes a copy of this instance.
248      *
249      * @return a copy of this instance.
250      * @throws CloneNotSupportedException if clone fails for some reason.
251      */
252     @Override
253     protected Object clone() throws CloneNotSupportedException {
254         final var result = (MagneticFluxDensityTriad) super.clone();
255         copyTo(result);
256         return result;
257     }
258 }