libgimpmath: add various GimpMatrix4 functions
Add gimp_matrix4_{identity,mult,transform_point}().
This commit is contained in:
@ -38,7 +38,10 @@ gimp_matrix3_is_identity
|
|||||||
gimp_matrix3_is_diagonal
|
gimp_matrix3_is_diagonal
|
||||||
gimp_matrix3_is_affine
|
gimp_matrix3_is_affine
|
||||||
gimp_matrix3_is_simple
|
gimp_matrix3_is_simple
|
||||||
|
gimp_matrix4_identity
|
||||||
|
gimp_matrix4_mult
|
||||||
gimp_matrix4_to_deg
|
gimp_matrix4_to_deg
|
||||||
|
gimp_matrix4_transform_point
|
||||||
GIMP_TYPE_MATRIX2
|
GIMP_TYPE_MATRIX2
|
||||||
GIMP_TYPE_PARAM_MATRIX2
|
GIMP_TYPE_PARAM_MATRIX2
|
||||||
GIMP_IS_PARAM_SPEC_MATRIX2
|
GIMP_IS_PARAM_SPEC_MATRIX2
|
||||||
|
@ -885,6 +885,50 @@ gimp_matrix3_is_simple (const GimpMatrix3 *matrix)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gimp_matrix4_identity:
|
||||||
|
* @matrix: A matrix.
|
||||||
|
*
|
||||||
|
* Sets the matrix to the identity matrix.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gimp_matrix4_identity (GimpMatrix4 *matrix)
|
||||||
|
{
|
||||||
|
gint i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < 4; j++)
|
||||||
|
matrix->coeff[i][j] = i == j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gimp_matrix4_mult:
|
||||||
|
* @matrix1: The first input matrix.
|
||||||
|
* @matrix2: The second input matrix which will be overwritten by the result.
|
||||||
|
*
|
||||||
|
* Multiplies two matrices and puts the result into the second one.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gimp_matrix4_mult (const GimpMatrix4 *matrix1,
|
||||||
|
GimpMatrix4 *matrix2)
|
||||||
|
{
|
||||||
|
GimpMatrix4 result = {};
|
||||||
|
gint i, j, k;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
for (k = 0; k < 4; k++)
|
||||||
|
result.coeff[i][j] += matrix1->coeff[i][k] * matrix2->coeff[k][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*matrix2 = result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gimp_matrix4_to_deg:
|
* gimp_matrix4_to_deg:
|
||||||
* @matrix:
|
* @matrix:
|
||||||
@ -904,3 +948,50 @@ gimp_matrix4_to_deg (const GimpMatrix4 *matrix,
|
|||||||
*b = 180 * (asin (matrix->coeff[2][0]) / G_PI_2);
|
*b = 180 * (asin (matrix->coeff[2][0]) / G_PI_2);
|
||||||
*c = 180 * (asin (matrix->coeff[2][1]) / G_PI_2);
|
*c = 180 * (asin (matrix->coeff[2][1]) / G_PI_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gimp_matrix4_transform_point:
|
||||||
|
* @matrix: The transformation matrix.
|
||||||
|
* @x: The source X coordinate.
|
||||||
|
* @y: The source Y coordinate.
|
||||||
|
* @z: The source Z coordinate.
|
||||||
|
* @newx: The transformed X coordinate.
|
||||||
|
* @newy: The transformed Y coordinate.
|
||||||
|
* @newz: The transformed Z coordinate.
|
||||||
|
*
|
||||||
|
* Transforms a point in 3D as specified by the transformation matrix.
|
||||||
|
*/
|
||||||
|
gdouble
|
||||||
|
gimp_matrix4_transform_point (const GimpMatrix4 *matrix,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y,
|
||||||
|
gdouble z,
|
||||||
|
gdouble *newx,
|
||||||
|
gdouble *newy,
|
||||||
|
gdouble *newz)
|
||||||
|
{
|
||||||
|
gdouble neww;
|
||||||
|
|
||||||
|
*newx = matrix->coeff[0][0] * x +
|
||||||
|
matrix->coeff[0][1] * y +
|
||||||
|
matrix->coeff[0][2] * z +
|
||||||
|
matrix->coeff[0][3];
|
||||||
|
*newy = matrix->coeff[1][0] * x +
|
||||||
|
matrix->coeff[1][1] * y +
|
||||||
|
matrix->coeff[1][2] * z +
|
||||||
|
matrix->coeff[1][3];
|
||||||
|
*newz = matrix->coeff[2][0] * x +
|
||||||
|
matrix->coeff[2][1] * y +
|
||||||
|
matrix->coeff[2][2] * z +
|
||||||
|
matrix->coeff[2][3];
|
||||||
|
neww = matrix->coeff[3][0] * x +
|
||||||
|
matrix->coeff[3][1] * y +
|
||||||
|
matrix->coeff[3][2] * z +
|
||||||
|
matrix->coeff[3][3];
|
||||||
|
|
||||||
|
*newx /= neww;
|
||||||
|
*newy /= neww;
|
||||||
|
*newz /= neww;
|
||||||
|
|
||||||
|
return neww;
|
||||||
|
}
|
||||||
|
@ -131,11 +131,23 @@ void gimp_matrix3_transform_point (const GimpMatrix3 *matrix,
|
|||||||
/* GimpMatrix4 */
|
/* GimpMatrix4 */
|
||||||
/*****************/
|
/*****************/
|
||||||
|
|
||||||
|
void gimp_matrix4_identity (GimpMatrix4 *matrix);
|
||||||
|
void gimp_matrix4_mult (const GimpMatrix4 *matrix1,
|
||||||
|
GimpMatrix4 *matrix2);
|
||||||
|
|
||||||
void gimp_matrix4_to_deg (const GimpMatrix4 *matrix,
|
void gimp_matrix4_to_deg (const GimpMatrix4 *matrix,
|
||||||
gdouble *a,
|
gdouble *a,
|
||||||
gdouble *b,
|
gdouble *b,
|
||||||
gdouble *c);
|
gdouble *c);
|
||||||
|
|
||||||
|
gdouble gimp_matrix4_transform_point (const GimpMatrix4 *matrix,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y,
|
||||||
|
gdouble z,
|
||||||
|
gdouble *newx,
|
||||||
|
gdouble *newy,
|
||||||
|
gdouble *newz);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user