15 #include <grass/config.h> 
   16 #include <grass/imagery.h> 
   19 static int floating_exception;
 
   20 static void catch(
int);
 
   21 static double determinant(
double, 
double,
 
   22                           double, 
double, 
double, 
double, 
double, 
double,
 
   53                                double E12[3], 
double N12[3], 
double E21[3],
 
   56     RETSIGTYPE(*sigfpe) (
int);
 
   57     double s0, s1, s2, s3, s4, s5;
 
   63     s0 = s1 = s2 = s3 = s4 = s5 = 0.0;
 
   64     for (i = 0; i < cp->count; i++) {
 
   65         if (cp->status[i] <= 0)
 
   70         s3 += cp->e1[i] * cp->e1[i];
 
   71         s4 += cp->e1[i] * cp->n1[i];
 
   72         s5 += cp->n1[i] * cp->n1[i];
 
   77     floating_exception = 0;
 
   78     sigfpe = 
signal(SIGFPE, 
catch);
 
   82     for (i = 0; i < cp->count; i++) {
 
   83         if (cp->status[i] <= 0)
 
   86         x1 += cp->e1[i] * cp->e2[i];
 
   87         x2 += cp->n1[i] * cp->e2[i];
 
   90     det = determinant(s0, s1, s2, s1, s3, s4, s2, s4, s5);
 
   95     E12[0] = determinant(x0, s1, s2, x1, s3, s4, x2, s4, s5) / det;
 
   96     E12[1] = determinant(s0, x0, s2, s1, x1, s4, s2, x2, s5) / det;
 
   97     E12[2] = determinant(s0, s1, x0, s1, s3, x1, s2, s4, x2) / det;
 
  101     for (i = 0; i < cp->count; i++) {
 
  102         if (cp->status[i] <= 0)
 
  105         x1 += cp->e1[i] * cp->n2[i];
 
  106         x2 += cp->n1[i] * cp->n2[i];
 
  109     det = determinant(s0, s1, s2, s1, s3, s4, s2, s4, s5);
 
  114     N12[0] = determinant(x0, s1, s2, x1, s3, s4, x2, s4, s5) / det;
 
  115     N12[1] = determinant(s0, x0, s2, s1, x1, s4, s2, x2, s5) / det;
 
  116     N12[2] = determinant(s0, s1, x0, s1, s3, x1, s2, s4, x2) / det;
 
  120     s0 = s1 = s2 = s3 = s4 = s5 = 0.0;
 
  121     for (i = 0; i < cp->count; i++) {
 
  122         if (cp->status[i] <= 0)
 
  127         s3 += cp->e2[i] * cp->e2[i];
 
  128         s4 += cp->e2[i] * cp->n2[i];
 
  129         s5 += cp->n2[i] * cp->n2[i];
 
  134     for (i = 0; i < cp->count; i++) {
 
  135         if (cp->status[i] <= 0)
 
  138         x1 += cp->e2[i] * cp->e1[i];
 
  139         x2 += cp->n2[i] * cp->e1[i];
 
  142     det = determinant(s0, s1, s2, s1, s3, s4, s2, s4, s5);
 
  147     E21[0] = determinant(x0, s1, s2, x1, s3, s4, x2, s4, s5) / det;
 
  148     E21[1] = determinant(s0, x0, s2, s1, x1, s4, s2, x2, s5) / det;
 
  149     E21[2] = determinant(s0, s1, x0, s1, s3, x1, s2, s4, x2) / det;
 
  153     for (i = 0; i < cp->count; i++) {
 
  154         if (cp->status[i] <= 0)
 
  157         x1 += cp->e2[i] * cp->n1[i];
 
  158         x2 += cp->n2[i] * cp->n1[i];
 
  161     det = determinant(s0, s1, s2, s1, s3, s4, s2, s4, s5);
 
  166     N21[0] = determinant(x0, s1, s2, x1, s3, s4, x2, s4, s5) / det;
 
  167     N21[1] = determinant(s0, x0, s2, s1, x1, s4, s2, x2, s5) / det;
 
  168     N21[2] = determinant(s0, s1, x0, s1, s3, x1, s2, s4, x2) / det;
 
  171     return floating_exception ? -1 : 1;
 
  174 static double determinant(
double a, 
double b, 
double c, 
double d, 
double e,
 
  175                           double f, 
double g, 
double h, 
double i)
 
  182     return a * (e * i - f * 
h) - b * (d * i - f * g) + c * (d * h - e * 
g);
 
  185 static void catch(
int n)
 
  187     floating_exception = 1;
 
  192              double *e2, 
double *n2, 
double E[3], 
double N[3])
 
  194     *e2 = E[0] + E[1] * e1 + E[2] * n1;
 
  195     *n2 = N[0] + N[1] * e1 + N[2] * n1;
 
int I_georef(double e1, double n1, double *e2, double *n2, double E[3], double N[3])
int I_compute_georef_equations(struct Control_Points *cp, double E12[3], double N12[3], double E21[3], double N21[3])
tuple h
panel.defaultSize = wx.CheckBox(panel, id = wx.ID_ANY, label = _("Use default size")) panel...