@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; }