#include "catch.hpp" #include #include #include TEST_CASE("geometry ops") { SECTION("hit_test_filter - double") { using namespace mapnik::geometry; { geometry geom(point(0, 0)); REQUIRE(mapnik::hit_test(geom, 0, 0, 0)); } { geometry geom(point(0, 0)); REQUIRE(mapnik::hit_test(geom, 1, 0, 1)); } { geometry geom(point(0, 0)); REQUIRE(mapnik::hit_test(geom, 0, 1, 1)); } { geometry geom(point(0, 0)); REQUIRE(mapnik::hit_test(geom, 1, 1, 1.5)); } { line_string line; line.emplace_back(0, 0); line.emplace_back(1, 1); line.emplace_back(2, 2); geometry geom(line); REQUIRE(mapnik::hit_test(geom, 0, 0, 1.5)); } { line_string line; line.emplace_back(0, 0); line.emplace_back(1, 1); line.emplace_back(2, 2); multi_line_string multi_line; multi_line.emplace_back(std::move(line)); geometry geom(multi_line); REQUIRE(mapnik::hit_test(geom, 0, 0, 1.5)); } { polygon poly; linear_ring ring; ring.emplace_back(0, 0); ring.emplace_back(-10, 0); ring.emplace_back(-10, 10); ring.emplace_back(0, 10); ring.emplace_back(0, 0); poly.push_back(std::move(ring)); geometry geom(poly); REQUIRE(mapnik::hit_test(geom, -5, 5, 0)); multi_polygon mp; mp.push_back(poly); geometry geom_mp(mp); REQUIRE(mapnik::hit_test(geom_mp, -5, 5, 0)); correct(geom); REQUIRE(mapnik::hit_test(geom, -5, 5, 0)); correct(geom_mp); REQUIRE(mapnik::hit_test(geom_mp, -5, 5, 0)); geometry_collection gc; REQUIRE(!mapnik::hit_test(geometry(gc), -5, 5, 0)); gc.push_back(geom_mp); REQUIRE(mapnik::hit_test(geometry(gc), -5, 5, 0)); REQUIRE(!mapnik::hit_test(geometry(gc), -50, -50, 0)); gc.emplace_back(point(-50, -50)); REQUIRE(mapnik::hit_test(geometry(gc), -50, -50, 0)); } { // polygon with hole polygon poly; linear_ring ring; ring.emplace_back(0, 0); ring.emplace_back(-10, 0); ring.emplace_back(-10, 10); ring.emplace_back(0, 10); ring.emplace_back(0, 0); poly.push_back(std::move(ring)); linear_ring hole; hole.emplace_back(-7, 7); hole.emplace_back(-7, 3); hole.emplace_back(-3, 3); hole.emplace_back(-3, 7); hole.emplace_back(-7, 7); poly.push_back(std::move(hole)); geometry geom(poly); REQUIRE(!mapnik::hit_test(geom, -5, 5, 0)); // add another hole inside the first hole // which should be considered a hit linear_ring fill; fill.emplace_back(-6, 4); fill.emplace_back(-6, 6); fill.emplace_back(-4, 6); fill.emplace_back(-4, 4); fill.emplace_back(-6, 4); poly.push_back(std::move(fill)); REQUIRE(mapnik::hit_test(geometry(poly), -5, 5, 0)); } } }