package com.revolsys.geometry.test.function;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.coordinates.list.CoordinatesListUtil;
import com.revolsys.geometry.model.impl.PointDoubleXY;
import com.revolsys.geometry.model.util.AffineTransformation;
import com.revolsys.geometry.model.util.AffineTransformationFactory;
public class AffineTransformationFunctions {
private static Point envelopeCentre(final Geometry g) {
return g.getBoundingBox().getCentre();
}
private static Point envelopeLowerLeft(final Geometry g) {
final BoundingBox env = g.getBoundingBox();
return new PointDoubleXY(env.getMinX(), env.getMinY());
}
public static Geometry reflectInX(final Geometry g) {
final Point centre = envelopeCentre(g);
final AffineTransformation trans = AffineTransformation.scaleInstance(1, -1, centre.getX(),
centre.getY());
return trans.transform(g);
}
public static Geometry reflectInY(final Geometry g) {
final Point centre = envelopeCentre(g);
final AffineTransformation trans = AffineTransformation.scaleInstance(-1, 1, centre.getX(),
centre.getY());
return trans.transform(g);
}
public static Geometry rotate(final Geometry g, final double angle) {
final Point centre = envelopeCentre(g);
final AffineTransformation trans = AffineTransformation.rotationInstance(angle, centre.getX(),
centre.getY());
return trans.transform(g);
}
public static Geometry rotateByPiMultiple(final Geometry g, final double multipleOfPi) {
final Point centre = envelopeCentre(g);
final AffineTransformation trans = AffineTransformation.rotationInstance(multipleOfPi * Math.PI,
centre.getX(), centre.getY());
return trans.transform(g);
}
public static Geometry scale(final Geometry g, final double scale) {
final Point centre = envelopeCentre(g);
final AffineTransformation trans = AffineTransformation.scaleInstance(scale, scale,
centre.getX(), centre.getY());
return trans.transform(g);
}
public static Geometry transformByBaseline(final Geometry g, final Geometry destBaseline) {
final BoundingBox env = g.getBoundingBox();
final Point src0 = new PointDoubleXY(env.getMinX(), env.getMinY());
final Point src1 = new PointDoubleXY(env.getMaxX(), env.getMinY());
final Point[] destPts = CoordinatesListUtil.getPointArray(destBaseline);
final Point dest0 = destPts[0];
final Point dest1 = destPts[1];
final AffineTransformation trans = AffineTransformationFactory.newFromBaseLines(src0, src1,
dest0, dest1);
return trans.transform(g);
}
public static Geometry transformByVectors(final Geometry g, final Geometry control) {
final int nControl = control.getGeometryCount();
final Point src[] = new Point[nControl];
final Point dest[] = new Point[nControl];
for (int i = 0; i < nControl; i++) {
final Geometry contComp = control.getGeometry(i);
final Point[] pts = CoordinatesListUtil.getPointArray(contComp);
src[i] = pts[0];
dest[i] = pts[1];
}
final AffineTransformation trans = AffineTransformationFactory.newFromControlVectors(src, dest);
System.out.println(trans);
return trans.transform(g);
}
public static Geometry translateCentreToOrigin(final Geometry g) {
final Point centre = envelopeCentre(g);
final AffineTransformation trans = AffineTransformation.translationInstance(-centre.getX(),
-centre.getY());
return trans.transform(g);
}
public static Geometry translateToOrigin(final Geometry g) {
final Point lowerLeft = envelopeLowerLeft(g);
final AffineTransformation trans = AffineTransformation.translationInstance(-lowerLeft.getX(),
-lowerLeft.getY());
return trans.transform(g);
}
}