package org.singinst.uf.math; import org.singinst.uf.presenter.LineBounds; public class LinearTransform extends InvertableFunction { private final double scale; private final double offset; public LinearTransform(LineBounds from, LineBounds to) { scale = to.getLength() / from.getLength(); offset = to.getFirst() - scale * from.getFirst(); assert apply(from.getFirst()) == to.getFirst(); assert apply(from.getSecond()) == to.getSecond(); } @Override public final double apply(double x) { return scale * x + offset; } @Override public double invert(double y) { return (y - offset) / scale; } }