Точка повышения в полигоне дает ошибочные результаты?

У меня есть следующий модульный тест с обеими проверками failed:

BOOST_AUTO_TEST_CASE(test_point_in_polygon)
{
    typedef boost::geometry::model::d2::point_xy<double> point_type;
    boost::geometry::model::polygon<point_type> poly;
    boost::geometry::read_wkt("POLYGON((-57.0635 -3.58045, -57.8088 -4.75336, -56.7036 -7.65533, -56.4646 -9.08261, -55.219 -9.42072, -54.6047 -9.54237, -53.868 -9.22164, -52.4139 -8.58345, -49.4691 -6.94159, -49.2295 -6.87687, -47.1079 -6.18013, -45.9159 -5.91411, -43.7897 -5.89581, -42.285 -5.95883, -40.1693 -6.38999, -38.1374 -6.87424, -35.7062 -7.67065, -34.6193 -8.40713, -34.1769 -8.74957, -31.785 -9.31504, -30.574 -9.70903, -26.909 -10.5865, -24.9817 -11.268, -22.6134 -12.2833, -21.0927 -13.3427, -20.006 -13.7029, -16.8407 -15.2466, -13.2203 -16.816, -11.3922 -17.4133, -10.7577 -17.6366, -8.54581 -18.2736, -7.18058 -18.6037, -4.86031 -19.0997, -4.25834 -19.3046, -3.39545 -19.3122, -0.985195 -19.7047, -0.340967 -19.9409, 0.75209 -19.8968, 3.30498 -20.3562, 6.82228 -20.6405, 10.4384 -20.5995, 13.8557 -20.2595, 14.7523 -20.1371, 18.3468 -19.4284, 18.9915 -19.4505, 22.5377 -18.5053, 23.2192 -18.4658, 26.4885 -17.3378, 27.2915 -17.2273, 30.5962 -15.8816, 32.7278 -14.6911, 33.8878 -14.1893, 36.2752 -12.7482, 38.5306 -11.1893, 40.8465 -9.28305, 41.1732 -9.05935, 43.372 -7.07535, 45.2436 -5.2073, 46.9925 -3.21699, 48.616 -1.35438, 50.628 0.592424, 52.158 1.37445, 53.1148 2.07603, 50.9152 5.07491, 50.3177 6.38521, 49.9412 7.3891, 48.8311 9.29466, 47.7653 12.692, 45.6416 16.3693, 43.7106 17.9319, 41.4998 17.9314, 37.4335 19.4761, 34.3477 18.4887, 32.1299 18.0676, 29.2684 18.0666, 26.5269 15.0811, 19.7706 14.5304, 15.8916 12.9664, 14.8124 12.5622, 12.783 10.0368, 12.4488 9.65713, 11.1008 7.47097, 8.9187 5.4486, 5.63935 1.10272, -6.34225 4.45488, -8.60563 7.7494, -16.2454 11.2148, -23.399 18.8388, -25.8497 20.2781, -28.8931 22.7068, -31.4379 22.8942, -32.5636 21.9563, -35.2968 20.2469, -37.3132 19.0133, -37.9703 18.2828, -40.4433 15.553, -40.9543 14.1728, -42.8783 10.3486, -46.3297 7.28714, -48.959 5.88183, -52.1939 2.65934, -54.8196 -0.896786))", poly);

    point_type point (-57.8088, -1.5755);
    BOOST_CHECK_EQUAL(boost::geometry::within(point, poly), false);

    point = point_type(-100, -2);
    BOOST_CHECK_EQUAL(boost::geometry::within(point, poly), false);

}

Данные выглядят следующим образом: введите здесь описание изображения

Я использую его аналогично документации (http://www.boost.org/doc/libs/1_61_0/libs/geometry/doc/html/geometry/reference/algorithms/within/within_2.html) .

Как и на рисунке, очевидно, что обе точки находятся вне многоугольника. Я что-то не так делаю, или я нашел ошибку в бусте?


person Mihai Bujanca    schedule 27.06.2016    source источник
comment
Вот ответ: stackoverflow.com/a/20081230/2249683   -  person    schedule 27.06.2016
comment
@DieterLücking спасибо за комментарий. Я повторно запускаю тест, конвертируя все в int, но получаю те же результаты.   -  person Mihai Bujanca    schedule 27.06.2016
comment
@DieterLücking Неправильная библиотека, которая относится к Boost.Polygon, OP использует Boost.Geometry. В примере на странице, связанной с официальной документацией, в качестве типа координат используется double.   -  person llonesmiz    schedule 27.06.2016
comment
Я отредактировал в альтернативном подходе.   -  person llonesmiz    schedule 27.06.2016


Ответы (1)


Проблема вызвана несоответствием между используемым типом полигона и предоставленными данными полигона. Используя boost::geometry::model::polygon<point_type>, вы создаете многоугольник с типом точки point_type, направленный по часовой стрелке, замкнутый и ряд других вещей, настроенных параметрами шаблона по умолчанию. В предоставленных вами данных первая точка не равна последней (это определение closed в данном контексте). Вы можете либо сделать так, чтобы полигон не закрывался (polygon<point_type,true,false>), либо убедитесь, что ваши первая и последняя точки равны (скопировав первую точку в конце).

Изменить: другой (возможно, лучший) подход может использовать boost::geometry::correct(poly); без необходимости что-либо менять, как показано в этом (довольно интересном) ответе.

person Community    schedule 27.06.2016