View Javadoc
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 }