Results *CombineRoutes(Results *results,Nodes *nodes,Segments *segments,Ways *ways,Profile *profile) { Result *result1,*result2,*result3,*result4; Results *combined; combined=NewResultsList(64); combined->start=results->start; combined->finish=results->finish; /* Sort out the combined route */ result1=FindResult(results,results->start); result3=InsertResult(combined,results->start); ZeroResult(result3); do { if(result1->next!=NO_NODE) { Results *results2=FindNormalRoute(nodes,segments,ways,result1->node,result1->next,profile); result2=FindResult(results2,result1->node); result3->next=result2->next; result2=FindResult(results2,result2->next); do { result4=InsertResult(combined,result2->node); *result4=*result2; result4->score+=result3->score; if(result2->next!=NO_NODE) result2=FindResult(results2,result2->next); else result2=NULL; } while(result2); FreeResultsList(results2); result1=FindResult(results,result1->next); result3=result4; } else result1=NULL; } while(result1); return(combined); }
static index_t FindSuperSegment(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,index_t endnode,index_t endsegment) { Segment *segment; if(IsFakeSegment(endsegment)) endsegment=IndexRealSegment(endsegment); segment=LookupSegment(segments,endsegment,2); if(IsSuperSegment(segment)) return(endsegment); /* Loop across all segments */ segment=FirstSegment(segments,nodes,endnode,3); /* endnode cannot be a fake node (must be a super-node) */ while(segment) { if(IsSuperSegment(segment)) { Results *results; index_t startnode; startnode=OtherNode(segment,endnode); results=FindNormalRoute(nodes,segments,ways,relations,profile,startnode,NO_SEGMENT,endnode); if(results && results->last_segment==endsegment) { FreeResultsList(results); return(IndexSegment(segments,segment)); } if(results) FreeResultsList(results); } segment=NextSegment(segments,segment,endnode); /* endnode cannot be a fake node (must be a super-node) */ } return(endsegment); }
Results *CombineRoutes(Nodes *nodes,Segments *segments,Ways *ways,Relations *relations,Profile *profile,Results *begin,Results *middle) { Result *midres,*comres1; Results *combined; combined=NewResultsList(256); combined->start_node=begin->start_node; combined->prev_segment=begin->prev_segment; /* Insert the start point */ midres=FindResult(middle,middle->start_node,middle->prev_segment); comres1=InsertResult(combined,combined->start_node,combined->prev_segment); /* Insert the start of the route */ if(begin->number>1 && midres->next) { Result *begres; midres=FindResult(middle,midres->next->node,midres->next->segment); begres=FindResult(begin,midres->node,midres->segment); FixForwardRoute(begin,begres); if(midres->next && midres->next->node==midres->node) midres=midres->next; begres=FindResult(begin,begin->start_node,begin->prev_segment); begres=begres->next; do { Result *comres2; comres2=InsertResult(combined,begres->node,begres->segment); comres2->score=begres->score+comres1->score; comres2->prev=comres1; begres=begres->next; comres1=comres2; } while(begres); } /* Sort out the combined route */ do { Result *result; if(midres->next) { Results *results=FindNormalRoute(nodes,segments,ways,relations,profile,comres1->node,comres1->segment,midres->next->node); if(!results) return(NULL); result=FindResult(results,midres->node,comres1->segment); result=result->next; /* * midres midres->next * = = * ---*----------------------------------* = middle * * ---*----.----.----.----.----.----.----* = results * = * result * * ---*----.----.----.----.----.----.----* = combined * = = * comres1 comres2 */ do { Result *comres2; comres2=InsertResult(combined,result->node,result->segment); comres2->score=result->score+comres1->score; comres2->prev=comres1; result=result->next; comres1=comres2; } while(result); FreeResultsList(results); } midres=midres->next; } while(midres); FixForwardRoute(combined,comres1); return(combined); }