/* Establish parameters */ int do_profile(double e1, double e2, double n1, double n2, int coords, double res, int fd, int data_type, FILE * fp, char *null_string, const char *unit, double factor) { double rows, cols, LEN; double Y, X, k; cols = e1 - e2; rows = n1 - n2; LEN = G_distance(e1, n1, e2, n2); G_message(_("Approx. transect length: %f [%s]"), LEN / factor, unit); if (!G_point_in_region(e2, n2)) G_warning(_("Endpoint coordinates are outside of current region settings")); /* Calculate Azimuth of Line */ if (rows == 0 && cols == 0) { /* Special case for no movement */ e = e1; n = n1; read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string); } k = res / hypot(rows, cols); Y = k * rows; X = k * cols; if (Y < 0) Y = Y * -1.; if (X < 0) X = X * -1.; if (e != 0.0 && (e != e1 || n != n1)) { dist -= G_distance(e, n, e1, n1); } if (rows >= 0 && cols < 0) { /* SE Quad or due east */ for (e = e1, n = n1; e < e2 || n > n2; e += X, n -= Y) { read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e - X, n + Y, e, n); } } if (rows < 0 && cols <= 0) { /* NE Quad or due north */ for (e = e1, n = n1; e < e2 || n < n2; e += X, n += Y) { read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e - X, n - Y, e, n); } } if (rows > 0 && cols >= 0) { /* SW Quad or due south */ for (e = e1, n = n1; e > e2 || n > n2; e -= X, n -= Y) { read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e + X, n + Y, e, n); } } if (rows <= 0 && cols > 0) { /* NW Quad or due west */ for (e = e1, n = n1; e > e2 || n < n2; e -= X, n += Y) { read_rast(e, n, dist / factor, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e + X, n - Y, e, n); } } /* * return dist; */ return 0; } /* done with do_profile */
/* Establish parameters */ int do_profile(double e1, double e2, double n1, double n2, char *name, int coords, double res, int fd, int data_type, FILE * fp, char *null_string) { float rows, cols, LEN; double Y, X, AZI; cols = e1 - e2; rows = n1 - n2; LEN = G_distance(e1, n1, e2, n2); G_message(_("Approx. transect length [%f] m"), LEN); if (!G_point_in_region(e2, n2)) G_warning(_("Endpoint coordinates are outside of current region settings")); /* Calculate Azimuth of Line */ if (rows == 0 && cols == 0) { /* Special case for no movement */ e = e1; n = n1; read_rast(e, n, dist, fd, coords, data_type, fp, null_string); } if (rows >= 0 && cols < 0) { /* SE Quad or due east */ AZI = atan((rows / cols)); Y = res * sin(AZI); X = res * cos(AZI); if (Y < 0) Y = Y * -1.; if (X < 0) X = X * -1.; if (e != 0.0 && (e != e1 || n != n1)) { dist -= G_distance(e, n, e1, n1); } for (e = e1, n = n1; e < e2 || n > n2; e += X, n -= Y) { read_rast(e, n, dist, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e - X, n + Y, e, n); } } if (rows < 0 && cols <= 0) { /* NE Quad or due north */ AZI = atan((cols / rows)); X = res * sin(AZI); Y = res * cos(AZI); if (Y < 0) Y = Y * -1.; if (X < 0) X = X * -1.; if (e != 0.0 && (e != e1 || n != n1)) { dist -= G_distance(e, n, e1, n1); /* * read_rast (e1, n1, dist, fd, coords, data_type, fp, null_string); */ } for (e = e1, n = n1; e < e2 || n < n2; e += X, n += Y) { read_rast(e, n, dist, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e - X, n - Y, e, n); } } if (rows > 0 && cols >= 0) { /* SW Quad or due south */ AZI = atan((rows / cols)); X = res * cos(AZI); Y = res * sin(AZI); if (Y < 0) Y = Y * -1.; if (X < 0) X = X * -1.; if (e != 0.0 && (e != e1 || n != n1)) { dist -= G_distance(e, n, e1, n1); } for (e = e1, n = n1; e > e2 || n > n2; e -= X, n -= Y) { read_rast(e, n, dist, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e + X, n + Y, e, n); } } if (rows <= 0 && cols > 0) { /* NW Quad or due west */ AZI = atan((rows / cols)); X = res * cos(AZI); Y = res * sin(AZI); if (Y < 0) Y = Y * -1.; if (X < 0) X = X * -1.; if (e != 0.0 && (e != e1 || n != n1)) { dist -= G_distance(e, n, e1, n1); } for (e = e1, n = n1; e > e2 || n < n2; e -= X, n += Y) { read_rast(e, n, dist, fd, coords, data_type, fp, null_string); /* d+=res; */ dist += G_distance(e + X, n - Y, e, n); } } /* * return dist; */ return 0; } /* done with do_profile */