00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdlib.h>
00021 #include <math.h>
00022 #include <grass/Vect.h>
00023
00024 static double dist_squared (double, double, double, double);
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 int
00038 dig_node_add_line ( struct Plus_head *plus, int nodeid, int lineid,
00039 struct line_pnts *points, int type)
00040 {
00041 register int i, j, nlines;
00042 float angle;
00043 int ret;
00044 P_NODE *node;
00045
00046 G_debug (3, "dig_node_add_line(): node = %d line = %d", nodeid, lineid);
00047
00048 node = plus->Node[nodeid];
00049 nlines = node->n_lines;
00050
00051
00052 ret = dig_node_alloc_line ( node, 1);
00053 if ( ret == -1 ) return -1;
00054
00055 if ( type & GV_LINES ) {
00056 if (lineid < 0)
00057 angle = dig_calc_end_angle (points, 0);
00058 else
00059 angle = dig_calc_begin_angle (points, 0);
00060 } else {
00061 angle = -9.;
00062 }
00063 G_debug (3, " angle = %f", angle);
00064
00065
00066 node->angles[nlines] = 999.;
00067
00068 for (i = 0; i <= nlines; i++)
00069 {
00070 if (angle < node->angles[i])
00071 {
00072
00073 for (j = nlines - 1; j >= i; j--)
00074 {
00075 node->angles[j + 1] = node->angles[j];
00076 node->lines[j + 1] = node->lines[j];
00077 }
00078 node->angles[i] = angle;
00079 node->lines[i] = lineid;
00080 break;
00081 }
00082 }
00083
00084 node->n_lines++;
00085 #ifdef GDEBUG
00086 G_debug (3, "dig_node_add_line(): line %d added position %d n_lines: %d angle %f", lineid, i, node->n_lines, angle);
00087 #endif
00088 return ((int) node->n_lines);
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098 int
00099 dig_add_node ( struct Plus_head *plus, double x, double y, double z) {
00100 int nnum;
00101 P_NODE *node;
00102
00103
00104
00105 G_debug(3, "dig_add_node(): n_nodes = %d, alloc_nodes = %d", plus->n_nodes, plus->alloc_nodes );
00106 if ( plus->n_nodes >= plus->alloc_nodes ) {
00107 if ( dig_alloc_nodes(plus,1000) == -1 )
00108 return -1;
00109 }
00110
00111
00112 nnum = plus->n_nodes + 1;
00113
00114 plus->Node[nnum] = dig_alloc_node();
00115
00116 node = plus->Node[nnum];
00117 node->x = x;
00118 node->y = y;
00119 node->z = z;
00120
00121 dig_spidx_add_node (plus, nnum, x, y, z);
00122
00123 plus->n_nodes++;
00124
00125 G_debug(3, "new node = %d, n_nodes = %d, alloc_nodes = %d", nnum, plus->n_nodes, plus->alloc_nodes );
00126
00127 return ( nnum );
00128 }
00129
00130
00131
00132
00133
00134 int
00135 dig_which_node ( struct Plus_head *plus, double x, double y, double thresh) {
00136 register int i;
00137 register int first_time;
00138 register int have_match;
00139 int winner;
00140 double least_dist, dist;
00141 P_NODE *node;
00142
00143 first_time = 1;
00144 have_match = 0;
00145 winner = 0;
00146 least_dist = 0.0;
00147 for (i = 1; i <= plus->n_nodes; i++)
00148 {
00149 if (plus->Node[i] == NULL)
00150 continue;
00151
00152 node = plus->Node[i];
00153 if ((fabs (node->x - x) <= thresh) &&
00154 (fabs (node->y - y) <= thresh))
00155 {
00156 dist = dist_squared (x, y, node->x, node->y);
00157 if (first_time)
00158 {
00159 least_dist = dist;
00160 first_time = 0;
00161 winner = i;
00162 have_match = 1;
00163 }
00164 if (dist < least_dist)
00165 {
00166 least_dist = dist;
00167 winner = i;
00168 }
00169 }
00170 }
00171
00172 if (!have_match)
00173 return (-1);
00174
00175 return (winner);
00176 }
00177
00178
00179
00180
00181
00182
00183
00184
00185 float
00186 dig_node_line_angle ( struct Plus_head *plus, int nodeid, int lineid )
00187 {
00188 int i, nlines;
00189 P_NODE *node;
00190
00191 G_debug (3, "dig_node_line_angle: node = %d line = %d", nodeid, lineid);
00192
00193 node = plus->Node[nodeid];
00194 nlines = node->n_lines;
00195
00196 for (i = 0; i < nlines; i++)
00197 {
00198 if ( node->lines[i] == lineid )
00199 return ( node->angles[i] );
00200 }
00201
00202 G_fatal_error ("Attempt to read line angle for the line which is not connected to the node: "
00203 "node = %d line = %d", nodeid, lineid);
00204
00205 return 0.0;
00206 }
00207
00208 static double
00209 dist_squared (double x1, double y1, double x2, double y2)
00210 {
00211 double dx, dy;
00212
00213 dx = x1 - x2;
00214 dy = y1 - y2;
00215 return (dx * dx + dy * dy);
00216 }