package ddddbb.comb;
import ddddbb.math.Point;
public class DSignedAxis {
public static final DSignedAxis PD1 = new DSignedAxis(1);
public static final DSignedAxis PD2 = new DSignedAxis(2);
public static final DSignedAxis PD3 = new DSignedAxis(3);
public static final DSignedAxis PD4 = new DSignedAxis(4);
public static final DSignedAxis MD1 = new DSignedAxis(-1);
public static final DSignedAxis MD2 = new DSignedAxis(-2);
public static final DSignedAxis MD3 = new DSignedAxis(-3);
public static final DSignedAxis MD4 = new DSignedAxis(-4);
boolean pos;
int axis; // -1 means diffuse direction
/** 1,2,3,4,... are the positive axes
* -1,-2,-3,-4,... are the negative axes
* 0 is not allowed as value
*/
public DSignedAxis(int i) {
if (i==0) { pos = true; axis = -1; }
if (i>0) { pos = true; axis = i-1; }
if (i<0) { pos = false; axis = -i-1; }
}
/**
* zoSign==1 indicates a positive axis, zoSign==0 negative
* _axis is one of 0,1,2,3,4,...
*/
public DSignedAxis(int zoSign,int _axis) {
assert zoSign==0 || zoSign==1 ;
assert _axis >= -1;
if (zoSign==0) { pos = false; }
if (zoSign==1) { pos = true; }
axis = _axis;
}
/**
* _pos indicates whether the axis is positive
* _axis is one of 0,1,2,3,4, ...
* @param _axis
*/
public DSignedAxis(boolean _pos,int _axis) {
pos = _pos;
axis = _axis;
}
/**
* Makes a negative axis from a positive one and vice versa.
*/
public void invert() {
pos = ! pos;
}
/**
* Returns the axis as a number 0,1,2,...
*/
public int axis() {
return axis;
}
/** returns 1 for a positive axis and -1 for a negative axis */
public int pmSign() {
if (pos) { return +1; }
return -1;
}
/* returns 1 for a positive axis and 0 for a negative axis */
public int zoSign() {
if (pos) { return 1; }
return 0;
}
/** returns the axis as values 1,2,3,... or -1,-2,-3, ... */
public int human() {
if (pos) { return axis+1; }
return -(axis+1);
}
public static boolean equal(DSignedAxis v,DSignedAxis w) {
return (v.pos == w.pos) && (v.axis == w.axis);
}
public boolean equals(Object a) {
return equal(this,(DSignedAxis)a);
}
/** returns the unit vector of this axis in dim dimensions */
public int[] unitVector(int dim) {
int[] res = new int[dim];
for (int i=0;i<dim;i++) { res[i] = 0; }
if (pos) { res[axis] = 1; }
else { res[axis] = -1; }
return res;
}
/** returns this axis as Point */
public Point direc(int dim) {
double x[] = new double[dim];
for (int i=0;i<dim;i++) { x[i] = 0; }
if (pos) { x[axis] = 1; }
else { x[axis] = -1; }
return Point.create(x);
}
}