-
-
-
-
-
-
-
-void AffineUnit::calculate_matrix(
- double in_x1, double in_y1, double in_x2, double in_y2,
- double out_x1, double out_y1, double out_x2, double out_y2,
- double out_x3, double out_y3, double out_x4, double out_y4,
- AffineMatrix *result)
-{
- AffineMatrix matrix;
- double scalex;
- double scaley;
-
- scalex = scaley = 1.0;
-
- if( (in_x2 - in_x1) > 0 )
- scalex = 1.0 / (double)(in_x2 - in_x1);
-
- if( (in_y2 - in_y1) > 0 )
- scaley = 1.0 / (double)(in_y2 - in_y1);
-
-/* Determine the perspective transform that maps from
- * the unit cube to the transformed coordinates
- */
- double dx1, dx2, dx3, dy1, dy2, dy3;
- double det1, det2;
-
- dx1 = out_x2 - out_x4;
- dx2 = out_x3 - out_x4;
- dx3 = out_x1 - out_x2 + out_x4 - out_x3;
-
- dy1 = out_y2 - out_y4;
- dy2 = out_y3 - out_y4;
- dy3 = out_y1 - out_y2 + out_y4 - out_y3;
-// printf("AffineUnit::calculate_matrix %f %f %f %f %f %f\n",
-// dx1, dx2, dx3, dy1, dy2, dy3 );
-
-/* Is the mapping affine? */
- if((dx3 == 0.0) && (dy3 == 0.0)) {
- matrix.values[0][0] = out_x2 - out_x1;
- matrix.values[0][1] = out_x4 - out_x2;
- matrix.values[0][2] = out_x1;
- matrix.values[1][0] = out_y2 - out_y1;
- matrix.values[1][1] = out_y4 - out_y2;
- matrix.values[1][2] = out_y1;
- matrix.values[2][0] = 0.0;
- matrix.values[2][1] = 0.0;
- }
- else {
- det1 = dx3 * dy2 - dy3 * dx2;
- det2 = dx1 * dy2 - dy1 * dx2;
- matrix.values[2][0] = det1 / det2;
- det1 = dx1 * dy3 - dy1 * dx3;
- det2 = dx1 * dy2 - dy1 * dx2;
- matrix.values[2][1] = det1 / det2;
-
- matrix.values[0][0] = out_x2 - out_x1 + matrix.values[2][0] * out_x2;
- matrix.values[0][1] = out_x3 - out_x1 + matrix.values[2][1] * out_x3;
- matrix.values[0][2] = out_x1;
-
- matrix.values[1][0] = out_y2 - out_y1 + matrix.values[2][0] * out_y2;
- matrix.values[1][1] = out_y3 - out_y1 + matrix.values[2][1] * out_y3;
- matrix.values[1][2] = out_y1;
- }
-
- matrix.values[2][2] = 1.0;
-
-// printf("AffineUnit::calculate_matrix 1 %f %f\n", dx3, dy3);
-// matrix.dump();
-
- result->identity();
- result->translate(-in_x1, -in_y1);
- result->scale(scalex, scaley);
- matrix.multiply(result);
-// double test[3][3] =
-// { { 0.0896, 0.0, 0.0 }, { 0.0, 0.0896, 0.0 }, { -0.00126, 0.0, 1.0 } };
-// memcpy(&result->values[0][0], test, sizeof(test));
-// printf("AffineUnit::calculate_matrix 4 %p\n", result);
-// result->dump();
-}
-