/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.draw2d.geometry;

/**
 * Provides support for transformations of scaling, translation and rotation.
 */
public class Transform {

	private double scaleX = 1.0, scaleY = 1.0, dx, dy, cos = 1.0, sin;

	/**
	 * Sets the value for the amount of scaling to be done along both axes.
	 * 
	 * @param scale
	 *            Scale factor
	 * @since 2.0
	 */
	public void setScale(double scale) {
		scaleX = scaleY = scale;
	}

	/**
	 * Sets the value for the amount of scaling to be done along X and Y axes
	 * individually.
	 * 
	 * @param x
	 *            Amount of scaling on X axis
	 * @param y
	 *            Amount of scaling on Y axis
	 * @since 2.0
	 */
	public void setScale(double x, double y) {
		scaleX = x;
		scaleY = y;
	}

	/**
	 * Sets the rotation angle.
	 * 
	 * @param angle
	 *            Angle of rotation
	 * @since 2.0
	 */
	public void setRotation(double angle) {
		cos = Math.cos(angle);
		sin = Math.sin(angle);
	}

	/**
	 * Sets the translation amounts for both axes.
	 * 
	 * @param x
	 *            Amount of shift on X axis
	 * @param y
	 *            Amount of shift on Y axis
	 * @since 2.0
	 */
	public void setTranslation(double x, double y) {
		dx = x;
		dy = y;
	}

	/**
	 * Returns a new transformed Point of the input Point based on the
	 * transformation values set.
	 * 
	 * @param p
	 *            Point being transformed
	 * @return The transformed Point
	 * @since 2.0
	 */
	public Point getTransformed(Point p) {
		double x = p.x;
		double y = p.y;
		double temp;
		x *= scaleX;
		y *= scaleY;

		temp = x * cos - y * sin;
		y = x * sin + y * cos;
		x = temp;
		return new Point(Math.round(x + dx), Math.round(y + dy));
	}

}
