Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@16: // Copyright (c) 2011-2012 Barend Gehrels, Amsterdam, the Netherlands. Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_STRATEGIES_SPHERICAL_SSF_HPP Chris@16: #define BOOST_GEOMETRY_STRATEGIES_SPHERICAL_SSF_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@101: #include Chris@101: #include Chris@16: Chris@16: #include Chris@16: //#include Chris@16: Chris@16: Chris@16: namespace boost { namespace geometry Chris@16: { Chris@16: Chris@16: Chris@16: namespace strategy { namespace side Chris@16: { Chris@16: Chris@101: #ifndef DOXYGEN_NO_DETAIL Chris@101: namespace detail Chris@101: { Chris@101: Chris@101: template Chris@101: int spherical_side_formula(T const& lambda1, T const& delta1, Chris@101: T const& lambda2, T const& delta2, Chris@101: T const& lambda, T const& delta) Chris@101: { Chris@101: // Create temporary points (vectors) on unit a sphere Chris@101: T const cos_delta1 = cos(delta1); Chris@101: T const c1x = cos_delta1 * cos(lambda1); Chris@101: T const c1y = cos_delta1 * sin(lambda1); Chris@101: T const c1z = sin(delta1); Chris@101: Chris@101: T const cos_delta2 = cos(delta2); Chris@101: T const c2x = cos_delta2 * cos(lambda2); Chris@101: T const c2y = cos_delta2 * sin(lambda2); Chris@101: T const c2z = sin(delta2); Chris@101: Chris@101: // (Third point is converted directly) Chris@101: T const cos_delta = cos(delta); Chris@101: Chris@101: // Apply the "Spherical Side Formula" as presented on my blog Chris@101: T const dist Chris@101: = (c1y * c2z - c1z * c2y) * cos_delta * cos(lambda) Chris@101: + (c1z * c2x - c1x * c2z) * cos_delta * sin(lambda) Chris@101: + (c1x * c2y - c1y * c2x) * sin(delta); Chris@101: Chris@101: T zero = T(); Chris@101: return dist > zero ? 1 Chris@101: : dist < zero ? -1 Chris@101: : 0; Chris@101: } Chris@101: Chris@101: } Chris@101: #endif // DOXYGEN_NO_DETAIL Chris@16: Chris@16: /*! Chris@16: \brief Check at which side of a Great Circle segment a point lies Chris@16: left of segment (> 0), right of segment (< 0), on segment (0) Chris@16: \ingroup strategies Chris@16: \tparam CalculationType \tparam_calculation Chris@16: */ Chris@16: template Chris@16: class spherical_side_formula Chris@16: { Chris@16: Chris@16: public : Chris@16: template Chris@16: static inline int apply(P1 const& p1, P2 const& p2, P const& p) Chris@16: { Chris@101: typedef typename promote_floating_point Chris@16: < Chris@101: typename select_calculation_type_alt Chris@101: < Chris@101: CalculationType, Chris@101: P1, P2, P Chris@101: >::type Chris@101: >::type calculation_type; Chris@16: Chris@101: calculation_type const lambda1 = get_as_radian<0>(p1); Chris@101: calculation_type const delta1 = get_as_radian<1>(p1); Chris@101: calculation_type const lambda2 = get_as_radian<0>(p2); Chris@101: calculation_type const delta2 = get_as_radian<1>(p2); Chris@101: calculation_type const lambda = get_as_radian<0>(p); Chris@101: calculation_type const delta = get_as_radian<1>(p); Chris@16: Chris@101: return detail::spherical_side_formula(lambda1, delta1, Chris@101: lambda2, delta2, Chris@101: lambda, delta); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS Chris@16: namespace services Chris@16: { Chris@16: Chris@16: /*template Chris@16: struct default_strategy Chris@16: { Chris@16: typedef spherical_side_formula type; Chris@16: };*/ Chris@16: Chris@16: template Chris@16: struct default_strategy Chris@16: { Chris@16: typedef spherical_side_formula type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct default_strategy Chris@16: { Chris@16: typedef spherical_side_formula type; Chris@16: }; Chris@16: Chris@16: } Chris@16: #endif Chris@16: Chris@16: }} // namespace strategy::side Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: Chris@16: #endif // BOOST_GEOMETRY_STRATEGIES_SPHERICAL_SSF_HPP