Point.java

package org.microcol.gui;

import org.microcol.gui.panelview.GamePanelView;
import org.microcol.model.Location;

import com.google.common.base.MoreObjects;

/**
 * Represents point in on-screen coordinates.
 */
public class Point {

	/**
	 * Minimal x value.
	 */
	public final static int MAP_MIN_X = 1;

	/**
	 * Minimal y value.
	 */
	public final static int MAP_MIN_Y = 1;

	/**
	 * On screen X coordinate.
	 */
	private final int x;

	/**
	 * On screen Y coordinate.
	 */
	private final int y;

	private Point(final int x, final int y) {
		this.x = x;
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	@Override
	public int hashCode() {
		return x + (y << 16);
	}

	@Override
	public boolean equals(final Object object) {
		if (object == null) {
			return false;
		}

		if (!(object instanceof Point)) {
			return false;
		}

		final Point location = (Point) object;

		return x == location.x && y == location.y;
	}

	@Override
	public String toString() {
		return MoreObjects.toStringHelper(this).add("x", x).add("y", y).toString();
	}

	public Location toLocation() {
		final Point p = divide(GamePanelView.TOTAL_TILE_WIDTH_IN_PX).add(MAP_MIN_X, MAP_MIN_Y);
		return Location.of(p.getX(), p.getY());
	}

	public static Point of(final int x, final int y) {
		return new Point(x, y);
	}

	public static Point of(final Location location) {
		return Point.of(location.getX(), location.getY()).multiply(GamePanelView.TOTAL_TILE_WIDTH_IN_PX);
	}

	public Point add(final int addX, final int addY) {
		return new Point(x + addX, y + addY);
	}

	public Point add(final Point point) {
		return new Point(x + point.getX(), y + point.getY());
	}

	public Point substract(final Point p) {
		return new Point(x - p.x, y - p.y);
	}

	public Point multiply(final int factor) {
		return new Point(x * factor, y * factor);
	}

	public Point divide(final double factor) {
		return new Point((int) (x / factor), (int) (y / factor));
	}
}