/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.pepsoft.worldpainter; import java.awt.Point; import java.awt.Rectangle; import javax.vecmath.Point3i; import org.pepsoft.minecraft.Direction; /** * * @author pepijn */ public abstract class CoordinateTransform { public abstract Point transform(int x, int y); public abstract Point3i transform(int x, int y, int z); public abstract Point transform(Point coords); public abstract Point3i transform(Point3i coords); public abstract void transformInPlace(Point coords); public abstract void transformInPlace(Point3i coords); public Rectangle transform(Rectangle rectangle) { Point corner1 = rectangle.getLocation(); Point corner2 = new Point(rectangle.x + rectangle.width - 1, rectangle.y + rectangle.height - 1); transformInPlace(corner1); transformInPlace(corner2); return new Rectangle(Math.min(corner1.x, corner2.x), Math.min(corner1.y, corner2.y), Math.abs(corner2.x - corner1.x) + 1, Math.abs(corner2.y - corner1.y) + 1); } public abstract Direction transform(Direction direction); public abstract Direction inverseTransform(Direction direction); public abstract float transform(float angle); public static final CoordinateTransform ROTATE_CLOCKWISE_90_DEGREES = new CoordinateTransform() { @Override public Point transform(int x, int y) { return new Point(-y - 1, x); } @Override public Point3i transform(int x, int y, int z) { return new Point3i(-y - 1, x, z); } @Override public Point transform(Point coords) { return new Point(-coords.y - 1, coords.x); } @Override public Point3i transform(Point3i coords) { return new Point3i(-coords.y - 1, coords.x, coords.z); } @Override public void transformInPlace(Point coords) { int tmp = coords.x; coords.x = -coords.y - 1; coords.y = tmp; } @Override public void transformInPlace(Point3i coords) { int tmp = coords.x; coords.x = -coords.y - 1; coords.y = tmp; } @Override public Direction transform(Direction direction) { return direction.right(); } @Override public Direction inverseTransform(Direction direction) { return direction.left(); } @Override public float transform(float angle) { angle = angle - HALF_PI; while (angle < 0) { angle += TWO_PI; } return angle; } private static final float HALF_PI = (float) (Math.PI / 2); private static final float TWO_PI = (float) (Math.PI * 2); }; public static final CoordinateTransform ROTATE_180_DEGREES = new CoordinateTransform() { @Override public Point transform(int x, int y) { return new Point(-x - 1, -y - 1); } @Override public Point3i transform(int x, int y, int z) { return new Point3i(-x - 1, -y - 1, z); } @Override public Point transform(Point coords) { return new Point(-coords.x - 1, -coords.y - 1); } @Override public Point3i transform(Point3i coords) { return new Point3i(-coords.x - 1, -coords.y - 1, coords.z); } @Override public void transformInPlace(Point coords) { coords.x = -coords.x - 1; coords.y = -coords.y - 1; } @Override public void transformInPlace(Point3i coords) { coords.x = -coords.x - 1; coords.y = -coords.y - 1; } @Override public Direction transform(Direction direction) { return direction.opposite(); } @Override public Direction inverseTransform(Direction direction) { return direction.opposite(); } @Override public float transform(float angle) { angle = angle + PI; while (angle >= TWO_PI) { angle -= TWO_PI; } return angle; } private static final float PI = (float) Math.PI; private static final float TWO_PI = (float) (Math.PI * 2); }; public static final CoordinateTransform ROTATE_CLOCKWISE_270_DEGREES = new CoordinateTransform() { @Override public Point transform(int x, int y) { return new Point(y, -x - 1); } @Override public Point3i transform(int x, int y, int z) { return new Point3i(y, -x - 1, z); } @Override public Point transform(Point coords) { return new Point(coords.y, -coords.x - 1); } @Override public Point3i transform(Point3i coords) { return new Point3i(coords.y, -coords.x - 1, coords.z); } @Override public void transformInPlace(Point coords) { int tmp = -coords.x - 1; coords.x = coords.y; coords.y = tmp; } @Override public void transformInPlace(Point3i coords) { int tmp = -coords.x - 1; coords.x = coords.y; coords.y = tmp; } @Override public Direction transform(Direction direction) { return direction.left(); } @Override public Direction inverseTransform(Direction direction) { return direction.right(); } @Override public float transform(float angle) { angle = angle + HALF_PI; while (angle >= TWO_PI) { angle -= TWO_PI; } return angle; } private static final float HALF_PI = (float) (Math.PI / 2); private static final float TWO_PI = (float) (Math.PI * 2); }; }