package dr.geo;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
/**
* @author Alexei Drummond
*/
public class ViewTransform {
double scaleX;
double scaleY;
int width;
int height;
Point2D topLeft;
Point2D bottomRight;
AffineTransform transform;
public ViewTransform(Rectangle2D bounds, int width, int height) {
set(bounds, width, height);
}
public AffineTransform getTransform() {
return transform;
}
public Rectangle2D getViewport() {
return new Rectangle2D.Double(topLeft.getX(), topLeft.getY(),
bottomRight.getX() - topLeft.getX(), bottomRight.getY() - topLeft.getY());
}
public void set(Rectangle2D bounds, int width, int height) {
topLeft = new Point2D.Double(bounds.getMinX(), bounds.getMinY());
bottomRight = new Point2D.Double(bounds.getMaxX(), bounds.getMaxY());
this.width = width;
this.height = height;
computeScalesAndTransform();
}
public void setBounds(Rectangle2D bounds) {
topLeft = new Point2D.Double(bounds.getMinX(), bounds.getMinY());
bottomRight = new Point2D.Double(bounds.getMaxX(), bounds.getMaxY());
computeScalesAndTransform();
}
public void setSize(int width, int height) {
this.width = width;
this.height = height;
computeScalesAndTransform();
}
private void computeScalesAndTransform() {
scaleX = width / (bottomRight.getX() - topLeft.getX());
scaleY = height / (bottomRight.getY() - topLeft.getY());
transform = computeFullTransform();
}
private AffineTransform getTranslate() {
return AffineTransform.getTranslateInstance(-topLeft.getX(), -bottomRight.getY());
}
private AffineTransform getScale() {
return AffineTransform.getScaleInstance(scaleX, -scaleY);
}
private AffineTransform computeFullTransform() {
AffineTransform transform = getScale();
transform.concatenate(getTranslate());
return transform;
}
}