|
Geometry : |
Subject: [geometry] segment_ratio<__int64> causes a real number value corruption in boost::geometry::difference()
From: sonic (mike.vasiljevs_at_[hidden])
Date: 2015-04-01 17:13:28
To make the story short double value
"*1.3999999999999999*"
gets converted into
"*1.4000000000000057*"
when calling /boost::geometry::difference()/ on two polygons. Polygons were
defined in a standard way, that is:
/BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(cs::cartesian)
BOOST_GEOMETRY_REGISTER_BOOST_ARRAY_CS(cs::cartesian)
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
typedef boost::geometry::model::d2::point_xy<double> point_xy;
typedef boost::geometry::model::polygon<point_xy > polygon;/
I found (after 2.5 hours being lost in the haunted template forest :p) that
the culprit is the following code (or I am d hing terribly wrong):
/ set<0>(point, boost::numeric_cast<coordinate_type>(
get<0, 0>(segment)
+ ratio.numerator() * dx / ratio.denominator()));/
in:
function:
/boost::geometry::policies::relate::segments_intersection_points::assign(..)/
location: /boost\geometry\policies\relate\intersection_points.hpp/
Which curiously enough means that value was stored/manipulated NOT a
*double* but as a /*rational number*/!
Were there any gobrutaly to handle this problem without having to bluntly
round off the values?
Would be happy to post an example if there are any answers to follow...
--------------
boost version: 1.56.0
-- View this message in context: http://boost-geometry.203548.n3.nabble.com/segment-ratio-int64-causes-a-real-number-value-corruption-in-boost-geometry-difference-tp4026514.html Sent from the Boost Geometry mailing list archive at Nabble.com.
Geometry list run by mateusz at loskot.net