package com.revolsys.geometry.cs.projection; import javax.measure.converter.UnitConverter; import javax.measure.unit.Unit; public class UnitConverstionOperation implements CoordinatesOperation { private int axisCount = 0; private final UnitConverter converter; private final Unit sourceUnit; private final Unit targetUnit; public UnitConverstionOperation(final Unit sourceUnit, final Unit targetUnit) { this.sourceUnit = sourceUnit; this.targetUnit = targetUnit; this.converter = sourceUnit.getConverterTo(targetUnit); } public UnitConverstionOperation(final Unit sourceUnit, final Unit targetUnit, final int axisCount) { this.sourceUnit = sourceUnit; this.targetUnit = targetUnit; this.axisCount = axisCount; this.converter = sourceUnit.getConverterTo(targetUnit); } @Override public void perform(final int sourceAxisCount, final double[] sourceCoordinates, final int targetAxisCount, final double[] targetCoordinates) { final int numPoints = sourceCoordinates.length / sourceAxisCount; final int axisCount = this.axisCount; final UnitConverter converter = this.converter; for (int vertexIndex = 0; vertexIndex < numPoints; vertexIndex++) { for (int axisIndex = 0; axisIndex < targetAxisCount; axisIndex++) { double value; if (axisIndex < sourceAxisCount) { value = sourceCoordinates[vertexIndex * sourceAxisCount + axisIndex]; if (axisIndex < axisCount) { value = converter.convert(value); } } else { value = Double.NaN; } targetCoordinates[vertexIndex * sourceAxisCount + axisIndex] = value; } } } @Override public String toString() { return this.sourceUnit + "->" + this.targetUnit; } }