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; // 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; result->identity(); result->translate(-in_x1, -in_y1); result->scale(scalex, scaley); matrix.multiply(result); }
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(); }