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...