- Create a pair of fake segments corresponding to the given segment split in two.
-
- index_t CreateFakes Returns the fake node index (or a real one in special cases).
-
- Nodes *nodes The set of nodes to use.
-
- int point Which of the waypoints is this.
-
- Segment *segment The segment to split.
-
- index_t node1 The first node at the end of this segment.
-
- index_t node2 The second node at the end of this segment.
-
- distance_t dist1 The distance to the first node.
-
- distance_t dist2 The distance to the second node.
- ++++++++++++++++++++++++++++++++++++++*/
-
-index_t CreateFakes(Nodes *nodes,int point,Segment *segment,index_t node1,index_t node2,distance_t dist1,distance_t dist2)
-{
- index_t fakenode;
- double lat1,lon1,lat2,lon2;
-
- /* Check if we are actually close enough to an existing node */
-
- if(dist1<km_to_distance(MINSEGMENT) && dist2>km_to_distance(MINSEGMENT))
- return(node1);
-
- if(dist2<km_to_distance(MINSEGMENT) && dist1>km_to_distance(MINSEGMENT))
- return(node2);
-
- if(dist1<km_to_distance(MINSEGMENT) && dist2<km_to_distance(MINSEGMENT))
- {
- if(dist1<dist2)
- return(node1);
- else
- return(node2);
- }
-
- /* Create the fake node */
-
- fakenode=point|NODE_SUPER;
-
- GetLatLong(nodes,node1,&lat1,&lon1);
- GetLatLong(nodes,node2,&lat2,&lon2);
-
- if(lat1>3 && lat2<-3)
- lat2+=2*M_PI;
- else if(lat1<-3 && lat2>3)
- lat1+=2*M_PI;
-
- point_lat[point]=lat1+(lat2-lat1)*(double)dist1/(double)(dist1+dist2);
- point_lon[point]=lon1+(lon2-lon1)*(double)dist1/(double)(dist1+dist2);
-
- if(point_lat[point]>M_PI) point_lat[point]-=2*M_PI;
-
- /* Create the first fake segment */
-
- fake_segments[2*point-2]=*segment;
-
- if(segment->node1==node1)
- fake_segments[2*point-2].node1=fakenode;
- else
- fake_segments[2*point-2].node2=fakenode;
-
- fake_segments[2*point-2].distance=DISTANCE(dist1)|DISTFLAG(segment->distance);
-
- /* Create the second fake segment */
-
- fake_segments[2*point-1]=*segment;
-
- if(segment->node1==node2)
- fake_segments[2*point-1].node1=fakenode;
- else
- fake_segments[2*point-1].node2=fakenode;
-
- fake_segments[2*point-1].distance=DISTANCE(dist2)|DISTFLAG(segment->distance);
-
- return(fakenode);
-}
-
-
-/*++++++++++++++++++++++++++++++++++++++
- Lookup the latitude and longitude of a fake node.
-
- index_t fakenode The node to lookup.
-
- double *latitude Returns the latitude
-
- double *longitude Returns the longitude.
- ++++++++++++++++++++++++++++++++++++++*/
-
-void GetFakeLatLong(index_t fakenode, double *latitude,double *longitude)
-{
- index_t realnode=fakenode&(~NODE_SUPER);
-
- *latitude =point_lat[realnode];
- *longitude=point_lon[realnode];
-}
-
-
-/*++++++++++++++++++++++++++++++++++++++
- Finds the first fake segment associated to a fake node.
-
- Segment *FirstFakeSegment Returns the first fake segment.
-
- index_t fakenode The node to lookup.
- ++++++++++++++++++++++++++++++++++++++*/
-
-Segment *FirstFakeSegment(index_t fakenode)
-{
- index_t realnode=fakenode&(~NODE_SUPER);
-
- return(&fake_segments[2*realnode-2]);
-}
-
-
-/*++++++++++++++++++++++++++++++++++++++
- Finds the next (there can only be two) fake segment associated to a fake node.
-
- Segment *NextFakeSegment Returns the second fake segment.
-
- Segment *segment The first fake segment.
-
- index_t fakenode The node to lookup.
- ++++++++++++++++++++++++++++++++++++++*/
-
-Segment *NextFakeSegment(Segment *segment,index_t fakenode)
-{
- index_t realnode=fakenode&(~NODE_SUPER);
-
- if(segment==&fake_segments[2*realnode-2])
- return(&fake_segments[2*realnode-1]);
- else
- return(NULL);
-}
-
-
-/*++++++++++++++++++++++++++++++++++++++
- Finds the next (there can only be two) fake segment associated to a fake node.
-
- Segment *ExtraFakeSegment Returns a segment between the two specified nodes if it exists.
-
- index_t node The real node.
-
- index_t fakenode The fake node to lookup.
- ++++++++++++++++++++++++++++++++++++++*/
-
-Segment *ExtraFakeSegment(index_t node,index_t fakenode)
-{
- index_t realnode=fakenode&(~NODE_SUPER);
-
- if(fake_segments[2*realnode-2].node1==node || fake_segments[2*realnode-2].node2==node)
- return(&fake_segments[2*realnode-2]);
-
- if(fake_segments[2*realnode-1].node1==node || fake_segments[2*realnode-1].node2==node)
- return(&fake_segments[2*realnode-1]);
-
- return(NULL);
-}
-
-
-/*++++++++++++++++++++++++++++++++++++++