Fixing odd behavior when origin and destination are on the same street.
This commit is contained in:
parent
1de5496e9a
commit
ee56d0051f
@ -59,6 +59,7 @@ public:
|
|||||||
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<NodeID> * path, _Coordinate& startCoord, _Coordinate& targetCoord)
|
unsigned int ComputeRoute(PhantomNodes * phantomNodes, vector<NodeID> * path, _Coordinate& startCoord, _Coordinate& targetCoord)
|
||||||
{
|
{
|
||||||
bool onSameEdge = false;
|
bool onSameEdge = false;
|
||||||
|
bool onSameEdgeReversed = false;
|
||||||
_Heap * _forwardHeap = new _Heap(nodeHelpDesk->getNumberOfNodes());
|
_Heap * _forwardHeap = new _Heap(nodeHelpDesk->getNumberOfNodes());
|
||||||
_Heap * _backwardHeap = new _Heap(nodeHelpDesk->getNumberOfNodes());
|
_Heap * _backwardHeap = new _Heap(nodeHelpDesk->getNumberOfNodes());
|
||||||
NodeID middle = ( NodeID ) 0;
|
NodeID middle = ( NodeID ) 0;
|
||||||
@ -67,67 +68,73 @@ public:
|
|||||||
if(phantomNodes->startNode1 == UINT_MAX || phantomNodes->startNode2 == UINT_MAX)
|
if(phantomNodes->startNode1 == UINT_MAX || phantomNodes->startNode2 == UINT_MAX)
|
||||||
return _upperbound;
|
return _upperbound;
|
||||||
|
|
||||||
if( (phantomNodes->startNode1 == phantomNodes->targetNode1 && phantomNodes->startNode2 == phantomNodes->targetNode2 ) )
|
if( (phantomNodes->startNode1 == phantomNodes->targetNode1 && phantomNodes->startNode2 == phantomNodes->targetNode2 ) ||
|
||||||
|
(phantomNodes->startNode1 == phantomNodes->targetNode2 && phantomNodes->startNode2 == phantomNodes->targetNode1 ) )
|
||||||
{
|
{
|
||||||
|
bool reverse = false;
|
||||||
EdgeID currentEdge = _graph->FindEdge( phantomNodes->startNode1, phantomNodes->startNode2 );
|
EdgeID currentEdge = _graph->FindEdge( phantomNodes->startNode1, phantomNodes->startNode2 );
|
||||||
if(currentEdge == UINT_MAX)
|
if(currentEdge == UINT_MAX){
|
||||||
currentEdge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1 );
|
currentEdge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1 );
|
||||||
if(currentEdge != UINT_MAX && _graph->GetEdgeData(currentEdge).forward && phantomNodes->startRatio < phantomNodes->targetRatio)
|
reverse = true;
|
||||||
{ //upperbound auf kantenlänge setzen
|
}
|
||||||
// cout << "start and target on same edge" << endl;
|
|
||||||
|
if(phantomNodes->startRatio < phantomNodes->targetRatio && _graph->GetEdgeData(currentEdge).forward) {
|
||||||
onSameEdge = true;
|
onSameEdge = true;
|
||||||
_upperbound = 10 * ApproximateDistance(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
_upperbound = 10 * ApproximateDistance(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
||||||
} else if (currentEdge != UINT_MAX && !_graph->GetEdgeData(currentEdge).backward) {
|
} else if(phantomNodes->startRatio > phantomNodes->targetRatio && _graph->GetEdgeData(currentEdge).backward && !reverse)
|
||||||
|
{
|
||||||
|
onSameEdge = true;
|
||||||
|
_upperbound = 10 * ApproximateDistance(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
||||||
|
} else if(phantomNodes->startRatio < phantomNodes->targetRatio && _graph->GetEdgeData(currentEdge).backward) {
|
||||||
|
onSameEdge = true;
|
||||||
|
_upperbound = 10 * ApproximateDistance(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
||||||
|
} else if(phantomNodes->startRatio > phantomNodes->targetRatio) {
|
||||||
|
onSameEdgeReversed = true;
|
||||||
|
|
||||||
|
_Coordinate result;
|
||||||
|
getNodeInfo(phantomNodes->startNode1, result);
|
||||||
|
getNodeInfo(phantomNodes->startNode2, result);
|
||||||
|
|
||||||
EdgeWeight w = _graph->GetEdgeData( currentEdge ).distance;
|
EdgeWeight w = _graph->GetEdgeData( currentEdge ).distance;
|
||||||
_forwardHeap->Insert(phantomNodes->startNode2, absDouble(w*phantomNodes->startRatio), phantomNodes->startNode2);
|
_forwardHeap->Insert(phantomNodes->startNode2, absDouble( w*phantomNodes->startRatio), phantomNodes->startNode2);
|
||||||
_backwardHeap->Insert(phantomNodes->startNode1, absDouble(w-w*phantomNodes->startRatio), phantomNodes->startNode1);
|
_backwardHeap->Insert(phantomNodes->startNode1, absDouble( w-w*phantomNodes->targetRatio), phantomNodes->startNode1);
|
||||||
} else if (currentEdge != UINT_MAX && _graph->GetEdgeData(currentEdge).backward)
|
|
||||||
{
|
|
||||||
onSameEdge = true;
|
|
||||||
_upperbound = 10 * ApproximateDistance(phantomNodes->startCoord.lat, phantomNodes->startCoord.lon, phantomNodes->targetCoord.lat, phantomNodes->targetCoord.lon);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if(phantomNodes->startNode1 != UINT_MAX)
|
} else if(phantomNodes->startNode1 != UINT_MAX)
|
||||||
{
|
{
|
||||||
EdgeID forwardEdge = _graph->FindEdge( phantomNodes->startNode1, phantomNodes->startNode2);
|
bool reverse = false;
|
||||||
if(forwardEdge == UINT_MAX)
|
EdgeID edge = _graph->FindEdge( phantomNodes->startNode1, phantomNodes->startNode2);
|
||||||
forwardEdge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1 );
|
if(edge == UINT_MAX){
|
||||||
if(forwardEdge != UINT_MAX && _graph->GetEdgeData(forwardEdge).forward )
|
edge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1 );
|
||||||
{ //insert forward edge (coord, s1) in forward heap;
|
reverse = true;
|
||||||
EdgeWeight w = _graph->GetEdgeData(forwardEdge ).distance;
|
|
||||||
_forwardHeap->Insert(phantomNodes->startNode1, absDouble(w*phantomNodes->startRatio), phantomNodes->startNode1);
|
|
||||||
}
|
}
|
||||||
EdgeID backEdge = _graph->FindEdge( phantomNodes->startNode2, phantomNodes->startNode1);
|
EdgeWeight w = _graph->GetEdgeData( edge ).distance;
|
||||||
if(backEdge == UINT_MAX)
|
if( (_graph->GetEdgeData( edge ).backward && !reverse) || (_graph->GetEdgeData( edge ).forward && reverse) )
|
||||||
backEdge = _graph->FindEdge( phantomNodes->startNode1, phantomNodes->startNode2 );
|
_forwardHeap->Insert(phantomNodes->startNode1, absDouble( w*phantomNodes->startRatio), phantomNodes->startNode1);
|
||||||
if(backEdge != UINT_MAX && _graph->GetEdgeData(backEdge).backward )
|
if( (_graph->GetEdgeData( edge ).backward && reverse) || (_graph->GetEdgeData( edge ).forward && !reverse) )
|
||||||
{ //insert forward edge (coord, s2) in forward heap;
|
|
||||||
EdgeWeight w = _graph->GetEdgeData( backEdge ).distance;
|
|
||||||
_forwardHeap->Insert(phantomNodes->startNode2, absDouble(w-w*phantomNodes->startRatio), phantomNodes->startNode2);
|
_forwardHeap->Insert(phantomNodes->startNode2, absDouble(w-w*phantomNodes->startRatio), phantomNodes->startNode2);
|
||||||
}
|
}
|
||||||
}
|
if(phantomNodes->targetNode1 != UINT_MAX && !onSameEdgeReversed)
|
||||||
if(phantomNodes->targetNode1 != UINT_MAX)
|
|
||||||
{
|
{
|
||||||
EdgeID forwardEdge = _graph->FindEdge( phantomNodes->targetNode1, phantomNodes->targetNode2);
|
bool reverse = false;
|
||||||
if(forwardEdge == UINT_MAX)
|
EdgeID edge = _graph->FindEdge( phantomNodes->targetNode1, phantomNodes->targetNode2);
|
||||||
forwardEdge = _graph->FindEdge( phantomNodes->targetNode2, phantomNodes->targetNode1 );
|
if(edge == UINT_MAX){
|
||||||
|
edge = _graph->FindEdge( phantomNodes->targetNode2, phantomNodes->targetNode1 );
|
||||||
if(forwardEdge != UINT_MAX && _graph->GetEdgeData(forwardEdge).forward )
|
reverse = true;
|
||||||
{ //insert forward edge (coord, s1) in forward heap;
|
|
||||||
EdgeWeight w = _graph->GetEdgeData( forwardEdge ).distance;
|
|
||||||
_backwardHeap->Insert(phantomNodes->targetNode1, absDouble(w * phantomNodes->targetRatio), phantomNodes->targetNode1);
|
|
||||||
}
|
|
||||||
EdgeID backwardEdge = _graph->FindEdge( phantomNodes->targetNode2, phantomNodes->targetNode1);
|
|
||||||
if(backwardEdge == UINT_MAX)
|
|
||||||
backwardEdge = _graph->FindEdge( phantomNodes->targetNode1, phantomNodes->targetNode2 );
|
|
||||||
if(backwardEdge != UINT_MAX && _graph->GetEdgeData( backwardEdge ).backward )
|
|
||||||
{ //insert forward edge (coord, s2) in forward heap;
|
|
||||||
EdgeWeight w = _graph->GetEdgeData( backwardEdge ).distance;
|
|
||||||
_backwardHeap->Insert(phantomNodes->targetNode2, absDouble(w - w * phantomNodes->targetRatio), phantomNodes->targetNode2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
EdgeWeight w = _graph->GetEdgeData( edge ).distance;
|
||||||
|
if( (_graph->GetEdgeData( edge ).backward && !reverse) || (_graph->GetEdgeData( edge ).forward && reverse) )
|
||||||
|
_backwardHeap->Insert(phantomNodes->targetNode2, absDouble( w*phantomNodes->targetRatio), phantomNodes->targetNode2);
|
||||||
|
if( (_graph->GetEdgeData( edge ).backward && reverse) || (_graph->GetEdgeData( edge ).forward && !reverse) )
|
||||||
|
_backwardHeap->Insert(phantomNodes->targetNode1, absDouble(w-w*phantomNodes->startRatio), phantomNodes->targetNode1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NodeID sourceHeapNode = 0;
|
||||||
|
NodeID targetHeapNode = 0;
|
||||||
|
if(onSameEdgeReversed) {
|
||||||
|
sourceHeapNode = _forwardHeap->Min();
|
||||||
|
targetHeapNode = _backwardHeap->Min();
|
||||||
|
}
|
||||||
while(_forwardHeap->Size() + _backwardHeap->Size() > 0)
|
while(_forwardHeap->Size() + _backwardHeap->Size() > 0)
|
||||||
{
|
{
|
||||||
if ( _forwardHeap->Size() > 0 ) {
|
if ( _forwardHeap->Size() > 0 ) {
|
||||||
@ -148,7 +155,7 @@ public:
|
|||||||
NodeID pathNode = middle;
|
NodeID pathNode = middle;
|
||||||
deque< NodeID > packedPath;
|
deque< NodeID > packedPath;
|
||||||
|
|
||||||
while ( pathNode != phantomNodes->startNode1 && pathNode != phantomNodes->startNode2 ) {
|
while ( onSameEdgeReversed ? pathNode != sourceHeapNode : pathNode != phantomNodes->startNode1 && pathNode != phantomNodes->startNode2 ) {
|
||||||
pathNode = _forwardHeap->GetData( pathNode ).parent;
|
pathNode = _forwardHeap->GetData( pathNode ).parent;
|
||||||
packedPath.push_front( pathNode );
|
packedPath.push_front( pathNode );
|
||||||
}
|
}
|
||||||
@ -156,14 +163,14 @@ public:
|
|||||||
packedPath.push_back( middle );
|
packedPath.push_back( middle );
|
||||||
pathNode = middle;
|
pathNode = middle;
|
||||||
|
|
||||||
while ( pathNode != phantomNodes->targetNode2 && pathNode != phantomNodes->targetNode1 ){
|
while ( onSameEdgeReversed ? pathNode != targetHeapNode : pathNode != phantomNodes->targetNode2 && pathNode != phantomNodes->targetNode1 ){
|
||||||
pathNode = _backwardHeap->GetData( pathNode ).parent;
|
pathNode = _backwardHeap->GetData( pathNode ).parent;
|
||||||
packedPath.push_back( pathNode );
|
packedPath.push_back( pathNode );
|
||||||
}
|
}
|
||||||
|
|
||||||
// push start node explicitely
|
// push start node explicitely
|
||||||
path->push_back(packedPath[0]);
|
path->push_back(packedPath[0]);
|
||||||
if(packedPath[0] != packedPath[1])
|
// if(packedPath[0] != packedPath[1])
|
||||||
{
|
{
|
||||||
for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++)
|
for(deque<NodeID>::size_type i = 0; i < packedPath.size()-1; i++)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user