libgimpmath: add various GimpMatrix2 functions

Add gimp_matrix2_{determinant,invert,transform_point}().
This commit is contained in:
Ell 2020-01-06 16:10:32 +02:00
parent c0552de62b
commit edfc837e7d
3 changed files with 72 additions and 0 deletions

View File

@ -20,6 +20,9 @@ GimpMatrix3
GimpMatrix4
gimp_matrix2_identity
gimp_matrix2_mult
gimp_matrix2_determinant
gimp_matrix2_invert
gimp_matrix2_transform_point
gimp_matrix3_identity
gimp_matrix3_mult
gimp_matrix3_translate

View File

@ -244,6 +244,66 @@ gimp_matrix2_mult (const GimpMatrix2 *matrix1,
*matrix2 = tmp;
}
/**
* gimp_matrix2_determinant:
* @matrix: The input matrix.
*
* Calculates the determinant of the given matrix.
*
* Returns: The determinant.
*/
gdouble
gimp_matrix2_determinant (const GimpMatrix2 *matrix)
{
return matrix->coeff[0][0] * matrix->coeff[1][1] -
matrix->coeff[0][1] * matrix->coeff[1][0];
}
/**
* gimp_matrix2_invert:
* @matrix: The matrix that is to be inverted.
*
* Inverts the given matrix.
*/
void
gimp_matrix2_invert (GimpMatrix2 *matrix)
{
gdouble det = gimp_matrix2_determinant (matrix);
gdouble temp;
if (fabs (det) <= EPSILON)
return;
temp = matrix->coeff[0][0];
matrix->coeff[0][0] = matrix->coeff[1][1] / det;
matrix->coeff[0][1] /= -det;
matrix->coeff[1][0] /= -det;
matrix->coeff[1][1] = temp / det;
}
/**
* gimp_matrix2_transform_point:
* @matrix: The transformation matrix.
* @x: The source X coordinate.
* @y: The source Y coordinate.
* @newx: The transformed X coordinate.
* @newy: The transformed Y coordinate.
*
* Transforms a point in 2D as specified by the transformation matrix.
*/
void
gimp_matrix2_transform_point (const GimpMatrix2 *matrix,
gdouble x,
gdouble y,
gdouble *newx,
gdouble *newy)
{
*newx = matrix->coeff[0][0] * x + matrix->coeff[0][1] * y;
*newy = matrix->coeff[1][0] * x + matrix->coeff[1][1] * y;
}
static GimpMatrix3 * matrix3_copy (const GimpMatrix3 *matrix);

View File

@ -57,6 +57,15 @@ void gimp_matrix2_identity (GimpMatrix2 *matrix);
void gimp_matrix2_mult (const GimpMatrix2 *matrix1,
GimpMatrix2 *matrix2);
gdouble gimp_matrix2_determinant (const GimpMatrix2 *matrix);
void gimp_matrix2_invert (GimpMatrix2 *matrix);
void gimp_matrix2_transform_point (const GimpMatrix2 *matrix,
gdouble x,
gdouble y,
gdouble *newx,
gdouble *newy);
/*****************/
/* GimpMatrix3 */