… | |
… | |
1072 | for (i = 0 ; i < count-1 ; i++) |
1072 | for (i = 0 ; i < count-1 ; i++) |
1073 | ret+=transform_distance(pro, &c[i], &c[i+1]); |
1073 | ret+=transform_distance(pro, &c[i], &c[i+1]); |
1074 | return ret; |
1074 | return ret; |
1075 | } |
1075 | } |
1076 | |
1076 | |
|
|
1077 | |
|
|
1078 | // calc the distance (squared) of a point (p) to a line segment (l1 .. l2) |
|
|
1079 | // return (int) distance squared |
|
|
1080 | int transform_distance_point2line_sq(struct coord *p, struct coord *l1, struct coord *l2) |
|
|
1081 | { |
|
|
1082 | int A = p->x - l1->x; |
|
|
1083 | int B = p->y - l1->y; |
|
|
1084 | float C = l2->x - l1->x; |
|
|
1085 | float D = l2->y - l1->y; |
|
|
1086 | |
|
|
1087 | int dot = A * C + B * D; |
|
|
1088 | int len_sq = C * C + D * D; |
|
|
1089 | float param = (float)dot / (float)len_sq; |
|
|
1090 | |
|
|
1091 | int xx, yy; |
|
|
1092 | |
|
|
1093 | if (param < 0 || (l1->x == l2->x && l1->y == l2->y)) |
|
|
1094 | { |
|
|
1095 | xx = l1->x; |
|
|
1096 | yy = l1->y; |
|
|
1097 | } |
|
|
1098 | else if (param > 1) |
|
|
1099 | { |
|
|
1100 | xx = l2->x; |
|
|
1101 | yy = l2->y; |
|
|
1102 | } |
|
|
1103 | else |
|
|
1104 | { |
|
|
1105 | xx = l1->x + param * C; |
|
|
1106 | yy = l1->y + param * D; |
|
|
1107 | } |
|
|
1108 | |
|
|
1109 | int dx = p->x - xx; |
|
|
1110 | int dy = p->y - yy; |
|
|
1111 | |
|
|
1112 | if (dx > 32767 || dy > 32767 || dx < -32767 || dy < -32767) |
|
|
1113 | { |
|
|
1114 | return INT_MAX; |
|
|
1115 | } |
|
|
1116 | |
|
|
1117 | return (dx * dx + dy * dy); |
|
|
1118 | |
|
|
1119 | } |
|
|
1120 | |
1077 | int |
1121 | int |
1078 | transform_distance_sq(struct coord *c1, struct coord *c2) |
1122 | transform_distance_sq(struct coord *c1, struct coord *c2) |
1079 | { |
1123 | { |
1080 | int dx=c1->x-c2->x; |
1124 | int dx=c1->x-c2->x; |
1081 | int dy=c1->y-c2->y; |
1125 | int dy=c1->y-c2->y; |
… | |
… | |
1167 | l.y=l0->y+vy*c1/c2; |
1211 | l.y=l0->y+vy*c1/c2; |
1168 | if (lpnt) |
1212 | if (lpnt) |
1169 | *lpnt=l; |
1213 | *lpnt=l; |
1170 | return transform_distance_sq_float(&l, ref); |
1214 | return transform_distance_sq_float(&l, ref); |
1171 | } |
1215 | } |
|
|
1216 | |
|
|
1217 | |
|
|
1218 | int |
|
|
1219 | transform_distance_polyline_sq__v2(struct coord *c, int count, struct coord *ref) |
|
|
1220 | { |
|
|
1221 | int i,dist,distn; |
|
|
1222 | |
|
|
1223 | if (count < 2) |
|
|
1224 | { |
|
|
1225 | int d; |
|
|
1226 | d = transform_distance_sq(&c[0], ref); |
|
|
1227 | //dbg(0,"d=%d\n", d); |
|
|
1228 | return d; |
|
|
1229 | } |
|
|
1230 | |
|
|
1231 | dist=transform_distance_point2line_sq(ref, &c[0], &c[1]); |
|
|
1232 | //dbg(0,"dist1:%d\n", dist); |
|
|
1233 | |
|
|
1234 | for (i = 2; i < count; i++) |
|
|
1235 | { |
|
|
1236 | distn=transform_distance_point2line_sq(ref, &c[i-1], &c[i]); |
|
|
1237 | //dbg(0,"dist2:%d\n", dist); |
|
|
1238 | if (distn < dist) |
|
|
1239 | { |
|
|
1240 | dist=distn; |
|
|
1241 | } |
|
|
1242 | } |
|
|
1243 | //dbg(0,"dist final:%d\n", dist); |
|
|
1244 | return dist; |
|
|
1245 | } |
|
|
1246 | |
|
|
1247 | |
1172 | |
1248 | |
1173 | int |
1249 | int |
1174 | transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos) |
1250 | transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos) |
1175 | { |
1251 | { |
1176 | int i,dist,distn; |
1252 | int i,dist,distn; |