package com.revolsys.geometry.cs; import java.io.Serializable; import javax.measure.quantity.Angle; import javax.measure.unit.NonSI; import javax.measure.unit.SI; import javax.measure.unit.Unit; public class AngularUnit implements Serializable { /** * */ private static final long serialVersionUID = -3508138430785747634L; /** * Get the angular unit representing the conversion factor from * {@link SI#RADIAN}. * * @param conversionFactor The conversion factor. * @return The angular unit. */ public static Unit<Angle> getUnit(final double conversionFactor) { return getUnit(null, conversionFactor); } /** * Get the angular unit representing the conversion factor from the specified * base angular unit. * * @param baseUnit The base unit. * @param conversionFactor The conversion factor. * @return The angular unit. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static Unit<Angle> getUnit(final Unit<Angle> baseUnit, final double conversionFactor) { Unit<Angle> unit; if (baseUnit == null) { unit = SI.RADIAN; } else { unit = baseUnit; } if (conversionFactor != 1) { unit = unit.times(conversionFactor); // Normalize the unit for (final Unit siUnit : SI.getInstance().getUnits()) { if (siUnit.equals(unit)) { return siUnit; } } for (final Unit nonSiUnit : NonSI.getInstance().getUnits()) { if (nonSiUnit.equals(unit)) { return nonSiUnit; } } } return unit; } private final Authority authority; private final AngularUnit baseUnit; private final double conversionFactor; private final boolean deprecated; private String name; private Unit<Angle> unit; public AngularUnit(final String name, final AngularUnit baseUnit, final double conversionFactor, final Authority authority) { this(name, baseUnit, conversionFactor, authority, false); } public AngularUnit(final String name, final AngularUnit baseUnit, final double conversionFactor, final Authority authority, final boolean deprecated) { this.name = name; if (name.equals("degree (supplier to define representation)")) { this.name = "degree"; } this.baseUnit = baseUnit; this.conversionFactor = conversionFactor; this.authority = authority; this.deprecated = deprecated; if (this.name.equals("degree")) { this.unit = NonSI.DEGREE_ANGLE; } else if (baseUnit == null) { this.unit = getUnit(conversionFactor); } else { this.unit = getUnit(baseUnit.getUnit(), conversionFactor); } } public AngularUnit(final String name, final double conversionFactor, final Authority authority) { this(name, null, conversionFactor, authority, false); } @Override public boolean equals(final Object object) { if (object == null) { return false; } else if (object == this) { return true; } else if (object instanceof AngularUnit) { final AngularUnit unit = (AngularUnit)object; if (!this.name.equals(unit.name)) { return false; } else if (Math.abs(this.conversionFactor - unit.conversionFactor) > 1.0e-10) { return false; } else { return true; } } else { return false; } } public Authority getAuthority() { return this.authority; } public AngularUnit getBaseUnit() { return this.baseUnit; } public double getConversionFactor() { return this.conversionFactor; } public String getName() { return this.name; } public Unit<Angle> getUnit() { return this.unit; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + this.name.hashCode(); final long temp = Double.doubleToLongBits(this.conversionFactor); result = prime * result + (int)(temp ^ temp >>> 32); return result; } public boolean isDeprecated() { return this.deprecated; } @Override public String toString() { return this.name; } }