Fixing #726, rounding woes and machine epsilon
This commit is contained in:
parent
96cc44e521
commit
2b077d140f
@ -42,11 +42,8 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
|
|
||||||
#include <cassert>
|
|
||||||
#include <cfloat>
|
|
||||||
#include <climits>
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -614,7 +611,7 @@ public:
|
|||||||
);
|
);
|
||||||
|
|
||||||
BOOST_ASSERT_MSG(
|
BOOST_ASSERT_MSG(
|
||||||
FLT_EPSILON > (0. - traversal_queue.top().min_dist),
|
std::numeric_limits<double>::epsilon() > (0. - traversal_queue.top().min_dist),
|
||||||
"Root element in NN Search has min dist != 0."
|
"Root element in NN Search has min dist != 0."
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -728,8 +725,8 @@ public:
|
|||||||
);
|
);
|
||||||
|
|
||||||
BOOST_ASSERT_MSG(
|
BOOST_ASSERT_MSG(
|
||||||
FLT_EPSILON > (0. - traversal_queue.top().min_dist),
|
std::numeric_limits<double>::epsilon() > (0. - traversal_queue.top().min_dist),
|
||||||
"Root element in NN Search has min dist != 0."
|
"Root element in NN Search has min dist != 0."
|
||||||
);
|
);
|
||||||
|
|
||||||
while(!traversal_queue.empty()) {
|
while(!traversal_queue.empty()) {
|
||||||
@ -744,7 +741,7 @@ public:
|
|||||||
LeafNode current_leaf_node;
|
LeafNode current_leaf_node;
|
||||||
LoadLeafFromDisk(current_tree_node.children[0], current_leaf_node);
|
LoadLeafFromDisk(current_tree_node.children[0], current_leaf_node);
|
||||||
++io_count;
|
++io_count;
|
||||||
//SimpleLogger().Write() << "checking " << current_leaf_node.object_count << " elements";
|
SimpleLogger().Write() << "checking " << current_leaf_node.object_count << " elements";
|
||||||
for(uint32_t i = 0; i < current_leaf_node.object_count; ++i) {
|
for(uint32_t i = 0; i < current_leaf_node.object_count; ++i) {
|
||||||
DataT & current_edge = current_leaf_node.objects[i];
|
DataT & current_edge = current_leaf_node.objects[i];
|
||||||
if(ignore_tiny_components && current_edge.belongsToTinyComponent) {
|
if(ignore_tiny_components && current_edge.belongsToTinyComponent) {
|
||||||
@ -763,6 +760,8 @@ public:
|
|||||||
¤t_ratio
|
¤t_ratio
|
||||||
);
|
);
|
||||||
|
|
||||||
|
SimpleLogger().Write() << "Checking edge " << current_edge.id << " at dist: " << current_perpendicular_distance;
|
||||||
|
|
||||||
if(
|
if(
|
||||||
current_perpendicular_distance < min_dist
|
current_perpendicular_distance < min_dist
|
||||||
&& !DoubleEpsilonCompare(
|
&& !DoubleEpsilonCompare(
|
||||||
@ -770,6 +769,9 @@ public:
|
|||||||
min_dist
|
min_dist
|
||||||
)
|
)
|
||||||
) { //found a new minimum
|
) { //found a new minimum
|
||||||
|
SimpleLogger().Write() << "diff: " << std::setprecision(10) << std::fabs(current_perpendicular_distance - min_dist);
|
||||||
|
SimpleLogger().Write() << (DoubleEpsilonCompare(current_perpendicular_distance, min_dist) ? "same" : "different");
|
||||||
|
SimpleLogger().Write() << std::setprecision(6) << "old min: " << min_dist << ", new min: " << current_perpendicular_distance;
|
||||||
min_dist = current_perpendicular_distance;
|
min_dist = current_perpendicular_distance;
|
||||||
result_phantom_node.edgeBasedNode = current_edge.id;
|
result_phantom_node.edgeBasedNode = current_edge.id;
|
||||||
result_phantom_node.nodeBasedEdgeNameID = current_edge.nameID;
|
result_phantom_node.nodeBasedEdgeNameID = current_edge.nameID;
|
||||||
@ -798,8 +800,9 @@ public:
|
|||||||
current_end_coordinate
|
current_end_coordinate
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
BOOST_ASSERT_MSG(current_edge.id != result_phantom_node.edgeBasedNode, "IDs not different");
|
BOOST_ASSERT_MSG(current_edge.id != result_phantom_node.edgeBasedNode, "IDs not different");
|
||||||
//SimpleLogger().Write() << "found bidirected edge on nodes " << current_edge.id << " and " << result_phantom_node.edgeBasedNode;
|
SimpleLogger().Write() << "found bidirected edge on nodes " << current_edge.id << " and " << result_phantom_node.edgeBasedNode;
|
||||||
result_phantom_node.weight2 = current_edge.weight;
|
result_phantom_node.weight2 = current_edge.weight;
|
||||||
if(current_edge.id < result_phantom_node.edgeBasedNode) {
|
if(current_edge.id < result_phantom_node.edgeBasedNode) {
|
||||||
result_phantom_node.edgeBasedNode = current_edge.id;
|
result_phantom_node.edgeBasedNode = current_edge.id;
|
||||||
@ -830,6 +833,7 @@ public:
|
|||||||
traversal_queue.push(QueryCandidate(child_id, current_min_dist));
|
traversal_queue.push(QueryCandidate(child_id, current_min_dist));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SimpleLogger().Write() << result_phantom_node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -883,14 +887,14 @@ private:
|
|||||||
const FixedPointCoordinate& source,
|
const FixedPointCoordinate& source,
|
||||||
const FixedPointCoordinate& target,
|
const FixedPointCoordinate& target,
|
||||||
FixedPointCoordinate& nearest, double *r) const {
|
FixedPointCoordinate& nearest, double *r) const {
|
||||||
const double x = static_cast<double>(inputPoint.lat);
|
const double x = inputPoint.lat/100000.;
|
||||||
const double y = static_cast<double>(inputPoint.lon);
|
const double y = inputPoint.lon/100000.;
|
||||||
const double a = static_cast<double>(source.lat);
|
const double a = source.lat/100000.;
|
||||||
const double b = static_cast<double>(source.lon);
|
const double b = source.lon/100000.;
|
||||||
const double c = static_cast<double>(target.lat);
|
const double c = target.lat/100000.;
|
||||||
const double d = static_cast<double>(target.lon);
|
const double d = target.lon/100000.;
|
||||||
double p,q,mX,nY;
|
double p,q,mX,nY;
|
||||||
if(fabs(a-c) > FLT_EPSILON){
|
if(std::fabs(a-c) > std::numeric_limits<double>::epsilon() ){
|
||||||
const double m = (d-b)/(c-a); // slope
|
const double m = (d-b)/(c-a); // slope
|
||||||
// Projection of (x,y) on line joining (a,b) and (c,d)
|
// Projection of (x,y) on line joining (a,b) and (c,d)
|
||||||
p = ((x + (m*y)) + (m*m*a - m*b))/(1. + m*m);
|
p = ((x + (m*y)) + (m*m*a - m*b))/(1. + m*m);
|
||||||
@ -920,8 +924,8 @@ private:
|
|||||||
// return std::sqrt(((d - y)*(d - y) + (c - x)*(c - x)));
|
// return std::sqrt(((d - y)*(d - y) + (c - x)*(c - x)));
|
||||||
}
|
}
|
||||||
// point lies in between
|
// point lies in between
|
||||||
nearest.lat = p;
|
nearest.lat = p*100000.;
|
||||||
nearest.lon = q;
|
nearest.lon = q*100000.;
|
||||||
// return std::sqrt((p-x)*(p-x) + (q-y)*(q-y));
|
// return std::sqrt((p-x)*(p-x) + (q-y)*(q-y));
|
||||||
return (p-x)*(p-x) + (q-y)*(q-y);
|
return (p-x)*(p-x) + (q-y)*(q-y);
|
||||||
}
|
}
|
||||||
@ -931,7 +935,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline bool DoubleEpsilonCompare(const double d1, const double d2) const {
|
inline bool DoubleEpsilonCompare(const double d1, const double d2) const {
|
||||||
return (std::fabs(d1 - d2) < FLT_EPSILON);
|
return (std::fabs(d1 - d2) < std::numeric_limits<double>::epsilon() );
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user