#include "catch.hpp" #include TEST_CASE("geometry closest point") { SECTION("geometry_empty") { mapnik::geometry::point pt(0, 0); mapnik::geometry::geometry_empty empty; auto result = mapnik::geometry::closest_point(empty, pt); REQUIRE(result.x == 0.0); REQUIRE(result.y == 0.0); REQUIRE(result.distance == -1.0); } SECTION("point") { mapnik::geometry::point pt(0, 0); mapnik::geometry::point geom(3.0, 4.0); auto result = mapnik::geometry::closest_point(geom, pt); REQUIRE(result.x == geom.x); REQUIRE(result.y == geom.y); REQUIRE(result.distance == 5.0); } SECTION("linestring") { mapnik::geometry::line_string line; line.emplace_back(0, 0); line.emplace_back(0, 100); line.emplace_back(100, 100); line.emplace_back(100, 0); mapnik::geometry::point pt(50, 50); auto result = mapnik::geometry::closest_point(line, pt); REQUIRE(result.x == 0.0); REQUIRE(result.y == 50.0); REQUIRE(result.distance == 50.0); } SECTION("polygon") { mapnik::geometry::polygon poly; mapnik::geometry::linear_ring ring; ring.emplace_back(0, 0); ring.emplace_back(1, 0); ring.emplace_back(1, 1); ring.emplace_back(0, 1); ring.emplace_back(0, 0); poly.push_back(std::move(ring)); { // point inside polygon mapnik::geometry::point pt {0.5, 0.25}; auto result = mapnik::geometry::closest_point(poly, pt); REQUIRE(result.x == 0.5); REQUIRE(result.y == 0.25); REQUIRE(result.distance == 0.0); } { // point outside polygon mapnik::geometry::point pt {1.25, 0.5}; auto result = mapnik::geometry::closest_point(poly, pt); REQUIRE(result.x == 1.0); REQUIRE(result.y == 0.5); REQUIRE(result.distance == 0.25); } { // point outside polygon mapnik::geometry::point pt {4.0, 5.0}; auto result = mapnik::geometry::closest_point(poly, pt); REQUIRE(result.x == 1.0); REQUIRE(result.y == 1.0); REQUIRE(result.distance == 5.0); } { // point on polygon boundary mapnik::geometry::point pt {0, 0.4}; auto result = mapnik::geometry::closest_point(poly, pt); REQUIRE(result.x == 0.0); REQUIRE(result.y == 0.4); REQUIRE(result.distance == 0.0); } } }