/[zanavi_public1]/navit/navit/transform.c
ZANavi

Diff of /navit/navit/transform.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 28 Revision 29
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
1080int 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
1077int 1121int
1078transform_distance_sq(struct coord *c1, struct coord *c2) 1122transform_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
1218int
1219transform_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
1173int 1249int
1174transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos) 1250transform_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;

Legend:
Removed from v.28  
changed lines
  Added in v.29

   
Visit the ZANavi Wiki