public static <T extends GeoTuple2D_F64> T mult( DMatrixRMaj M, T pt, T mod ) {
    """
	<p>
	Computes mod =  M*pt, where both pt and mod are in homogeneous coordinates with z assumed to be
	equal to 1, and M is a 3x3 matrix.
	</p>
	<p>
	'pt' and 'mod' can be the same point.
	</p>
	@param M  3x3 matrix
	@param pt Homogeneous point with z=1
	@param mod Storage for the computation.  If null a new point is declared.  Can be same instance as pt.
	@return Result of computation.
    """
		if( M.numRows != 3 || M.numCols != 3 )
			throw new IllegalArgumentException( "Input matrix must be 3 by 3, not " + M.numRows + " " + M.numCols );

		if( mod == null ) {
			throw new IllegalArgumentException( "Must provide an instance in mod" );
		}

		double x = pt.x;
		double y = pt.y;

		double modz = (double) ( M.unsafe_get( 2, 0 ) * x + M.unsafe_get(2, 1) * y + M.unsafe_get(2, 2) );

		mod.x = (double) ( ( M.unsafe_get(0, 0) * x + M.unsafe_get(0, 1) * y + M.unsafe_get(0, 2) ) / modz );
		mod.y = (double) ( ( M.unsafe_get(1, 0) * x + M.unsafe_get(1, 1) * y + M.unsafe_get(1, 2) ) / modz );

		return mod;
	}
public static <T extends GeoTuple2D_F64> T mult( DMatrixRMaj M, T pt, T mod ) {
		if( M.numRows != 3 || M.numCols != 3 )
			throw new IllegalArgumentException( "Input matrix must be 3 by 3, not " + M.numRows + " " + M.numCols );

		if( mod == null ) {
			throw new IllegalArgumentException( "Must provide an instance in mod" );
		}

		double x = pt.x;
		double y = pt.y;

		double modz = (double) ( M.unsafe_get( 2, 0 ) * x + M.unsafe_get(2, 1) * y + M.unsafe_get(2, 2) );

		mod.x = (double) ( ( M.unsafe_get(0, 0) * x + M.unsafe_get(0, 1) * y + M.unsafe_get(0, 2) ) / modz );
		mod.y = (double) ( ( M.unsafe_get(1, 0) * x + M.unsafe_get(1, 1) * y + M.unsafe_get(1, 2) ) / modz );

		return mod;
	}
public static < T extends GeoTuple2D_F64 > T mult ( DMatrixRMaj M , T pt , T mod ) { if ( M . numRows != 3 || M . numCols != 3 ) throw new IllegalArgumentException ( "Input matrix must be 3 by 3, not " + M . numRows + " " + M . numCols ) ; if ( mod == null ) { throw new IllegalArgumentException ( "Must provide an instance in mod" ) ; } double x = pt . x ; double y = pt . y ; double modz = ( double ) ( M . unsafe_get ( 2 , 0 ) * x + M . unsafe_get ( 2 , 1 ) * y + M . unsafe_get ( 2 , 2 ) ) ; mod . x = ( double ) ( ( M . unsafe_get ( 0 , 0 ) * x + M . unsafe_get ( 0 , 1 ) * y + M . unsafe_get ( 0 , 2 ) ) / modz ) ; mod . y = ( double ) ( ( M . unsafe_get ( 1 , 0 ) * x + M . unsafe_get ( 1 , 1 ) * y + M . unsafe_get ( 1 , 2 ) ) / modz ) ; return mod ; }
<p>
Computes mod =  M*pt, where both pt and mod are in homogeneous coordinates with z assumed to be
equal to 1, and M is a 3x3 matrix.
</p>
<p>
'pt' and 'mod' can be the same point.
</p>
@param M  3x3 matrix
@param pt Homogeneous point with z=1
@param mod Storage for the computation.  If null a new point is declared.  Can be same instance as pt.
@return Result of computation.
<p > Computes mod = M * pt where both pt and mod are in homogeneous coordinates with z assumed to be equal to 1 and M is a 3x3 matrix . < / p > <p > pt and mod can be the same point . < / p >