@Override
public Point2d transform(Matrix transform) {
double xt, yt, zt;
if (transform.getRowDimension() == 3) {
xt = transform.get(0, 0) * getX() + transform.get(0, 1) * getY()
+ transform.get(0, 2);
yt = transform.get(1, 0) * getX() + transform.get(1, 1) * getY()
+ transform.get(1, 2);
zt = transform.get(2, 0) * getX() + transform.get(2, 1) * getY()
+ transform.get(2, 2);
xt /= zt;
yt /= zt;
} else if (transform.getRowDimension() == 2 && transform.getColumnDimension() == 2) {
xt = transform.get(0, 0) * getX() + transform.get(0, 1) * getY();
yt = transform.get(1, 0) * getX() + transform.get(1, 1) * getY();
} else if (transform.getRowDimension() == 2 && transform.getColumnDimension() == 3) {
xt = transform.get(0, 0) * getX() + transform.get(0, 1) * getY() + transform.get(0, 2);
yt = transform.get(1, 0) * getX() + transform.get(1, 1) * getY() + transform.get(1, 2);
} else {
throw new IllegalArgumentException("Transform matrix has unexpected size");
}
final Point2d cpy = copy();
cpy.setOrdinate(0, xt);
cpy.setOrdinate(1, yt);
return cpy;
}