Changeset 79
- Timestamp:
- 12/17/07 16:41:08 (1 year ago)
- Files:
-
- sandbox/orkney/dijkstra.h (modified) (3 diffs)
- sandbox/orkney/shootingstar.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
sandbox/orkney/dijkstra.h
r78 r79 78 78 edge_descriptor *er; 79 79 //adding an edge for opposite direction 80 bool inserted = addEdge(er, edges[j], graph);80 bool inserted = addEdge(er, edges[j], graph); 81 81 82 82 graph[*er].id = j;//set id 83 83 84 84 if (HasReverseCost()) 85 {85 { 86 86 graph[*er].cost = edges[j]->GetFieldAsDouble(RC_FEATURE);//set reverse cost 87 }88 else89 {90 graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost91 }87 } 88 else 89 { 90 graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost 91 } 92 92 } 93 93 } … … 131 131 while (target != source) 132 132 { 133 if (target == predecessors[target])134 {135 return NO_PATH_FOUND;136 }137 target = predecessors[target];133 if (target == predecessors[target]) 134 { 135 return NO_PATH_FOUND; 136 } 137 target = predecessors[target]; 138 138 139 path_vect.push_back(target);140 if (!max--)141 {142 return OVERFLOW;143 }139 path_vect.push_back(target); 140 if (!max--) 141 { 142 return OVERFLOW; 143 } 144 144 } 145 145 … … 151 151 for(int i = path_vect.size() - 1, int j = 0; i >= 0; i--, j++) 152 152 { 153 graph_traits < graph_t >::vertex_descriptor v_src;154 graph_traits < graph_t >::vertex_descriptor v_targ;155 graph_traits < graph_t >::edge_descriptor e;156 graph_traits < graph_t >::out_edge_iterator out_i, out_end;153 graph_traits < graph_t >::vertex_descriptor v_src; 154 graph_traits < graph_t >::vertex_descriptor v_targ; 155 graph_traits < graph_t >::edge_descriptor e; 156 graph_traits < graph_t >::out_edge_iterator out_i, out_end; 157 157 158 if (i == 0)159 {160 continue;161 }158 if (i == 0) 159 { 160 continue; 161 } 162 162 163 v_src = path_vect.at(i);164 v_targ = path_vect.at(i - 1);163 v_src = path_vect.at(i); 164 v_targ = path_vect.at(i - 1); 165 165 166 for (tie(out_i, out_end) = out_edges(v_src, graph);167 out_i != out_end; ++out_i)168 {169 graph_traits < graph_t >::vertex_descriptor v, targ;170 e = *out_i;171 v = source(e, graph);172 targ = target(e, graph);166 for (tie(out_i, out_end) = out_edges(v_src, graph); 167 out_i != out_end; ++out_i) 168 { 169 graph_traits < graph_t >::vertex_descriptor v, targ; 170 e = *out_i; 171 v = source(e, graph); 172 targ = target(e, graph); 173 173 174 if (targ == v_targ)175 {176 (*result)[j] = (*edges)[graph[*out_i].id];177 break;178 }179 }174 if (targ == v_targ) 175 { 176 (*result)[j] = (*edges)[graph[*out_i].id]; 177 break; 178 } 179 } 180 180 } 181 181 sandbox/orkney/shootingstar.h
r77 r79 214 214 adjacent_edges[edges[j]->GetFieldAsInteger(ID_FEATURE)].begin(), 215 215 adjacent_edges[edges[j]->GetFieldAsInteger(ID_FEATURE)].end() ); 216 adjacent_edges.erase(edges[j]->GetFieldAsInteger(ID_FEATURE));216 adjacent_edges.erase(edges[j]->GetFieldAsInteger(ID_FEATURE)); 217 217 } 218 218 219 219 edge_descriptor *er; 220 220 //adding an edge for opposite direction 221 bool inserted = addEdge(er, edges[j], graph);221 bool inserted = addEdge(er, edges[j], graph); 222 222 223 223 graph[*er].id = j;//set id 224 224 225 225 if (HasReverseCost()) 226 {226 { 227 227 graph[*er].cost = edges[j]->GetFieldAsDouble(RC_FEATURE);//set reverse cost 228 }229 else230 {231 graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost232 }228 } 229 else 230 { 231 graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost 232 } 233 233 234 234 } … … 236 236 adjacent_edges.clear(); 237 237 rule_num = 0; 238 238 239 } 239 240 else … … 245 246 }; 246 247 248 int getRoute(int start, int end, OGRFeature **result, int *resultCount, graph_t &graph) 249 { 250 edge_descriptor source_edge; 251 edge_descriptor target_edge; 252 253 bool source_found = false, target_found = false; 254 255 graph_traits<graph_t>::edge_iterator ei, ei_end; 256 257 for(tie(ei, ei_end) = edges(graph); ei != ei_end; ++ei) 258 { 259 if(graph[*ei].id == start) 260 { 261 source_edge = *ei; 262 source_found = true; 263 break; 264 } 265 } 266 267 if (!source_found) 268 { 269 return NO_SOURCE_FOUND; 270 } 271 272 273 for(tie(ei, ei_end) = edges(graph); ei != ei_end; ++ei) 274 { 275 if(graph[*ei].id == end) 276 { 277 target_edge = *ei; 278 target_found = true; 279 break; 280 } 281 } 282 283 if (!target_found) 284 { 285 return NO_TARGET_FOUND; 286 } 287 288 property_map<graph_t, int Edge::*>::type edge_index = get(&Edge::id, graph); 289 290 std::map< int, edge_descriptor, std::less<int> > predecessors; 291 292 property_map<graph_t, float Edge::*>::type rank = get(&Edge::rank, graph); 293 property_map<graph_t, float Edge::*>::type distance = get(&Edge::distance, graph); 294 295 try 296 { 297 shooting_star_search 298 (graph, source_edge, 299 distance_heuristic<graph_t, float>(graph, target_edge), 300 weight_map(get(&Edge::cost, graph)). 301 weight_map2(get(&Edge::adjacent_edges, graph)). 302 edge_color_map(get(&Edge::color, graph)). 303 visitor(shooting_star_goal_visitor<edge_descriptor>(target_edge, e_max_id)), 304 edge_index, 305 distance, rank, 306 predecessors, e_max_id 307 ); 308 } 309 catch(found_goal &fg) 310 { 311 return makeResult(*target, *source, *predecessors, result, resultCount, graph); 312 } 313 } 314 315 virtual int makeResult(edge_descriptor *target_edge, edge_descriptor *source_edge, 316 std::map< int, edge_descriptor, std::less<int> > *predecessors, 317 OGRFeature **result, int *resultCount, graph_t &graph) 318 { 319 vector<edge_descriptor> path_vect; 320 int max = MAX_NODES; 321 322 path_vect.push_back(target_edge); 323 324 while (target_edge != source_edge) 325 { 326 327 if ((target_edge == predecessors[graph[target_edge].id]) && (predecessors[graph[target_edge].id] != source_edge)) 328 { 329 return NO_PATH_FOUND; 330 } 331 332 target_edge = predecessors[graph[target_edge].id]; 333 334 path_vect.push_back(target_edge); 335 336 if (!max--) 337 { 338 return OVERFLOW; 339 } 340 } 341 342 //*result = (OGRFeature *) malloc(sizeof(OGRFeature) * (path_vect.size() + 1)); 343 //Let's try to do it in C++ style 344 *result = new OGRFeature * [path_vect.size() + 1]; 345 *path_count = path_vect.size(); 346 347 for(int i = path_vect.size() - 1, j = 0; i >= 0; i--, j++) 348 { 349 graph_traits < graph_t >::edge_descriptor e; 350 351 e = path_vect.at(i); 352 353 if(graph[e].id > e_max_id) 354 { 355 graph[e].id -= e_max_id; 356 } 357 358 (*result)[j] = graph[e].id; 359 } 360 361 return EXIT_SUCCESS; 362 } 363 364 }; 365 247 366 #endif

