Я смотрел на реализацию алгоритма Уиллера в boost, и он кажется частично некорректным.
См. Надстройку / геометрию / стратегии / сферические / area_huiller.hpp
В функции apply () мы имеем
if (lon2 < lon1)
{
E = -E;
}
который я считаю вместо этого
calculation_type lon;
if( lon2 < lon1 )
lon = lon1 - lon2;
else
lon = lon1 - lon2 + two_pi;
if( 2 * half_pi < lon )
E = -E;
в соответствии с Graphics Gems 5, стр. 45 - 46. Комментарии в верхней части файла C ++ указывают, что код был получен из кода в Graphics Gems 4, хотя этот код был позже исправлен в Graphics Gems 5.
Я заметил это при попытке вычислить области многоугольников на сфере, где одна из точек была (0, 0). В этом случае он всегда будет возвращать отрицательную область, даже если многоугольник был определен против часовой стрелки. Использование точки, отличной от (0,0), казалось, облегчило проблему, что заставило меня задуматься о том, что происходит.
Кто-нибудь еще может подтвердить, что это проблема? Какие-нибудь предложения для чистого переопределения реализации boost, пока это не будет исправлено?