[geometry] Added RescalePolicy (to get SegmentRatio) to strategy_intersection

Some creations/instances of rescale policy had therefore to be moved
This commit is contained in:
Barend Gehrels
2014-02-05 14:06:00 +01:00
parent f10b2d6b92
commit 7c6ba53e59
11 changed files with 72 additions and 68 deletions

View File

@@ -37,18 +37,6 @@ template
>
struct get_turn_without_info
{
typedef strategy_intersection
<
typename cs_tag<typename TurnInfo::point_type>::type,
Point1,
Point2,
typename TurnInfo::point_type
> si;
typedef typename si::segment_intersection_strategy_type strategy;
template <typename RescalePolicy, typename OutputIterator>
static inline OutputIterator apply(
Point1 const& pi, Point1 const& pj, Point1 const& ,
@@ -57,6 +45,17 @@ struct get_turn_without_info
RescalePolicy const& rescale_policy,
OutputIterator out)
{
typedef strategy_intersection
<
typename cs_tag<typename TurnInfo::point_type>::type,
Point1,
Point2,
typename TurnInfo::point_type,
RescalePolicy
> si;
typedef typename si::segment_intersection_strategy_type strategy;
typedef model::referring_segment<Point1 const> segment_type1;
typedef model::referring_segment<Point1 const> segment_type2;
segment_type1 p1(pi, pj);
@@ -120,7 +119,8 @@ inline void get_intersection_points(Geometry1 const& geometry1,
typename cs_tag<Geometry1>::type,
Geometry1,
Geometry2,
typename boost::range_value<Turns>::type
typename boost::range_value<Turns>::type,
RescalePolicy
>::segment_intersection_strategy_type segment_intersection_strategy_type;
detail::get_turns::no_interrupt_policy interrupt_policy;

View File

@@ -1020,7 +1020,8 @@ struct get_turn_info
typename cs_tag<typename TurnInfo::point_type>::type,
Point1,
Point2,
typename TurnInfo::point_type
typename TurnInfo::point_type,
RescalePolicy
> si;
typedef typename si::segment_intersection_strategy_type strategy;

View File

@@ -639,18 +639,9 @@ inline OutputIterator intersection_insert(Geometry1 const& geometry1,
concept::check<Geometry1 const>();
concept::check<Geometry2 const>();
#if defined(BOOST_GEOMETRY_RESCALE_TO_ROBUST)
typedef typename geometry::rescale_policy_type
<
typename geometry::point_type<Geometry1>::type // TODO from both
>::type
rescale_policy_type;
rescale_policy_type rescale_policy
= get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
#else
detail::no_rescale_policy rescale_policy;
#endif
typedef typename Strategy::rescale_policy_type rescale_policy_type;
rescale_policy_type rescale_policy
= get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
return detail::intersection::insert
<
@@ -689,12 +680,19 @@ inline OutputIterator intersection_insert(Geometry1 const& geometry1,
concept::check<Geometry1 const>();
concept::check<Geometry2 const>();
typedef typename geometry::rescale_policy_type
<
typename geometry::point_type<Geometry1>::type // TODO from both
>::type
rescale_policy_type;
typedef strategy_intersection
<
typename cs_tag<GeometryOut>::type,
Geometry1,
Geometry2,
typename geometry::point_type<GeometryOut>::type
typename geometry::point_type<GeometryOut>::type,
rescale_policy_type
> strategy;
return intersection_insert<GeometryOut>(geometry1, geometry2, out,

View File

@@ -51,7 +51,7 @@ struct robust_point_type
template <typename Point, typename Policy>
struct segment_ratio_type
{
// TODO set to coordinate type
// TODO set to coordinate type ?
typedef segment_ratio<boost::long_long_type> type;
};

View File

@@ -105,7 +105,8 @@ inline OutputIterator difference_insert(Geometry1 const& geometry1,
typename cs_tag<GeometryOut>::type,
Geometry1,
Geometry2,
typename geometry::point_type<GeometryOut>::type
typename geometry::point_type<GeometryOut>::type,
RescalePolicy
> strategy;
return difference_insert<GeometryOut>(geometry1, geometry2,

View File

@@ -195,27 +195,23 @@ inline bool intersection(Geometry1 const& geometry1,
concept::check<Geometry1 const>();
concept::check<Geometry2 const>();
typedef typename geometry::rescale_policy_type
<
typename geometry::point_type<Geometry1>::type // TODO from both
>::type rescale_policy_type;
rescale_policy_type rescale_policy
= get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
typedef strategy_intersection
<
typename cs_tag<Geometry1>::type,
Geometry1,
Geometry2,
typename geometry::point_type<Geometry1>::type
typename geometry::point_type<Geometry1>::type,
rescale_policy_type
> strategy;
#if defined(BOOST_GEOMETRY_RESCALE_TO_ROBUST)
typedef typename geometry::rescale_policy_type
<
typename geometry::point_type<Geometry1>::type // TODO from both
>::type
rescale_policy_type;
rescale_policy_type rescale_policy
= get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
#else
detail::no_rescale_policy rescale_policy;
#endif
return dispatch::intersection
<
Geometry1,

View File

@@ -49,14 +49,6 @@ inline bool intersects(Geometry const& geometry)
typedef detail::overlay::turn_info<point_type> turn_info;
std::deque<turn_info> turns;
typedef typename strategy_intersection
<
typename cs_tag<Geometry>::type,
Geometry,
Geometry,
point_type
>::segment_intersection_strategy_type segment_intersection_strategy_type;
typedef detail::overlay::get_turn_info
<
detail::overlay::assign_null_policy
@@ -65,6 +57,15 @@ inline bool intersects(Geometry const& geometry)
typedef typename rescale_policy_type<point_type>::type
rescale_policy_type;
typedef typename strategy_intersection
<
typename cs_tag<Geometry>::type,
Geometry,
Geometry,
point_type,
rescale_policy_type
>::segment_intersection_strategy_type segment_intersection_strategy_type;
rescale_policy_type rescale_policy
= get_rescale_policy<rescale_policy_type>(geometry);

View File

@@ -116,7 +116,8 @@ inline OutputIterator sym_difference_insert(Geometry1 const& geometry1,
typename cs_tag<GeometryOut>::type,
Geometry1,
Geometry2,
typename geometry::point_type<GeometryOut>::type
typename geometry::point_type<GeometryOut>::type,
RescalePolicy
> strategy_type;
return sym_difference_insert<GeometryOut>(geometry1, geometry2, rescale_policy, out, strategy_type());

View File

@@ -157,18 +157,9 @@ inline OutputIterator union_insert(Geometry1 const& geometry1,
concept::check<Geometry2 const>();
concept::check<GeometryOut>();
#if defined(BOOST_GEOMETRY_RESCALE_TO_ROBUST)
typedef typename geometry::rescale_policy_type
<
typename geometry::point_type<Geometry1>::type // TODO from both
>::type
rescale_policy_type;
rescale_policy_type rescale_policy
= get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
#else
detail::no_rescale_policy rescale_policy;
#endif
typedef typename Strategy::rescale_policy_type rescale_policy_type;
rescale_policy_type rescale_policy
= get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
return detail::union_::insert<GeometryOut>(geometry1, geometry2, rescale_policy, out, strategy);
}
@@ -202,12 +193,18 @@ inline OutputIterator union_insert(Geometry1 const& geometry1,
concept::check<Geometry2 const>();
concept::check<GeometryOut>();
typedef typename geometry::rescale_policy_type
<
typename geometry::point_type<Geometry1>::type // TODO from both
>::type rescale_policy_type;
typedef strategy_intersection
<
typename cs_tag<GeometryOut>::type,
Geometry1,
Geometry2,
typename geometry::point_type<GeometryOut>::type
typename geometry::point_type<GeometryOut>::type,
rescale_policy_type
> strategy;
return union_insert<GeometryOut>(geometry1, geometry2, out, strategy());

View File

@@ -36,21 +36,27 @@ template
typename Geometry1,
typename Geometry2,
typename IntersectionPoint,
typename RescalePolicy,
typename CalculationType = void
>
struct strategy_intersection
{
private :
// for development BOOST_STATIC_ASSERT((! boost::is_same<RescalePolicy, void>::type::value));
typedef typename geometry::point_type<Geometry1>::type point1_type;
typedef typename geometry::point_type<Geometry2>::type point2_type;
typedef typename model::referring_segment<point1_type const> segment1_type;
typedef typename model::referring_segment<point2_type const> segment2_type;
typedef segment_intersection_points
<
IntersectionPoint,
typename geometry::segment_ratio_type
<
IntersectionPoint,
segment_ratio<boost::long_long_type> // TODO finetune this
> ip_type;
IntersectionPoint, RescalePolicy
>::type
> ip_type;
public:
typedef strategy::intersection::relate_cartesian_segments
@@ -71,6 +77,8 @@ public:
Tag,
CalculationType
>::type side_strategy_type;
typedef RescalePolicy rescale_policy_type;
};

View File

@@ -59,6 +59,7 @@ typename bg::default_area_result<G1>::type test_intersection(std::string const&
G1,
G2,
point_type,
typename bg::rescale_policy_type<point_type>::type,
CalculationType
> strategy;