/*
* Copyright (C) 2010 Markus Echterhoff <tam@edu.uni-klu.ac.at>
*
* This file is part of EvoPaint.
*
* EvoPaint is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EvoPaint. If not, see <http://www.gnu.org/licenses/>.
*/
package evopaint.util.mapping;
import evopaint.interfaces.IRandomNumberGenerator;
import java.io.Serializable;
/**
*
* @author Markus Echterhoff <tam@edu.uni-klu.ac.at>
*/
public class RelativeCoordinate extends Coordinate implements Serializable {
private static final int TYPE_SELF = 0;
private static final int TYPE_NORTH = 1;
private static final int TYPE_NORTH_EAST = 2;
private static final int TYPE_EAST = 3;
private static final int TYPE_SOUTH_EAST = 4;
private static final int TYPE_SOUTH = 5;
private static final int TYPE_SOUTH_WEST = 6;
private static final int TYPE_WEST = 7;
private static final int TYPE_NORTH_WEST = 8;
public static final RelativeCoordinate CENTER = new RelativeCoordinate(TYPE_SELF);
public static final RelativeCoordinate NORTH = new RelativeCoordinate(TYPE_NORTH);
public static final RelativeCoordinate NORTH_EAST = new RelativeCoordinate(TYPE_NORTH_EAST);
public static final RelativeCoordinate EAST = new RelativeCoordinate(TYPE_EAST);
public static final RelativeCoordinate SOUTH_EAST = new RelativeCoordinate(TYPE_SOUTH_EAST);
public static final RelativeCoordinate SOUTH = new RelativeCoordinate(TYPE_SOUTH);
public static final RelativeCoordinate SOUTH_WEST = new RelativeCoordinate(TYPE_SOUTH_WEST);
public static final RelativeCoordinate WEST = new RelativeCoordinate(TYPE_WEST);
public static final RelativeCoordinate NORTH_WEST = new RelativeCoordinate(TYPE_NORTH_WEST);
private int type;
@Override
public String toString() {
switch (x) {
case -1: switch(y) {
case -1: return "NW";
case 0: return "W";
case 1: return "SW";
} break;
case 0: switch(y) {
case -1: return "N";
case 0: return "me";
case 1: return "S";
} break;
case 1: switch(y) {
case -1: return "NE";
case 0: return "E";
case 1: return "SE";
} break;
}
assert(false);
return null;
}
// preserve singleton through serialization
public Object readResolve() {
switch (type) {
case TYPE_SELF: return RelativeCoordinate.CENTER;
case TYPE_NORTH: return RelativeCoordinate.NORTH;
case TYPE_NORTH_EAST: return RelativeCoordinate.NORTH_EAST;
case TYPE_EAST: return RelativeCoordinate.EAST;
case TYPE_SOUTH_EAST: return RelativeCoordinate.SOUTH_EAST;
case TYPE_SOUTH: return RelativeCoordinate.SOUTH;
case TYPE_SOUTH_WEST: return RelativeCoordinate.SOUTH_WEST;
case TYPE_WEST: return RelativeCoordinate.WEST;
case TYPE_NORTH_WEST: return RelativeCoordinate.NORTH_WEST;
default: assert(false);
}
return null;
}
public static RelativeCoordinate getRandom(IRandomNumberGenerator rng) {
int rnd = rng.nextPositiveInt(9);
switch (rnd) {
case TYPE_SELF: return RelativeCoordinate.CENTER;
case TYPE_NORTH: return RelativeCoordinate.NORTH;
case TYPE_NORTH_EAST: return RelativeCoordinate.NORTH_EAST;
case TYPE_EAST: return RelativeCoordinate.EAST;
case TYPE_SOUTH_EAST: return RelativeCoordinate.SOUTH_EAST;
case TYPE_SOUTH: return RelativeCoordinate.SOUTH;
case TYPE_SOUTH_WEST: return RelativeCoordinate.SOUTH_WEST;
case TYPE_WEST: return RelativeCoordinate.WEST;
case TYPE_NORTH_WEST: return RelativeCoordinate.NORTH_WEST;
default: assert(false);
}
return null;
}
private RelativeCoordinate(int type) {
super(0, 0);
this.type = type;
switch (type) {
case TYPE_SELF: x = 0; y = 0; break;
case TYPE_NORTH: x = 0; y = -1; break;
case TYPE_NORTH_EAST: x = 1; y = -1; break;
case TYPE_EAST: x = 1; y = 0; break;
case TYPE_SOUTH_EAST: x = 1; y = 1; break;
case TYPE_SOUTH: x = 0; y = 1; break;
case TYPE_SOUTH_WEST: x = -1; y = 1; break;
case TYPE_WEST: x = -1; y = 0; break;
case TYPE_NORTH_WEST: x = -1; y = -1; break;
default: assert(false);
}
}
}