void plot(double lon1, double lat1, double lon2, double lat2, int line_color, int text_color, double factor, const char *unit) { double distance; double text_x, text_y; double a, e2; int nsteps = 1000; int i; /* establish the current graphics window */ D_setup(0); G_get_ellipsoid_parameters(&a, &e2); G_begin_geodesic_distance(a, e2); D_use_color(line_color); G_shortest_way(&lon1, &lon2); if (lon1 != lon2) { G_begin_geodesic_equation(lon1, lat1, lon2, lat2); D_begin(); for (i = 0; i <= nsteps; i++) { double lon = lon1 + (lon2 - lon1) * i / nsteps; double lat = G_geodesic_lat_from_lon(lon); if (i == 0) D_move_abs(lon, lat); else D_cont_abs(lon, lat); } D_end(); D_stroke(); text_x = (lon1 + lon2) / 2; text_y = G_geodesic_lat_from_lon(text_x); } else { D_line_abs(lon1, lat1, lon2, lat2); text_x = (lon1 + lon2) / 2; text_y = (lat1 + lat2) / 2; } if (text_color != -1) { double t, b, l, r; char buf[100]; D_text_size(10, 10); distance = G_geodesic_distance(lon1, lat1, lon2, lat2); sprintf(buf, "%.0f %s", distance / factor, unit); D_pos_abs(text_x, text_y); D_get_text_box(buf, &t, &b, &l, &r); if (t - D_get_u_north() > 0) text_y -= t - D_get_u_north(); if (b - D_get_u_south() < 0) text_y -= b - D_get_u_south(); if (r - D_get_u_east() > 0) text_x -= r - D_get_u_east(); if (l - D_get_u_west() < 0) text_x -= l - D_get_u_west(); D_use_color(text_color); D_pos_abs(text_x, text_y); D_text(buf); } }
int draw_line(int ltype, int line, const struct line_pnts *Points, const struct line_cats *Cats, int chcat, double size, int default_width, const struct cat_list *Clist, SYMBOL * Symb, RGBA_Color * primary_color, int *n_points, int *n_lines, int *n_centroids, int *n_boundaries, int *n_faces, RGBA_Color *secondary_color) { double var_size, rotation; int i; double x0, y0; double *x, *y; int found, cat; rotation = 0.0; var_size = size; cat = -1; if (!ltype) return 0; if (Points->n_points == 0) return 0; found = FALSE; if (chcat) { for (i = 0; i < Cats->n_cats; i++) { if (Cats->field[i] == Clist->field && Vect_cat_in_cat_list(Cats->cat[i], Clist)) { found = TRUE; break; } } if (!found) return 0; } else if (Clist->field > 0) { for (i = 0; i < Cats->n_cats; i++) { if (Cats->field[i] == Clist->field) { found = TRUE; break; } } /* lines with no category will be displayed */ if (Cats->n_cats > 0 && !found) return 0; } G_debug(3, "\tdisplay feature %d, cat %d", line, cat); /* enough of the prep work, lets start plotting stuff */ x = Points->x; y = Points->y; if ((ltype & GV_POINTS)) { x0 = x[0]; y0 = y[0]; /* skip if the point is outside of the display window */ /* xy < 0 tests make it go ever-so-slightly faster */ if (x0 > D_get_u_east() || x0 < D_get_u_west() || y0 < D_get_u_south() || y0 > D_get_u_north()) return 0; D_line_width(default_width); D_symbol2(Symb, x0, y0, primary_color, secondary_color); } else { /* Plot the lines */ D_line_width(default_width); D_RGB_color(primary_color->r, primary_color->g, primary_color->b); if (Points->n_points == 1) /* line with one coor */ D_polydots_abs(x, y, Points->n_points); else /* use different user defined render methods */ D_polyline_abs(x, y, Points->n_points); } switch (ltype) { case GV_POINT: (*n_points)++; break; case GV_LINE: (*n_lines)++; break; case GV_CENTROID: (*n_centroids)++; break; case GV_BOUNDARY: (*n_boundaries)++; break; case GV_FACE: (*n_faces)++; break; default: break; } return 1; }