97 lines
2.7 KiB
C++
97 lines
2.7 KiB
C++
|
// Boost.Geometry
|
||
|
|
||
|
// Copyright (c) 2016, Oracle and/or its affiliates.
|
||
|
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
|
||
|
|
||
|
// Use, modification and distribution is subject to the Boost Software License,
|
||
|
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||
|
|
||
|
#ifndef BOOST_GEOMETRY_FORMULAS_SPHERICAL_HPP
|
||
|
#define BOOST_GEOMETRY_FORMULAS_SPHERICAL_HPP
|
||
|
|
||
|
#include <boost/geometry/core/coordinate_system.hpp>
|
||
|
#include <boost/geometry/core/coordinate_type.hpp>
|
||
|
#include <boost/geometry/core/access.hpp>
|
||
|
#include <boost/geometry/core/radian_access.hpp>
|
||
|
|
||
|
//#include <boost/geometry/arithmetic/arithmetic.hpp>
|
||
|
#include <boost/geometry/arithmetic/cross_product.hpp>
|
||
|
#include <boost/geometry/arithmetic/dot_product.hpp>
|
||
|
|
||
|
#include <boost/geometry/util/math.hpp>
|
||
|
#include <boost/geometry/util/normalize_spheroidal_coordinates.hpp>
|
||
|
#include <boost/geometry/util/select_coordinate_type.hpp>
|
||
|
|
||
|
namespace boost { namespace geometry {
|
||
|
|
||
|
namespace formula {
|
||
|
|
||
|
template <typename Point3d, typename PointSph>
|
||
|
static inline Point3d sph_to_cart3d(PointSph const& point_sph)
|
||
|
{
|
||
|
typedef typename coordinate_type<Point3d>::type calc_t;
|
||
|
|
||
|
Point3d res;
|
||
|
|
||
|
calc_t lon = get_as_radian<0>(point_sph);
|
||
|
calc_t lat = get_as_radian<1>(point_sph);
|
||
|
|
||
|
calc_t const cos_lat = cos(lat);
|
||
|
set<0>(res, cos_lat * cos(lon));
|
||
|
set<1>(res, cos_lat * sin(lon));
|
||
|
set<2>(res, sin(lat));
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
template <typename PointSph, typename Point3d>
|
||
|
static inline PointSph cart3d_to_sph(Point3d const& point_3d)
|
||
|
{
|
||
|
typedef typename coordinate_type<PointSph>::type coord_t;
|
||
|
typedef typename coordinate_type<Point3d>::type calc_t;
|
||
|
|
||
|
PointSph res;
|
||
|
|
||
|
calc_t const x = get<0>(point_3d);
|
||
|
calc_t const y = get<1>(point_3d);
|
||
|
calc_t const z = get<2>(point_3d);
|
||
|
|
||
|
set_from_radian<0>(res, atan2(y, x));
|
||
|
set_from_radian<1>(res, asin(z));
|
||
|
|
||
|
coord_t lon = get<0>(res);
|
||
|
coord_t lat = get<1>(res);
|
||
|
|
||
|
math::normalize_spheroidal_coordinates
|
||
|
<
|
||
|
typename coordinate_system<PointSph>::type::units,
|
||
|
coord_t
|
||
|
>(lon, lat);
|
||
|
|
||
|
set<0>(res, lon);
|
||
|
set<1>(res, lat);
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
// -1 right
|
||
|
// 1 left
|
||
|
// 0 on
|
||
|
template <typename Point3d1, typename Point3d2>
|
||
|
static inline int sph_side_value(Point3d1 const& norm, Point3d2 const& pt)
|
||
|
{
|
||
|
typedef typename select_coordinate_type<Point3d1, Point3d2>::type calc_t;
|
||
|
calc_t c0 = 0;
|
||
|
calc_t d = dot_product(norm, pt);
|
||
|
return math::equals(d, c0) ? 0
|
||
|
: d > c0 ? 1
|
||
|
: -1; // d < 0
|
||
|
}
|
||
|
|
||
|
} // namespace formula
|
||
|
|
||
|
}} // namespace boost::geometry
|
||
|
|
||
|
#endif // BOOST_GEOMETRY_FORMULAS_SPHERICAL_HPP
|