#define Det(a, b, c, d) ((a)*(d) - (b)*(c)) int square_to_quad(float quad[4][2], float sq[3][3]) { register float px, py, dx1, dx2, dy1, dy2; dx1 = quad[1][0] - quad[2][0]; dx2 = quad[3][0] - quad[2][0]; dy1 = quad[1][1] - quad[2][1]; dy2 = quad[3][1] - quad[2][1]; det = Det(dx1, dx2, dy1, dy2); if (det == 0) return 0; /* bad mapping */ px = quad[0][0] - quad[1][0] + quad[2][0] - quad[3][0]; py = quad[0][1] - quad[1][1] + quad[2][1] - quad[3][1]; sq[0][2] = Det(px, dx2, py, dy2)/det; sq[1][2] = Det(dx1, px, dy1, py)/det; sq[2][2] = 1.; sq[0][0] = quad[1][0] - quad[0][0] + sq[0][2]*quad[1][0]; sq[1][0] = quad[3][0] - quad[0][0] + sq[1][2]*quad[3][0]; sq[2][0] = quad[0][0]; sq[0][1] = quad[1][1] - quad[0][1] + sq[0][2]*quad[1][1]; sq[1][1] = quad[3][1] - quad[0][1] + sq[1][2]*quad[3][1]; sq[2][1] = quad[0][1]; return 1; /* mapping successful */ }