public static DMatrixRMaj multCrossATransA( GeoTuple2D_F64 A , DMatrixRMaj M, DMatrixRMaj result ) {
    """
	<p>
	Computes the following:<br>
	result = cross(A)<sup>T</sup>*M<br>
	where M and result are 3x3 matrices, cross(A) is the cross product matrix of A.
	</p>
	
	@param A 2D homogenous coordinate (implicit z = 1) that is internally converted into cross product matrix.
	@param M 3x3 matrix.
	@param result Storage for results.  Can be null.
	@return Results.
    """
		if( M.numRows != 3 || M.numCols != 3 )
			throw new IllegalArgumentException( "Input matrix must be 3 by 3, not " + M.numRows + " " + M.numCols );

		if( result == null ) {
			result = new DMatrixRMaj(3,3);
		}

		double x = A.x;
		double y = A.y;

		double a11 = M.data[0]; double a12 = M.data[1]; double a13 = M.data[2];
		double a21 = M.data[3]; double a22 = M.data[4]; double a23 = M.data[5];
		double a31 = M.data[6]; double a32 = M.data[7]; double a33 = M.data[8];

		result.data[0] =  a21   - a31*y;
		result.data[1] =  a22   - a32*y;
		result.data[2] =  a23   - a33*y;
		result.data[3] = -a11   + a31*x;
		result.data[4] = -a12   + a32*x;
		result.data[5] = -a13   + a33*x;
		result.data[6] =  a11*y - a21*x;
		result.data[7] =  a12*y - a22*x;
		result.data[8] =  a13*y - a23*x;

		return result;
	}
public static DMatrixRMaj multCrossATransA( GeoTuple2D_F64 A , DMatrixRMaj M, DMatrixRMaj result ) {
		if( M.numRows != 3 || M.numCols != 3 )
			throw new IllegalArgumentException( "Input matrix must be 3 by 3, not " + M.numRows + " " + M.numCols );

		if( result == null ) {
			result = new DMatrixRMaj(3,3);
		}

		double x = A.x;
		double y = A.y;

		double a11 = M.data[0]; double a12 = M.data[1]; double a13 = M.data[2];
		double a21 = M.data[3]; double a22 = M.data[4]; double a23 = M.data[5];
		double a31 = M.data[6]; double a32 = M.data[7]; double a33 = M.data[8];

		result.data[0] =  a21   - a31*y;
		result.data[1] =  a22   - a32*y;
		result.data[2] =  a23   - a33*y;
		result.data[3] = -a11   + a31*x;
		result.data[4] = -a12   + a32*x;
		result.data[5] = -a13   + a33*x;
		result.data[6] =  a11*y - a21*x;
		result.data[7] =  a12*y - a22*x;
		result.data[8] =  a13*y - a23*x;

		return result;
	}
public static DMatrixRMaj multCrossATransA ( GeoTuple2D_F64 A , DMatrixRMaj M , DMatrixRMaj result ) { if ( M . numRows != 3 || M . numCols != 3 ) throw new IllegalArgumentException ( "Input matrix must be 3 by 3, not " + M . numRows + " " + M . numCols ) ; if ( result == null ) { result = new DMatrixRMaj ( 3 , 3 ) ; } double x = A . x ; double y = A . y ; double a11 = M . data [ 0 ] ; double a12 = M . data [ 1 ] ; double a13 = M . data [ 2 ] ; double a21 = M . data [ 3 ] ; double a22 = M . data [ 4 ] ; double a23 = M . data [ 5 ] ; double a31 = M . data [ 6 ] ; double a32 = M . data [ 7 ] ; double a33 = M . data [ 8 ] ; result . data [ 0 ] = a21 - a31 * y ; result . data [ 1 ] = a22 - a32 * y ; result . data [ 2 ] = a23 - a33 * y ; result . data [ 3 ] = - a11 + a31 * x ; result . data [ 4 ] = - a12 + a32 * x ; result . data [ 5 ] = - a13 + a33 * x ; result . data [ 6 ] = a11 * y - a21 * x ; result . data [ 7 ] = a12 * y - a22 * x ; result . data [ 8 ] = a13 * y - a23 * x ; return result ; }
<p>
Computes the following:<br>
result = cross(A)<sup>T</sup>*M<br>
where M and result are 3x3 matrices, cross(A) is the cross product matrix of A.
</p>

@param A 2D homogenous coordinate (implicit z = 1) that is internally converted into cross product matrix.
@param M 3x3 matrix.
@param result Storage for results.  Can be null.
@return Results.
<p > Computes the following : <br > result = cross ( A ) <sup > T< / sup > * M<br > where M and result are 3x3 matrices cross ( A ) is the cross product matrix of A . < / p >