GRASS Programmer's Manual
6.4.2(2012)
|
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 }