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 }