package ddddbb.math;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import ddddbb.gen.BoolModel;
import ddddbb.gen.Model;
public abstract class Camera extends Model {
protected abstract void rotate(double ph, Point a, Point b, Point c);
protected abstract void translate(Point axis,double d);
public Point[] v;
/** k>=0 */
private Point selectDirec(int k, boolean cameraCoordinates) {
if (cameraCoordinates) {
return v[k].clone();
}
else {
double[] x = new double[v.length];
for (int i=0;i<v.length;i++) {
if (i==k) x[i] = 1;
else x[i] = 0;
}
return Point.create(x);
}
}
/** a1>0, a2>0 */
public void rot(double ph, int a1, int a2, Point center, boolean cameraCoordinates) {
assert a1>0 && a2>0;
//System.out.println("called rotate on " + this);
rotate(ph,selectDirec(a1-1,cameraCoordinates),selectDirec(a2-1,cameraCoordinates),center);
}
public ActionListener rotAction(final int a1, final int a2, final Point center, final BoolModel cameraCoordinates) {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
rot(AOP.deg,a1,a2,center,cameraCoordinates.isSelected());
}
};
}
/** axis != 0 */
public void trans(int axis, double d, boolean cameraCoordinates) {
assert axis != 0;
if (axis>0) translate(selectDirec(axis-1,cameraCoordinates),d);
if (axis<0) translate(selectDirec(-axis-1,cameraCoordinates),-d);
}
public ActionListener transAction(final int axis, final BoolModel cameraCoordinates) {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
trans(axis,0.1,cameraCoordinates.isSelected());
}
};
}
}