File: plot.c

package info (click to toggle)
grass 8.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 277,040 kB
  • sloc: ansic: 460,798; python: 227,732; cpp: 42,026; sh: 11,262; makefile: 7,007; xml: 3,637; sql: 968; lex: 520; javascript: 484; yacc: 450; asm: 387; perl: 157; sed: 25; objc: 6; ruby: 4
file content (79 lines) | stat: -rw-r--r-- 1,945 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <string.h>
#include <grass/gis.h>
#include <grass/display.h>
#include "local_proto.h"

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);
    }
}