1 /*
2 * Copyright (C) 2018 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
17 package com.irurueta.units;
18
19 import java.math.BigDecimal;
20
21 /**
22 * Contains angle value and unit.
23 */
24 @SuppressWarnings("WeakerAccess")
25 public class Angle extends Measurement<AngleUnit> {
26
27 /**
28 * Constructor with value and unit.
29 *
30 * @param value angle value.
31 * @param unit unit of angle.
32 * @throws IllegalArgumentException if either value or unit is null.
33 */
34 public Angle(final Number value, final AngleUnit unit) {
35 super(value, unit);
36 }
37
38 /**
39 * Constructor.
40 */
41 Angle() {
42 super();
43 }
44
45 /**
46 * Determines if two angles are equal up to a certain tolerance. If needed, this method attempts unit conversion
47 * to compare both objects.
48 *
49 * @param other another measurement to compare.
50 * @param tolerance amount of tolerance to determine whether two angle instances are equal or not.
51 * @return true if provided angle is assumed to be equal to this instance, false otherwise.
52 */
53 @Override
54 public boolean equals(final Measurement<AngleUnit> other, final double tolerance) {
55 if (super.equals(other, tolerance)) {
56 return true;
57 }
58
59 //attempt conversion to common units
60 if (other == null) {
61 return false;
62 }
63
64 final var otherValue = AngleConverter.convert(other.getValue().doubleValue(), other.getUnit(), getUnit());
65 return Math.abs(getValue().doubleValue() - otherValue) <= tolerance;
66 }
67
68 /**
69 * Adds two angle values and units and returns the result.
70 *
71 * @param value1 1st argument value.
72 * @param unit1 1st argument unit.
73 * @param value2 2nd argument value.
74 * @param unit2 2nd argument unit.
75 * @param resultUnit unit of result to be returned.
76 * @return result of addition.
77 */
78 public static double add(
79 final double value1, final AngleUnit unit1,
80 final double value2, final AngleUnit unit2,
81 final AngleUnit resultUnit) {
82 final var v1 = AngleConverter.convert(value1, unit1, resultUnit);
83 final var v2 = AngleConverter.convert(value2, unit2, resultUnit);
84 return v1 + v2;
85 }
86
87 /**
88 * Adds two angle values and units and returns the result.
89 *
90 * @param value1 1st argument value.
91 * @param unit1 1st argument unit.
92 * @param value2 2nd argument value.
93 * @param unit2 2nd argument unit.
94 * @param resultUnit unit of result to be returned.
95 * @return result of addition.
96 */
97 public static Number add(
98 final Number value1, final AngleUnit unit1,
99 final Number value2, final AngleUnit unit2,
100 final AngleUnit resultUnit) {
101 return BigDecimal.valueOf(add(value1.doubleValue(), unit1, value2.doubleValue(), unit2, resultUnit));
102 }
103
104 /**
105 * Adds two angles and stores the result into provided instance.
106 *
107 * @param arg1 1st argument.
108 * @param arg2 2nd argument.
109 * @param result instance where result will be stored.
110 */
111 public static void add(final Angle arg1, final Angle arg2, final Angle result) {
112 result.setValue(add(arg1.getValue(), arg1.getUnit(), arg2.getValue(), arg2.getUnit(), result.getUnit()));
113 }
114
115 /**
116 * Adds two angles.
117 *
118 * @param arg1 1st argument.
119 * @param arg2 2nd argument.
120 * @param unit unit of returned angle.
121 * @return a new instance containing result.
122 */
123 public static Angle addAndReturnNew(final Angle arg1, final Angle arg2, final AngleUnit unit) {
124 final var result = new Angle();
125 result.setUnit(unit);
126 add(arg1, arg2, result);
127 return result;
128 }
129
130 /**
131 * Adds provided angle value and unit and returns a new angle instance using provided unit.
132 *
133 * @param value value to be added.
134 * @param unit unit of value to be added.
135 * @param resultUnit unit of returned angle.
136 * @return a new angle containing result.
137 */
138 public Angle addAndReturnNew(
139 final double value, final AngleUnit unit, final AngleUnit resultUnit) {
140 final var result = new Angle();
141 result.setUnit(resultUnit);
142 result.setValue(add(getValue().doubleValue(), getUnit(), value, unit, resultUnit));
143 return result;
144 }
145
146 /**
147 * Adds provided angle value and unit and returns a new angle instance using provided unit.
148 *
149 * @param value value to be added.
150 * @param unit unit of value to be added.
151 * @param resultUnit unit of returned angle.
152 * @return a new angle containing result.
153 */
154 public Angle addAndReturnNew(
155 final Number value, final AngleUnit unit, final AngleUnit resultUnit) {
156 final var result = new Angle();
157 result.setUnit(resultUnit);
158 result.setValue(add(getValue(), getUnit(), value, unit, resultUnit));
159 return result;
160 }
161
162 /**
163 * Adds provided angle to current instance and returns a new angle.
164 *
165 * @param a angle to be added.
166 * @param unit unit of returned angle.
167 * @return a new angle containing result.
168 */
169 public Angle addAndReturnNew(final Angle a, final AngleUnit unit) {
170 return addAndReturnNew(this, a, unit);
171 }
172
173 /**
174 * Adds provided angle value and unit and updates current angle instance.
175 *
176 * @param value angle value to be added.
177 * @param unit unit of angle value.
178 */
179 public void add(final double value, final AngleUnit unit) {
180 setValue(add(getValue(), getUnit(), value, unit, getUnit()));
181 }
182
183 /**
184 * Adds provided angle value and unit and updates current angle instance.
185 *
186 * @param value angle value to be added.
187 * @param unit unit of angle value.
188 */
189 public void add(final Number value, final AngleUnit unit) {
190 setValue(add(getValue(), getUnit(), value, unit, getUnit()));
191 }
192
193 /**
194 * Adds provided angle and updates current angle.
195 *
196 * @param angle angle to be added.
197 */
198 public void add(final Angle angle) {
199 add(this, angle, this);
200 }
201
202 /**
203 * Adds provided angle and stores the result into provided angle.
204 *
205 * @param a angle to be added.
206 * @param result instance where result will be stored.
207 */
208 public void add(final Angle a, final Angle result) {
209 add(this, a, result);
210 }
211
212 /**
213 * Subtracts two angle values and units and returns the result.
214 *
215 * @param value1 1st argument value.
216 * @param unit1 1st argument unit.
217 * @param value2 2nd argument value.
218 * @param unit2 2nd argument unit.
219 * @param resultUnit unit of result to be returned.
220 * @return result of subtraction.
221 */
222 public static double subtract(
223 final double value1, final AngleUnit unit1,
224 final double value2, final AngleUnit unit2,
225 final AngleUnit resultUnit) {
226 final var v1 = AngleConverter.convert(value1, unit1, resultUnit);
227 final var v2 = AngleConverter.convert(value2, unit2, resultUnit);
228 return v1 - v2;
229 }
230
231 /**
232 * Subtracts two angle values and units and returns the result.
233 *
234 * @param value1 1st argument value.
235 * @param unit1 1st argument unit.
236 * @param value2 2nd argument value.
237 * @param unit2 2nd argument unit.
238 * @param resultUnit unit of result to be returned.
239 * @return result of subtraction.
240 */
241 public static Number subtract(
242 final Number value1, final AngleUnit unit1,
243 final Number value2, final AngleUnit unit2,
244 final AngleUnit resultUnit) {
245 return BigDecimal.valueOf(subtract(value1.doubleValue(), unit1, value2.doubleValue(), unit2, resultUnit));
246 }
247
248 /**
249 * Subtracts two angles and stores the result into provided instance.
250 *
251 * @param arg1 1st argument.
252 * @param arg2 2nd argument.
253 * @param result instance where result will be stored.
254 */
255 public static void subtract(final Angle arg1, final Angle arg2, final Angle result) {
256 result.setValue(subtract(arg1.getValue(), arg1.getUnit(), arg2.getValue(), arg2.getUnit(), result.getUnit()));
257 }
258
259 /**
260 * Subtracts two angles.
261 *
262 * @param arg1 1st argument.
263 * @param arg2 2nd argument.
264 * @param unit unit of returned angle.
265 * @return a new angle containing result.
266 */
267 public static Angle subtractAndReturnNew(final Angle arg1, final Angle arg2, final AngleUnit unit) {
268 final var result = new Angle();
269 result.setUnit(unit);
270 subtract(arg1, arg2, result);
271 return result;
272 }
273
274 /**
275 * Subtracts provided angle value and unit and returns a new angle instance using provided unit.
276 *
277 * @param value value to be subtracted.
278 * @param unit unit of value to be subtracted.
279 * @param resultUnit unit of returned angle.
280 * @return a new angle containing result.
281 */
282 public Angle subtractAndReturnNew(
283 final double value, final AngleUnit unit, final AngleUnit resultUnit) {
284 final var result = new Angle();
285 result.setUnit(resultUnit);
286 result.setValue(subtract(getValue().doubleValue(), getUnit(), value, unit, resultUnit));
287 return result;
288 }
289
290 /**
291 * Subtracts provided angle value and unit and returns a new angle instance using provided unit.
292 *
293 * @param value value to be subtracted.
294 * @param unit unit of value to be subtracted.
295 * @param resultUnit unit of returned angle.
296 * @return a new angle containing result.
297 */
298 public Angle subtractAndReturnNew(
299 final Number value, final AngleUnit unit, final AngleUnit resultUnit) {
300 final var result = new Angle();
301 result.setUnit(resultUnit);
302 result.setValue(subtract(getValue(), getUnit(), value, unit, resultUnit));
303 return result;
304 }
305
306 /**
307 * Subtracts provided angle to current instance and returns a new angle.
308 *
309 * @param a angle to be subtracted.
310 * @param unit unit of returned angle.
311 * @return a new angle containing result.
312 */
313 public Angle subtractAndReturnNew(final Angle a, final AngleUnit unit) {
314 return subtractAndReturnNew(this, a, unit);
315 }
316
317 /**
318 * Subtracts provided angle value and unit and updates current angle instance.
319 *
320 * @param value angle value to be subtracted.
321 * @param unit unit of angle value.
322 */
323 public void subtract(final double value, final AngleUnit unit) {
324 setValue(subtract(getValue(), getUnit(), value, unit, getUnit()));
325 }
326
327 /**
328 * Subtracts provided angle value and unit and updates current angle instance.
329 *
330 * @param value angle value to be subtracted.
331 * @param unit unit of angle value.
332 */
333 public void subtract(final Number value, final AngleUnit unit) {
334 setValue(subtract(getValue(), getUnit(), value, unit, getUnit()));
335 }
336
337 /**
338 * Subtracts provided angle and updates current angle.
339 *
340 * @param angle angle to be subtracted.
341 */
342 public void subtract(final Angle angle) {
343 subtract(this, angle, this);
344 }
345
346 /**
347 * Subtracts provided angle and stores the result into provided angle.
348 *
349 * @param a angle to be subtracted.
350 * @param result instance where result will be stored.
351 */
352 public void subtract(final Angle a, final Angle result) {
353 subtract(this, a, result);
354 }
355 }