+void Map2f(double u, double v, const double *corners, double *x, double *y)
+{
+ *x = u * (corners[2] - corners[0]) + v * (corners[4] - corners[2]) + corners[0];
+ *y = u * (corners[3] - corners[1]) + v * (corners[5] - corners[3]) + corners[1];
+}
+
+void Unmap3f(double x, double y, double z, const double *corners, double *u, double *v)
+{
+ //*x = corners[0] + u * (corners[3] - corners[0]) + v * (corners[6] - corners[3]);
+ //*y = corners[1] + u * (corners[4] - corners[1]) + v * (corners[7] - corners[4]);
+ //*z = corners[2] + u * (corners[5] - corners[2]) + v * (corners[8] - corners[5]);
+ // THREE equations, TWO would be better! Let's simply use the two "better" ones
+
+ double xc0 = x - corners[0];
+ double yc1 = y - corners[1];
+ double zc2 = z - corners[2];
+ double c30 = corners[3] - corners[0];
+ double c41 = corners[4] - corners[1];
+ double c52 = corners[5] - corners[2];
+ double c63 = corners[6] - corners[3];
+ double c74 = corners[7] - corners[4];
+ double c85 = corners[8] - corners[5];
+
+ double det_x = c41 * c85 - c52 * c74;
+ double det_y = c30 * c85 - c52 * c63;
+ double det_z = c30 * c74 - c41 * c63;
+
+ if(fabs(det_x) >= fabs(det_y) && fabs(det_x) >= fabs(det_z))
+ {
+ double du = yc1 * c85 - zc2 * c74;
+ double dv = c41 * zc2 - c52 * yc1;
+ *u = du / det_x;
+ *v = dv / det_x;
+ }
+ else if(fabs(det_y) >= fabs(det_z))
+ {
+ double du = xc0 * c85 - zc2 * c63;
+ double dv = c30 * zc2 - c52 * xc0;
+ *u = du / det_y;
+ *v = dv / det_y;
+ }
+ else
+ {
+ double du = xc0 * c74 - yc1 * c63;
+ double dv = c30 * yc1 - c41 * xc0;
+ *u = du / det_z;
+ *v = dv / det_z;
+ }
+}
+