/* * ViewTransform.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ 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; } }