package org.myrobotlab.math; import java.io.Serializable; import org.myrobotlab.logging.LoggerFactory; import org.myrobotlab.service.Servo; import org.slf4j.Logger; public final class Mapper implements Serializable { private static final long serialVersionUID = 1L; public final static Logger log = LoggerFactory.getLogger(Servo.class); // input range Double minX; Double maxX; // output range Double minY; Double maxY; // clipping Double minOutput; Double maxOutput; boolean inverted = false; public Mapper(double minX, double maxX, double minY, double maxY) { this.minX = minX; this.maxX = maxX; this.minY = minY; this.maxY = maxY; if (minY < maxY) { this.minOutput = minY; this.maxOutput = maxY; } else { this.minOutput = maxY; this.maxOutput = minY; } } final public double calc(double in) { double c = minY + ((in - minX) * (maxY - minY)) / (maxX - minX); if (c < minOutput) { log.warn("clipping {} to {}", c, minOutput); return minOutput; } if (c > maxOutput) { log.warn("clipping {} to {}", c, maxOutput); return maxOutput; } return c; } final public int calcInt(int in) { return (int) calc(in); } final public int calcInt(double in) { return (int) calc(in); } public Double getMaxX() { return maxX; } public Double getMaxY() { return maxY; } public Double getMinX() { return minX; } public Double getMinY() { return minY; } public boolean isInverted() { return inverted; } public void setInverted(boolean invert) { if (invert && !inverted) { double t = minX; minX = maxX; maxX = t; inverted = true; } else { inverted = false; } } public void setMax(double max) { maxOutput = max; //maxX = max; } public void setMin(double min) { minOutput = min; } public double getMinOutput() { return minOutput; } public double getMaxOutput() { return maxOutput; } }