GRASS Programmer's Manual  6.4.2(2012)
GS_util.c
Go to the documentation of this file.
00001 
00019 #include <stdlib.h>
00020 #include <math.h>
00021 #include <string.h>
00022 
00023 #include <grass/gis.h>
00024 #include <grass/gstypes.h>
00025 
00055 double GS_geodistance(double *from, double *to, const char *units)
00056 {
00057     double meters;
00058 
00059     meters = Gs_distance(from, to);
00060 
00061     if (!units) {
00062         return (meters);
00063     }
00064 
00065     if (strcmp(units, "meters") == 0) {
00066         return (meters);
00067     }
00068 
00069     if (strcmp(units, "miles") == 0) {
00070         return (meters * .0006213712);
00071     }
00072 
00073     if (strcmp(units, "kilometers") == 0) {
00074         return (meters * .001);
00075     }
00076 
00077     if (strcmp(units, "feet") == 0) {
00078         return (meters * 3.280840);
00079     }
00080 
00081     if (strcmp(units, "yards") == 0) {
00082         return (meters * 1.093613);
00083     }
00084 
00085     if (strcmp(units, "rods") == 0) {
00086         return (meters * .1988388);
00087     }
00088 
00089     if (strcmp(units, "inches") == 0) {
00090         return (meters * 39.37008);
00091     }
00092 
00093     if (strcmp(units, "centimeters") == 0) {
00094         return (meters * 100.0);
00095     }
00096 
00097     if (strcmp(units, "millimeters") == 0) {
00098         return (meters * 1000.0);
00099     }
00100 
00101     if (strcmp(units, "micron") == 0) {
00102         return (meters * 1000000.0);
00103     }
00104 
00105     if (strcmp(units, "nanometers") == 0) {
00106         return (meters * 1000000000.0);
00107     }
00108 
00109     if (strcmp(units, "cubits") == 0) {
00110         return (meters * 2.187227);
00111     }
00112 
00113     if (strcmp(units, "hands") == 0) {
00114         return (meters * 9.842520);
00115     }
00116 
00117     if (strcmp(units, "furlongs") == 0) {
00118         return (meters * .004970970);
00119     }
00120 
00121     if (strcmp(units, "nmiles") == 0) {
00122         /* nautical miles */
00123         return (meters * .0005399568);
00124     }
00125 
00126     if (strcmp(units, "chains") == 0) {
00127         return (meters * .0497097);
00128     }
00129 
00130     return (meters);
00131 }
00132 
00141 float GS_distance(float *from, float *to)
00142 {
00143     float x, y, z;
00144 
00145     x = from[X] - to[X];
00146     y = from[Y] - to[Y];
00147     z = from[Z] - to[Z];
00148 
00149     return (float)sqrt(x * x + y * y + z * z);
00150 }
00151 
00160 float GS_P2distance(float *from, float *to)
00161 {
00162     float x, y;
00163 
00164     x = from[X] - to[X];
00165     y = from[Y] - to[Y];
00166 
00167     return (float)sqrt(x * x + y * y);
00168 }
00169 
00178 void GS_v3eq(float *v1, float *v2)
00179 {
00180     v1[X] = v2[X];
00181     v1[Y] = v2[Y];
00182     v1[Z] = v2[Z];
00183 
00184     return;
00185 }
00186 
00195 void GS_v3add(float *v1, float *v2)
00196 {
00197     v1[X] += v2[X];
00198     v1[Y] += v2[Y];
00199     v1[Z] += v2[Z];
00200 
00201     return;
00202 }
00203 
00212 void GS_v3sub(float *v1, float *v2)
00213 {
00214     v1[X] -= v2[X];
00215     v1[Y] -= v2[Y];
00216     v1[Z] -= v2[Z];
00217 
00218     return;
00219 }
00220 
00229 void GS_v3mult(float *v1, float k)
00230 {
00231     v1[X] *= k;
00232     v1[Y] *= k;
00233     v1[Z] *= k;
00234 
00235     return;
00236 }
00237 
00246 int GS_v3norm(float *v1)
00247 {
00248     float n;
00249 
00250     n = sqrt(v1[X] * v1[X] + v1[Y] * v1[Y] + v1[Z] * v1[Z]);
00251 
00252     if (n == 0.0) {
00253         return (0);
00254     }
00255 
00256     v1[X] /= n;
00257     v1[Y] /= n;
00258     v1[Z] /= n;
00259 
00260     return (1);
00261 }
00262 
00271 int GS_v2norm(float *v1)
00272 {
00273     float n;
00274 
00275     n = sqrt(v1[X] * v1[X] + v1[Y] * v1[Y]);
00276 
00277     if (n == 0.0) {
00278         return (0);
00279     }
00280 
00281     v1[X] /= n;
00282     v1[Y] /= n;
00283 
00284     return (1);
00285 }
00286 
00295 int GS_dv3norm(double *dv1)
00296 {
00297     double n;
00298 
00299     n = sqrt(dv1[X] * dv1[X] + dv1[Y] * dv1[Y] + dv1[Z] * dv1[Z]);
00300 
00301     if (n == 0.0) {
00302         return (0);
00303     }
00304 
00305     dv1[X] /= n;
00306     dv1[Y] /= n;
00307     dv1[Z] /= n;
00308 
00309     return (1);
00310 }
00311 
00312 
00322 int GS_v3normalize(float *v1, float *v2)
00323 {
00324     float n, dx, dy, dz;
00325 
00326     dx = v2[X] - v1[X];
00327     dy = v2[Y] - v1[Y];
00328     dz = v2[Z] - v1[Z];
00329     n = sqrt(dx * dx + dy * dy + dz * dz);
00330 
00331     if (n == 0.0) {
00332         return (0);
00333     }
00334 
00335     v2[X] = v1[X] + dx / n;
00336     v2[Y] = v1[Y] + dy / n;
00337     v2[Z] = v1[Z] + dz / n;
00338 
00339     return (1);
00340 }
00341 
00342 
00353 int GS_v3dir(float *v1, float *v2, float *v3)
00354 {
00355     float n, dx, dy, dz;
00356 
00357     dx = v2[X] - v1[X];
00358     dy = v2[Y] - v1[Y];
00359     dz = v2[Z] - v1[Z];
00360     n = sqrt(dx * dx + dy * dy + dz * dz);
00361 
00362     if (n == 0.0) {
00363         v3[X] = v3[Y] = v3[Z] = 0.0;
00364         return (0);
00365     }
00366 
00367     v3[X] = dx / n;
00368     v3[Y] = dy / n;
00369     v3[Z] = dz / n;
00370 
00371     return (1);
00372 }
00373 
00374 
00385 void GS_v2dir(float *v1, float *v2, float *v3)
00386 {
00387     float n, dx, dy;
00388 
00389     dx = v2[X] - v1[X];
00390     dy = v2[Y] - v1[Y];
00391     n = sqrt(dx * dx + dy * dy);
00392 
00393     v3[X] = dx / n;
00394     v3[Y] = dy / n;
00395 
00396     return;
00397 }
00398 
00406 void GS_v3cross(float *v1, float *v2, float *v3)
00407 {
00408     v3[X] = (v1[Y] * v2[Z]) - (v1[Z] * v2[Y]);
00409     v3[Y] = (v1[Z] * v2[X]) - (v1[X] * v2[Z]);
00410     v3[Z] = (v1[X] * v2[Y]) - (v1[Y] * v2[X]);
00411 
00412     return;
00413 }
00414 
00421 void GS_v3mag(float *v1, float *mag)
00422 {
00423     *mag = sqrt(v1[X] * v1[X] + v1[Y] * v1[Y] + v1[Z] * v1[Z]);
00424 
00425     return;
00426 }
00427 
00443 int GS_coordpair_repeats(float *p1, float *p2, int nhist)
00444 {
00445     static float *entrys = NULL;
00446     static int next = 0;
00447     static int len = 0;
00448     int i;
00449 
00450     if (nhist) {
00451         if (entrys) {
00452             G_free(entrys);
00453         }
00454 
00455         entrys = (float *)G_malloc(4 * nhist * sizeof(float));
00456 
00457         if (!entrys)
00458             return (-1);
00459 
00460         len = nhist;
00461         next = 0;
00462     }
00463 
00464     if (!len) {
00465         return (-2);
00466     }
00467 
00468     for (i = 0; i < next; i += 4) {
00469         if (entrys[i] == p1[0] && entrys[i + 1] == p1[1]
00470             && entrys[i + 2] == p2[0] && entrys[i + 3] == p2[1]) {
00471             return (1);
00472         }
00473     }
00474 
00475     if (len == next / 4) {
00476         next = 0;
00477     }
00478 
00479     entrys[next] = p1[0];
00480     entrys[next + 1] = p1[1];
00481     entrys[next + 2] = p2[0];
00482     entrys[next + 3] = p2[1];
00483     next += 4;
00484 
00485     return (0);
00486 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines