Routino SVN Repository Browser

Check out the latest version of Routino: svn co http://routino.org/svn/trunk routino

ViewVC logotype

Annotation of /trunk/src/supersegments.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 89 - (hide annotations) (download) (as text)
Wed Jan 28 18:46:55 2009 UTC (16 years, 2 months ago) by amb
File MIME type: text/x-csrc
File size: 6011 byte(s)
Intermediate version while transitioning data format for nodes and segments.

1 amb 16 /***************************************
2 amb 89 $Header: /home/amb/CVS/routino/src/supersegments.c,v 1.21 2009-01-28 18:46:55 amb Exp $
3 amb 16
4     Super-Segment data type functions.
5     ******************/ /******************
6     Written by Andrew M. Bishop
7    
8     This file Copyright 2008,2009 Andrew M. Bishop
9     It may be distributed under the GNU Public License, version 2, or
10     any higher version. See section COPYING of the GNU Public license
11     for conditions under which this file may be redistributed.
12     ***************************************/
13    
14    
15     #include <assert.h>
16     #include <math.h>
17     #include <stdlib.h>
18    
19 amb 26 #include "nodes.h"
20     #include "ways.h"
21     #include "segments.h"
22 amb 16 #include "functions.h"
23    
24 amb 89
25 amb 16 /*++++++++++++++++++++++++++++++++++++++
26     Select the super-segments from the list of segments.
27    
28 amb 89 NodesMem *nodesmem The nodes.
29 amb 16
30 amb 89 SegmentsMem *segmentsmem The segments.
31 amb 16
32 amb 89 WaysMem *waysmem The ways.
33 amb 16
34 amb 89 int iteration The current super-node / super-segment iteration number.
35 amb 16 ++++++++++++++++++++++++++++++++++++++*/
36    
37 amb 89 void ChooseSuperNodes(NodesMem *nodesmem,SegmentsMem *segmentsmem,WaysMem *waysmem,int iteration)
38 amb 16 {
39 amb 31 int i;
40 amb 89 int segcount=0,difference=0,nnodes=0;
41 amb 52 node_t node=0;
42     speed_t limit=0;
43     waytype_t type=0;
44     wayallow_t allow=0;
45 amb 16
46 amb 54 /* Find super-nodes */
47    
48 amb 89 node=segmentsmem->xdata[0].node1;
49 amb 52
50 amb 89 for(i=0;i<segmentsmem->number;i++)
51 amb 31 {
52 amb 89 SegmentEx *segmentex=LookupSegmentEx(segmentsmem,i);
53     WayEx *wayex=LookupWayEx(waysmem,segmentex->segment.wayindex);
54 amb 31
55 amb 89 if(segmentex->super==iteration)
56 amb 31 {
57 amb 89 if(segmentex->node1!=node)
58 amb 31 {
59 amb 89 /* Store the node if there is a difference in the ways that could affect routing.
60     Store the node if it is not a dead-end and if it isn't just the middle of a way. */
61 amb 31
62 amb 89 if(difference || segcount>2)
63     {
64     NodeEx *nodeex=FindNode(nodesmem,node);
65 amb 31
66 amb 89 nodeex->super++;
67 amb 52
68 amb 89 nnodes++;
69     }
70 amb 31
71 amb 89 segcount=1;
72     difference=0;
73 amb 31
74 amb 89 node=segmentex->node1;
75     type=wayex->way.type;
76     limit=wayex->way.limit;
77     allow=wayex->way.allow;
78     }
79     else /* Same starting node */
80     {
81     if(wayex->way.type!=type)
82     difference=1;
83 amb 31
84 amb 89 if(wayex->way.limit!=limit)
85     difference=1;
86    
87     if(wayex->way.allow!=allow)
88     difference=1;
89    
90     segcount+=1;
91     }
92 amb 52 }
93 amb 31
94 amb 38 if(!((i+1)%10000))
95 amb 31 {
96 amb 89 printf("\rFinding Super-Nodes: Segments=%d Super-Nodes=%d",i+1,nnodes);
97 amb 31 fflush(stdout);
98     }
99     }
100    
101 amb 89 printf("\rFound Super-Nodes: Segments=%d Super-Nodes=%d \n",segmentsmem->number,nnodes);
102 amb 31 fflush(stdout);
103 amb 16 }
104 amb 31
105    
106     /*++++++++++++++++++++++++++++++++++++++
107     Create the super-segments.
108    
109 amb 89 NodesMem *nodesmem The nodes.
110 amb 31
111 amb 89 SegmentsMem *segmentsmem The segments.
112 amb 31
113 amb 89 WaysMem *waysmem The ways.
114 amb 31
115 amb 89 int iteration The current super-node / super-segment iteration number.
116 amb 31 ++++++++++++++++++++++++++++++++++++++*/
117    
118 amb 89 void CreateSuperSegments(NodesMem *nodesmem,SegmentsMem *segmentsmem,WaysMem *waysmem,int iteration)
119 amb 31 {
120 amb 79 int i;
121 amb 89 SegmentsMem *supersegmentsmem;
122 amb 31
123 amb 89 supersegmentsmem=NewSegmentList();
124 amb 31
125 amb 54 /* Create super-segments for each super-node. */
126    
127 amb 89 for(i=0;i<nodesmem->number;i++)
128 amb 31 {
129 amb 89 if(nodesmem->xdata[i].super>iteration)
130 amb 54 {
131 amb 89 SegmentEx *segmentex,*first;
132 amb 54
133 amb 89 segmentex=first=FindFirstSegment(segmentsmem,nodesmem->xdata[i].id);
134 amb 54
135 amb 89 while(segmentex)
136 amb 56 {
137 amb 89 WayEx *wayex=LookupWayEx(waysmem,segmentex->segment.wayindex);
138 amb 56
139 amb 89 /* Check that this type of way hasn't already been routed */
140    
141     if(segmentex!=first)
142 amb 56 {
143 amb 89 SegmentEx *othersegmentex=first;
144 amb 56
145 amb 89 while(othersegmentex && othersegmentex!=segmentex)
146 amb 56 {
147 amb 89 WayEx *otherwayex=LookupWayEx(waysmem,othersegmentex->segment.wayindex);
148    
149     if(otherwayex->way.type ==wayex->way.type &&
150     otherwayex->way.allow==wayex->way.allow &&
151     otherwayex->way.limit==wayex->way.limit)
152     {
153     wayex=NULL;
154     break;
155     }
156    
157     othersegmentex=FindNextSegment(segmentsmem,othersegmentex);
158 amb 56 }
159     }
160    
161 amb 89 /* Route the way and store the super-segments. */
162 amb 54
163 amb 89 if(wayex)
164     {
165     Results *results=FindRoutesWay(nodesmem,segmentsmem,waysmem,nodesmem->xdata[i].id,wayex,iteration);
166     Result *result=FirstResult(results);
167 amb 31
168 amb 89 while(result)
169 amb 54 {
170 amb 89 NodeEx *nodeex=FindNode(nodesmem,result->node);
171 amb 31
172 amb 89 if(result->node!=nodesmem->xdata[i].id && nodeex->super>iteration)
173 amb 62 {
174 amb 89 SegmentEx *supersegmentex=AppendSegment(supersegmentsmem,nodesmem->xdata[i].id,result->node,IndexWayEx(waysmem,wayex));
175 amb 62
176 amb 89 supersegmentex->segment.distance=result->shortest.distance;
177    
178     if(wayex->way.type&Way_OneWay)
179     {
180     supersegmentex=AppendSegment(supersegmentsmem,result->node,nodesmem->xdata[i].id,IndexWayEx(waysmem,wayex));
181    
182     supersegmentex->segment.distance=ONEWAY_OPPOSITE|result->shortest.distance;
183     }
184 amb 62 }
185 amb 89
186     result=NextResult(results,result);
187 amb 54 }
188    
189 amb 89 FreeResultsList(results);
190 amb 79 }
191    
192 amb 89 segmentex=FindNextSegment(segmentsmem,segmentex);
193 amb 45 }
194 amb 54 }
195 amb 31
196 amb 38 if(!((i+1)%1000))
197 amb 31 {
198 amb 89 printf("\rCreating Super-Segments: Nodes=%d Super-Segments=%d",i+1,supersegmentsmem->number);
199 amb 31 fflush(stdout);
200     }
201     }
202    
203 amb 89 printf("\rCreated Super-Segments: Nodes=%d Super-Segments=%d \n",nodesmem->number,supersegmentsmem->number);
204 amb 31 fflush(stdout);
205    
206 amb 89 /* Append the new supersegments onto the segments. */
207 amb 54
208 amb 89 for(i=0;i<supersegmentsmem->number;i++)
209 amb 54 {
210 amb 89 SegmentEx *segmentex=AppendSegment(segmentsmem,0,0,0);
211 amb 54
212 amb 89 *segmentex=supersegmentsmem->xdata[i];
213     segmentex->super=iteration+1;
214 amb 54 }
215     }

Properties

Name Value
cvs:description SuperSegments data type.