#pragma once #include #include #include #include namespace mapbox { namespace geometry { namespace wagyu { template double area(mapbox::geometry::linear_ring const& poly) { std::size_t size = poly.size(); if (size < 3) { return 0.0; } double a = 0.0; auto itr = poly.begin(); auto itr_prev = poly.end(); --itr_prev; a += static_cast(itr_prev->x + itr->x) * static_cast(itr_prev->y - itr->y); ++itr; itr_prev = poly.begin(); for (; itr != poly.end(); ++itr, ++itr_prev) { a += static_cast(itr_prev->x + itr->x) * static_cast(itr_prev->y - itr->y); } return -a * 0.5; } inline bool value_is_zero(double val) { return std::fabs(val) < std::numeric_limits::epsilon(); } inline bool values_are_equal(double x, double y) { return value_is_zero(x - y); } inline bool values_near_equal(double x, double y) { return std::fabs(x - y) < (5.0 * std::numeric_limits::epsilon()); } inline bool greater_than_or_equal(double x, double y) { return x > y || values_are_equal(x, y); } template bool slopes_equal(mapbox::geometry::point const& pt1, mapbox::geometry::point const& pt2, mapbox::geometry::point const& pt3) { return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y); } template bool slopes_equal(mapbox::geometry::wagyu::point const& pt1, mapbox::geometry::wagyu::point const& pt2, mapbox::geometry::point const& pt3) { return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y); } template bool slopes_equal(mapbox::geometry::wagyu::point const& pt1, mapbox::geometry::wagyu::point const& pt2, mapbox::geometry::wagyu::point const& pt3) { return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y); } template bool slopes_equal(mapbox::geometry::point const& pt1, mapbox::geometry::point const& pt2, mapbox::geometry::point const& pt3, mapbox::geometry::point const& pt4) { return (pt1.y - pt2.y) * (pt3.x - pt4.x) == (pt1.x - pt2.x) * (pt3.y - pt4.y); } } } }