RobotCore 1.0
WPILib port to raspberry Pi
Loading...
Searching...
No Matches
Measure.java
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5package org.wpilib.units;
6
7import static org.wpilib.units.Units.Value;
8
9import org.wpilib.units.measure.Acceleration;
10import org.wpilib.units.measure.Angle;
11import org.wpilib.units.measure.AngularAcceleration;
12import org.wpilib.units.measure.AngularMomentum;
13import org.wpilib.units.measure.AngularVelocity;
14import org.wpilib.units.measure.Current;
15import org.wpilib.units.measure.Dimensionless;
16import org.wpilib.units.measure.Distance;
17import org.wpilib.units.measure.Energy;
18import org.wpilib.units.measure.Force;
19import org.wpilib.units.measure.Frequency;
20import org.wpilib.units.measure.LinearAcceleration;
21import org.wpilib.units.measure.LinearMomentum;
22import org.wpilib.units.measure.LinearVelocity;
23import org.wpilib.units.measure.Mass;
24import org.wpilib.units.measure.MomentOfInertia;
25import org.wpilib.units.measure.Mult;
26import org.wpilib.units.measure.Per;
27import org.wpilib.units.measure.Power;
28import org.wpilib.units.measure.Resistance;
29import org.wpilib.units.measure.Temperature;
30import org.wpilib.units.measure.Time;
31import org.wpilib.units.measure.Torque;
32import org.wpilib.units.measure.Velocity;
33import org.wpilib.units.measure.Voltage;
34
41public interface Measure<U extends Unit> extends Comparable<Measure<U>> {
46 double EQUIVALENCE_THRESHOLD = 1e-12;
47
53 double magnitude();
54
62
68 U unit();
69
82 default double in(U unit) {
83 if (this.unit().equals(unit)) {
84 return magnitude();
85 } else {
86 return unit.fromBaseUnits(baseUnitMagnitude());
87 }
88 }
89
96 @SuppressWarnings("unchecked")
97 default U baseUnit() {
98 return (U) unit().getBaseUnit();
99 }
100
107 default double abs(U unit) {
108 return Math.abs(this.in(unit));
109 }
110
118 default double copySign(Measure<U> other, U unit) {
119 return Math.copySign(this.in(unit), other.in(unit));
120 }
121
131
139
147
154 Measure<U> times(double multiplier);
155
162 Measure<U> times(Dimensionless multiplier);
163
174 default Measure<?> times(Measure<?> multiplier) {
175 final double baseUnitResult = baseUnitMagnitude() * multiplier.baseUnitMagnitude();
176
177 // First try to eliminate any common units
178 if (unit() instanceof PerUnit<?, ?> ratio
179 && multiplier.baseUnit().equals(ratio.denominator().getBaseUnit())) {
180 // Per<N, D> * D -> yield N
181 // Case 1: denominator of the Per cancels out, return with just the units of the numerator
182 return ratio.numerator().ofBaseUnits(baseUnitResult);
183 } else if (multiplier.baseUnit() instanceof PerUnit<?, ?> ratio
184 && baseUnit().equals(ratio.denominator().getBaseUnit())) {
185 // D * Per<N, D) -> yield N
186 // Case 2: Same as Case 1, just flipped between this and the multiplier
187 return ratio.numerator().ofBaseUnits(baseUnitResult);
188 } else if (unit() instanceof PerUnit<?, ?> per
189 && multiplier.unit() instanceof PerUnit<?, ?> otherPer
190 && per.denominator().getBaseUnit().equals(otherPer.numerator().getBaseUnit())
191 && per.numerator().getBaseUnit().equals(otherPer.denominator().getBaseUnit())) {
192 // multiplying eg meters per second * milliseconds per foot
193 // return a scalar
194 return Value.of(baseUnitResult);
195 }
196
197 // No common units to eliminate, is one of them dimensionless?
198 // Note that this must come *after* the multiplier cases, otherwise
199 // Per<U, Dimensionless> * Dimensionless will not return a U
200 if (multiplier.unit() instanceof DimensionlessUnit) {
201 // scalar multiplication of this
202 return times(multiplier.baseUnitMagnitude());
203 } else if (unit() instanceof DimensionlessUnit) {
204 // scalar multiplication of multiplier
205 return multiplier.times(baseUnitMagnitude());
206 }
207
208 return switch (multiplier) {
209 case Acceleration<?> acceleration -> times(acceleration);
210 case Angle angle -> times(angle);
211 case AngularAcceleration angularAcceleration -> times(angularAcceleration);
212 case AngularMomentum angularMomentum -> times(angularMomentum);
213 case AngularVelocity angularVelocity -> times(angularVelocity);
214 case Current current -> times(current);
215 // n.b. this case should already be covered
216 case Dimensionless dimensionless -> times(dimensionless);
217 case Distance distance -> times(distance);
218 case Energy energy -> times(energy);
219 case Force force -> times(force);
220 case Frequency frequency -> times(frequency);
221 case LinearAcceleration linearAcceleration -> times(linearAcceleration);
222 case LinearVelocity linearVelocity -> times(linearVelocity);
223 case Mass mass -> times(mass);
224 case MomentOfInertia momentOfInertia -> times(momentOfInertia);
225 case Mult<?, ?> mult -> times(mult);
226 case Per<?, ?> per -> times(per);
227 case Power power -> times(power);
228 case Temperature temperature -> times(temperature);
229 case Time time -> times(time);
230 case Torque torque -> times(torque);
231 case Velocity<?> velocity -> times(velocity);
232 case Voltage voltage -> times(voltage);
233 case Resistance resistance -> times(resistance);
234 // Dimensional analysis fallthrough or a generic input measure type
235 // Do a basic unit multiplication
236 default -> MultUnit.combine(unit(), multiplier.unit()).ofBaseUnits(baseUnitResult);
237 };
238 }
239
247 default Measure<?> times(Acceleration<?> multiplier) {
248 return MultUnit.combine(unit(), multiplier.unit())
249 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
250 }
251
259 default Measure<?> times(Angle multiplier) {
260 return MultUnit.combine(unit(), multiplier.unit())
261 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
262 }
263
271 default Measure<?> times(AngularAcceleration multiplier) {
272 return MultUnit.combine(unit(), multiplier.unit())
273 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
274 }
275
283 default Measure<?> times(AngularMomentum multiplier) {
284 return MultUnit.combine(unit(), multiplier.unit())
285 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
286 }
287
295 default Measure<?> times(AngularVelocity multiplier) {
296 return MultUnit.combine(unit(), multiplier.unit())
297 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
298 }
299
307 default Measure<?> times(Current multiplier) {
308 return MultUnit.combine(unit(), multiplier.unit())
309 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
310 }
311
319 default Measure<?> times(Distance multiplier) {
320 return MultUnit.combine(unit(), multiplier.unit())
321 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
322 }
323
331 default Measure<?> times(Energy multiplier) {
332 return MultUnit.combine(unit(), multiplier.unit())
333 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
334 }
335
343 default Measure<?> times(Force multiplier) {
344 return MultUnit.combine(unit(), multiplier.unit())
345 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
346 }
347
356 default Measure<?> times(Frequency multiplier) {
357 return MultUnit.combine(unit(), multiplier.unit())
358 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
359 }
360
368 default Measure<?> times(LinearAcceleration multiplier) {
369 return MultUnit.combine(unit(), multiplier.unit())
370 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
371 }
372
380 default Measure<?> times(LinearMomentum multiplier) {
381 return MultUnit.combine(unit(), multiplier.unit())
382 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
383 }
384
392 default Measure<?> times(LinearVelocity multiplier) {
393 return MultUnit.combine(unit(), multiplier.unit())
394 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
395 }
396
404 default Measure<?> times(Mass multiplier) {
405 return MultUnit.combine(unit(), multiplier.unit())
406 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
407 }
408
416 default Measure<?> times(MomentOfInertia multiplier) {
417 return MultUnit.combine(unit(), multiplier.unit())
418 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
419 }
420
428 default Measure<?> times(Mult<?, ?> multiplier) {
429 return MultUnit.combine(unit(), multiplier.unit())
430 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
431 }
432
440 default Measure<?> times(Power multiplier) {
441 return MultUnit.combine(unit(), multiplier.unit())
442 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
443 }
444
452 default Measure<?> times(Per<?, ?> multiplier) {
453 return MultUnit.combine(unit(), multiplier.unit())
454 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
455 }
456
464 default Measure<?> times(Temperature multiplier) {
465 return MultUnit.combine(unit(), multiplier.unit())
466 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
467 }
468
476 default Measure<?> times(Time multiplier) {
477 return MultUnit.combine(unit(), multiplier.unit())
478 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
479 }
480
488 default Measure<?> times(Torque multiplier) {
489 return MultUnit.combine(unit(), multiplier.unit())
490 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
491 }
492
500 default Measure<?> times(Velocity<?> multiplier) {
501 return MultUnit.combine(unit(), multiplier.unit())
502 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
503 }
504
512 default Measure<?> times(Voltage multiplier) {
513 return MultUnit.combine(unit(), multiplier.unit())
514 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
515 }
516
524 default Measure<?> times(Resistance multiplier) {
525 return MultUnit.combine(unit(), multiplier.unit())
526 .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
527 }
528
540 @SuppressWarnings("unchecked")
541 default <Other extends Unit, M extends Measure<Other>> M timesConversionFactor(
542 Measure<? extends PerUnit<Other, U>> conversionFactor) {
543 return (M)
544 conversionFactor
545 .unit()
546 .getBaseUnit()
547 .numerator()
548 .ofBaseUnits(baseUnitMagnitude() * conversionFactor.baseUnitMagnitude());
549 }
550
558 default Dimensionless timesInverse(
559 Measure<? extends PerUnit<DimensionlessUnit, ? extends U>> multiplier) {
560 return Value.ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
561 }
562
571 default <Other extends Unit> Measure<Other> timesRatio(
572 Measure<? extends PerUnit<? extends Other, U>> ratio) {
573 return ImmutableMeasure.ofBaseUnits(
574 baseUnitMagnitude() * ratio.baseUnitMagnitude(), ratio.unit().numerator());
575 }
576
583 Measure<U> div(double divisor);
584
591 Measure<U> div(Dimensionless divisor);
592
600 default Measure<?> div(Measure<?> divisor) {
601 final double baseUnitResult = baseUnitMagnitude() / divisor.baseUnitMagnitude();
602
603 if (unit().getBaseUnit().equals(divisor.unit().getBaseUnit())) {
604 // These are the same unit, return a dimensionless
605 return Value.ofBaseUnits(baseUnitResult);
606 }
607
608 if (divisor instanceof Dimensionless) {
609 // Dividing by a dimensionless, do a scalar division
610 return unit().ofBaseUnits(baseUnitResult);
611 }
612
613 // Numerator is a dimensionless
614 if (unit() instanceof DimensionlessUnit && divisor.unit() instanceof PerUnit<?, ?> ratio) {
615 // Dividing by a ratio, return its reciprocal scaled by this
616 return ratio.reciprocal().ofBaseUnits(baseUnitResult);
617 }
618
619 if (divisor.unit() instanceof PerUnit<?, ?> ratio
620 && ratio.numerator().getBaseUnit().equals(baseUnit())) {
621 // Numerator of the ratio cancels out
622 // N / (N / D) -> N * D / N -> D
623 // Note: all Velocity and Acceleration units inherit from PerUnit
624 return ratio.denominator().ofBaseUnits(baseUnitResult);
625 }
626
627 if (divisor.unit() instanceof TimeUnit time) {
628 // Dividing by a time, return a Velocity
629 return VelocityUnit.combine(unit(), time).ofBaseUnits(baseUnitResult);
630 }
631
632 return switch (divisor) {
633 case Acceleration<?> acceleration -> div(acceleration);
634 case Angle angle -> div(angle);
635 case AngularAcceleration angularAcceleration -> div(angularAcceleration);
636 case AngularMomentum angularMomentum -> div(angularMomentum);
637 case AngularVelocity angularVelocity -> div(angularVelocity);
638 case Current current -> div(current);
639 // n.b. this case should already be covered
640 case Dimensionless dimensionless -> div(dimensionless);
641 case Distance distance -> div(distance);
642 case Energy energy -> div(energy);
643 case Force force -> div(force);
644 case Frequency frequency -> div(frequency);
645 case LinearAcceleration linearAcceleration -> div(linearAcceleration);
646 case LinearVelocity linearVelocity -> div(linearVelocity);
647 case Mass mass -> div(mass);
648 case MomentOfInertia momentOfInertia -> div(momentOfInertia);
649 case Mult<?, ?> mult -> div(mult);
650 case Per<?, ?> per -> div(per);
651 case Power power -> div(power);
652 case Temperature temperature -> div(temperature);
653 case Time time -> div(time);
654 case Torque torque -> div(torque);
655 case Velocity<?> velocity -> div(velocity);
656 case Voltage voltage -> div(voltage);
657 case Resistance resistance -> div(resistance);
658 // Dimensional analysis fallthrough or a generic input measure type
659 // Do a basic unit multiplication
660 default -> PerUnit.combine(unit(), divisor.unit()).ofBaseUnits(baseUnitResult);
661 };
662 }
663
671 default Measure<?> div(Acceleration<?> divisor) {
672 return PerUnit.combine(unit(), divisor.unit())
673 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
674 }
675
682 default Measure<?> div(Angle divisor) {
683 return PerUnit.combine(unit(), divisor.unit())
684 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
685 }
686
694 default Measure<?> div(AngularAcceleration divisor) {
695 return PerUnit.combine(unit(), divisor.unit())
696 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
697 }
698
706 default Measure<?> div(AngularMomentum divisor) {
707 return PerUnit.combine(unit(), divisor.unit())
708 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
709 }
710
718 default Measure<?> div(AngularVelocity divisor) {
719 return PerUnit.combine(unit(), divisor.unit())
720 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
721 }
722
730 default Measure<?> div(Current divisor) {
731 return PerUnit.combine(unit(), divisor.unit())
732 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
733 }
734
741 default Measure<?> div(Distance divisor) {
742 return PerUnit.combine(unit(), divisor.unit())
743 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
744 }
745
752 default Measure<?> div(Energy divisor) {
753 return PerUnit.combine(unit(), divisor.unit())
754 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
755 }
756
763 default Measure<?> div(Force divisor) {
764 return PerUnit.combine(unit(), divisor.unit())
765 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
766 }
767
774 default Measure<?> div(Frequency divisor) {
775 return PerUnit.combine(unit(), divisor.unit())
776 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
777 }
778
786 default Measure<?> div(LinearAcceleration divisor) {
787 return PerUnit.combine(unit(), divisor.unit())
788 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
789 }
790
797 default Measure<?> div(LinearMomentum divisor) {
798 return PerUnit.combine(unit(), divisor.unit())
799 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
800 }
801
808 default Measure<?> div(LinearVelocity divisor) {
809 return PerUnit.combine(unit(), divisor.unit())
810 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
811 }
812
819 default Measure<?> div(Mass divisor) {
820 return PerUnit.combine(unit(), divisor.unit())
821 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
822 }
823
831 default Measure<?> div(MomentOfInertia divisor) {
832 return PerUnit.combine(unit(), divisor.unit())
833 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
834 }
835
843 default Measure<?> div(Mult<?, ?> divisor) {
844 return PerUnit.combine(unit(), divisor.unit())
845 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
846 }
847
854 default Measure<?> div(Power divisor) {
855 return PerUnit.combine(unit(), divisor.unit())
856 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
857 }
858
865 default Measure<?> div(Per<?, ?> divisor) {
866 return PerUnit.combine(unit(), divisor.unit())
867 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
868 }
869
876 default Measure<?> div(Temperature divisor) {
877 return PerUnit.combine(unit(), divisor.unit())
878 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
879 }
880
889 default Measure<?> div(Time divisor) {
890 return VelocityUnit.combine(unit(), divisor.unit())
891 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
892 }
893
900 default Measure<?> div(Torque divisor) {
901 return PerUnit.combine(unit(), divisor.unit())
902 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
903 }
904
911 default Measure<?> div(Velocity<?> divisor) {
912 return PerUnit.combine(unit(), divisor.unit())
913 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
914 }
915
922 default Measure<?> div(Voltage divisor) {
923 return PerUnit.combine(unit(), divisor.unit())
924 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
925 }
926
933 default Measure<?> div(Resistance divisor) {
934 return PerUnit.combine(unit(), divisor.unit())
935 .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
936 }
937
945 default Measure<?> per(AccelerationUnit<?> divisorUnit) {
946 return div(divisorUnit.one());
947 }
948
956 default Measure<?> per(AngleUnit divisorUnit) {
957 return div(divisorUnit.one());
958 }
959
968 return div(divisorUnit.one());
969 }
970
978 default Measure<?> per(AngularMomentumUnit divisorUnit) {
979 return div(divisorUnit.one());
980 }
981
989 default Measure<?> per(AngularVelocityUnit divisorUnit) {
990 return div(divisorUnit.one());
991 }
992
1000 default Measure<?> per(CurrentUnit divisorUnit) {
1001 return div(divisorUnit.one());
1002 }
1003
1011 default Measure<?> per(DistanceUnit divisorUnit) {
1012 return div(divisorUnit.one());
1013 }
1014
1022 default Measure<?> per(EnergyUnit divisorUnit) {
1023 return div(divisorUnit.one());
1024 }
1025
1033 default Measure<?> per(ForceUnit divisorUnit) {
1034 return div(divisorUnit.one());
1035 }
1036
1044 default Measure<?> per(FrequencyUnit divisorUnit) {
1045 return div(divisorUnit.one());
1046 }
1047
1056 return div(divisorUnit.one());
1057 }
1058
1066 default Measure<?> per(LinearMomentumUnit divisorUnit) {
1067 return div(divisorUnit.one());
1068 }
1069
1077 default Measure<?> per(LinearVelocityUnit divisorUnit) {
1078 return div(divisorUnit.one());
1079 }
1080
1088 default Measure<?> per(MassUnit divisorUnit) {
1089 return div(divisorUnit.one());
1090 }
1091
1099 default Measure<?> per(MomentOfInertiaUnit divisorUnit) {
1100 return div(divisorUnit.one());
1101 }
1102
1110 default Measure<?> per(MultUnit<?, ?> divisorUnit) {
1111 return div(divisorUnit.one());
1112 }
1113
1121 default Measure<?> per(PowerUnit divisorUnit) {
1122 return div(divisorUnit.one());
1123 }
1124
1132 default Measure<?> per(PerUnit<?, ?> divisorUnit) {
1133 return div(divisorUnit.one());
1134 }
1135
1143 default Measure<?> per(TemperatureUnit divisorUnit) {
1144 return div(divisorUnit.one());
1145 }
1146
1154 default Measure<?> per(TimeUnit period) {
1155 return div(period.of(1));
1156 }
1157
1165 default Measure<?> per(TorqueUnit divisorUnit) {
1166 return div(divisorUnit.one());
1167 }
1168
1176 default Measure<?> per(VelocityUnit<?> divisorUnit) {
1177 return div(divisorUnit.one());
1178 }
1179
1187 default Measure<?> per(VoltageUnit divisorUnit) {
1188 return div(divisorUnit.one());
1189 }
1190
1198 default Measure<?> per(ResistanceUnit divisorUnit) {
1199 return div(divisorUnit.one());
1200 }
1201
1210 // eg Dimensionless / (Dimensionless / Time) -> Time
1211 default <Other extends Unit> Measure<Other> divideRatio(
1212 Measure<? extends PerUnit<? extends U, Other>> divisor) {
1213 return ImmutableMeasure.ofBaseUnits(
1214 baseUnitMagnitude() / divisor.baseUnitMagnitude(), divisor.unit().denominator());
1215 }
1216
1232 default boolean isNear(Measure<?> other, double varianceThreshold) {
1233 if (!this.unit().getBaseUnit().equivalent(other.unit().getBaseUnit())) {
1234 return false; // Disjoint units, not compatible
1235 }
1236
1237 // abs so negative inputs are calculated correctly
1238 var tolerance = Math.abs(other.baseUnitMagnitude() * varianceThreshold);
1239
1240 return Math.abs(this.baseUnitMagnitude() - other.baseUnitMagnitude()) <= tolerance;
1241 }
1242
1257 default boolean isNear(Measure<U> other, Measure<U> tolerance) {
1258 return Math.abs(this.baseUnitMagnitude() - other.baseUnitMagnitude())
1259 <= Math.abs(tolerance.baseUnitMagnitude());
1260 }
1261
1268 default boolean isEquivalent(Measure<?> other) {
1269 // Return false for disjoint units that aren't compatible
1270 return this.unit().getBaseUnit().equals(other.unit().getBaseUnit())
1271 && Math.abs(baseUnitMagnitude() - other.baseUnitMagnitude()) <= EQUIVALENCE_THRESHOLD;
1272 }
1273
1275 @Override
1276 default int compareTo(Measure<U> o) {
1277 return Double.compare(this.baseUnitMagnitude(), o.baseUnitMagnitude());
1278 }
1279
1286 default boolean gt(Measure<U> o) {
1287 return compareTo(o) > 0;
1288 }
1289
1296 default boolean gte(Measure<U> o) {
1297 return compareTo(o) > 0 || isEquivalent(o);
1298 }
1299
1306 default boolean lt(Measure<U> o) {
1307 return compareTo(o) < 0;
1308 }
1309
1316 default boolean lte(Measure<U> o) {
1317 return compareTo(o) < 0 || isEquivalent(o);
1318 }
1319
1328 @SafeVarargs
1329 static <U extends Unit, T extends Measure<U>> T max(T... measures) {
1330 if (measures.length == 0) {
1331 return null; // nothing to compare
1332 }
1333
1334 T max = null;
1335 for (T measure : measures) {
1336 if (max == null || measure.gt(max)) {
1337 max = measure;
1338 }
1339 }
1340
1341 return max;
1342 }
1343
1352 @SafeVarargs
1353 static <U extends Unit, T extends Measure<U>> T min(T... measures) {
1354 if (measures.length == 0) {
1355 return null; // nothing to compare
1356 }
1357
1358 T max = null;
1359 for (T measure : measures) {
1360 if (max == null || measure.lt(max)) {
1361 max = measure;
1362 }
1363 }
1364
1365 return max;
1366 }
1367
1375 default String toShortString() {
1376 // eg 1.234e+04 V/m (1234 Volt per Meter in long form)
1377 return String.format("%.3e %s", magnitude(), unit().symbol());
1378 }
1379
1387 default String toLongString() {
1388 // eg 1234 Volt per Meter (1.234e+04 V/m in short form)
1389 return String.format("%s %s", magnitude(), unit().name());
1390 }
1391}
Measure<? extends MultUnit< A, B > > one()
static< A extends Unit, B extends Unit > MultUnit< A, B > combine(A a, B b)
Definition MultUnit.java:86
static< N extends Unit, D extends Unit > PerUnit< N, D > combine(N numerator, D denominator)
Definition PerUnit.java:93
Measure<? extends PerUnit< N, D > > one()
Definition PerUnit.java:218
Time of(double magnitude)
Definition TimeUnit.java:77
static< D extends Unit > VelocityUnit< D > combine(D unit, TimeUnit period)
default Measure<?> per(VoltageUnit divisorUnit)
default Measure<?> div(Mass divisor)
Definition Measure.java:819
Measure< U > times(Dimensionless multiplier)
default Measure<?> div(AngularAcceleration divisor)
Definition Measure.java:694
default Measure<?> per(PowerUnit divisorUnit)
default boolean lte(Measure< U > o)
default Measure<?> per(TemperatureUnit divisorUnit)
default Measure<?> per(TorqueUnit divisorUnit)
default Measure<?> div(Angle divisor)
Definition Measure.java:682
default Measure<?> times(LinearMomentum multiplier)
Definition Measure.java:380
default double copySign(Measure< U > other, U unit)
Definition Measure.java:118
default Measure<?> times(Distance multiplier)
Definition Measure.java:319
default Measure<?> div(AngularMomentum divisor)
Definition Measure.java:706
default Measure<?> per(FrequencyUnit divisorUnit)
static< U extends Unit, T extends Measure< U > > T max(T... measures)
default Measure<?> div(Current divisor)
Definition Measure.java:730
default< Other extends Unit > Measure< Other > divideRatio(Measure<? extends PerUnit<? extends U, Other > > divisor)
default Measure<?> per(AngleUnit divisorUnit)
Definition Measure.java:956
default Measure<?> times(Measure<?> multiplier)
Definition Measure.java:174
default< Other extends Unit > Measure< Other > timesRatio(Measure<? extends PerUnit<? extends Other, U > > ratio)
Definition Measure.java:571
default Measure<?> times(Current multiplier)
Definition Measure.java:307
default Measure<?> div(Resistance divisor)
Definition Measure.java:933
default Measure<?> div(LinearAcceleration divisor)
Definition Measure.java:786
default Measure<?> times(AngularVelocity multiplier)
Definition Measure.java:295
default double in(U unit)
Definition Measure.java:82
default Measure<?> div(Distance divisor)
Definition Measure.java:741
default String toShortString()
default Measure<?> times(Velocity<?> multiplier)
Definition Measure.java:500
default Measure<?> per(LinearVelocityUnit divisorUnit)
default Measure<?> times(Time multiplier)
Definition Measure.java:476
Measure< U > plus(Measure<? extends U > other)
default Measure<?> times(MomentOfInertia multiplier)
Definition Measure.java:416
Measure< U > unaryMinus()
Measure< U > minus(Measure<? extends U > other)
default Measure<?> per(CurrentUnit divisorUnit)
default Measure<?> per(LinearAccelerationUnit divisorUnit)
default Measure<?> times(Temperature multiplier)
Definition Measure.java:464
default Measure<?> per(AngularMomentumUnit divisorUnit)
Definition Measure.java:978
default Measure<?> per(AccelerationUnit<?> divisorUnit)
Definition Measure.java:945
default Measure<?> div(Measure<?> divisor)
Definition Measure.java:600
default Measure<?> times(Per<?, ?> multiplier)
Definition Measure.java:452
default Measure<?> per(MomentOfInertiaUnit divisorUnit)
default Measure<?> per(EnergyUnit divisorUnit)
default Measure<?> times(Mass multiplier)
Definition Measure.java:404
default Measure<?> times(Power multiplier)
Definition Measure.java:440
default Measure<?> div(Per<?, ?> divisor)
Definition Measure.java:865
Measure< U > div(double divisor)
default Measure<?> per(LinearMomentumUnit divisorUnit)
default Measure<?> div(Power divisor)
Definition Measure.java:854
default Measure<?> times(Torque multiplier)
Definition Measure.java:488
default Dimensionless timesInverse(Measure<? extends PerUnit< DimensionlessUnit, ? extends U > > multiplier)
Definition Measure.java:558
Measure< U > times(double multiplier)
default Measure<?> per(ResistanceUnit divisorUnit)
default Measure<?> div(Voltage divisor)
Definition Measure.java:922
default boolean gt(Measure< U > o)
default Measure<?> per(MultUnit<?, ?> divisorUnit)
static< U extends Unit, T extends Measure< U > > T min(T... measures)
default Measure<?> times(Angle multiplier)
Definition Measure.java:259
default Measure<?> div(Frequency divisor)
Definition Measure.java:774
default Measure<?> per(ForceUnit divisorUnit)
default Measure<?> div(Torque divisor)
Definition Measure.java:900
default Measure<?> times(LinearVelocity multiplier)
Definition Measure.java:392
default Measure<?> per(PerUnit<?, ?> divisorUnit)
default double abs(U unit)
Definition Measure.java:107
default< Other extends Unit, M extends Measure< Other > > M timesConversionFactor(Measure<? extends PerUnit< Other, U > > conversionFactor)
Definition Measure.java:541
default boolean isNear(Measure<?> other, double varianceThreshold)
default Measure<?> div(Energy divisor)
Definition Measure.java:752
default Measure<?> times(Resistance multiplier)
Definition Measure.java:524
default Measure<?> div(Mult<?, ?> divisor)
Definition Measure.java:843
default Measure<?> per(MassUnit divisorUnit)
default boolean gte(Measure< U > o)
default Measure<?> div(Temperature divisor)
Definition Measure.java:876
default Measure<?> div(Acceleration<?> divisor)
Definition Measure.java:671
default Measure<?> per(VelocityUnit<?> divisorUnit)
default Measure<?> div(Time divisor)
Definition Measure.java:889
default Measure<?> times(Voltage multiplier)
Definition Measure.java:512
default Measure<?> div(LinearVelocity divisor)
Definition Measure.java:808
default Measure<?> times(AngularMomentum multiplier)
Definition Measure.java:283
default Measure<?> div(AngularVelocity divisor)
Definition Measure.java:718
default Measure<?> div(LinearMomentum divisor)
Definition Measure.java:797
default String toLongString()
default Measure<?> times(Energy multiplier)
Definition Measure.java:331
default Measure<?> per(DistanceUnit divisorUnit)
default Measure<?> times(AngularAcceleration multiplier)
Definition Measure.java:271
default Measure<?> div(MomentOfInertia divisor)
Definition Measure.java:831
default Measure<?> times(Frequency multiplier)
Definition Measure.java:356
default Measure<?> times(Mult<?, ?> multiplier)
Definition Measure.java:428
default boolean isNear(Measure< U > other, Measure< U > tolerance)
default Measure<?> times(LinearAcceleration multiplier)
Definition Measure.java:368
Measure< U > div(Dimensionless divisor)
default Measure<?> times(Force multiplier)
Definition Measure.java:343
default Measure<?> times(Acceleration<?> multiplier)
Definition Measure.java:247
default Measure<?> per(TimeUnit period)
default Measure<?> per(AngularAccelerationUnit divisorUnit)
Definition Measure.java:967
default Measure<?> div(Velocity<?> divisor)
Definition Measure.java:911
default boolean isEquivalent(Measure<?> other)
default int compareTo(Measure< U > o)
default Measure<?> div(Force divisor)
Definition Measure.java:763
default boolean lt(Measure< U > o)
default Measure<?> per(AngularVelocityUnit divisorUnit)
Definition Measure.java:989