Что возвращает boost::geometry::intersection

Документация для boost::geometry::intersection( https://www.boost.org/doc/libs/1_73_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection/intersection_3.html ) говорит, что функция возвращает логическое значение. Однако документы НЕ говорят, что указывает возвращаемое значение. Я предположил, что это вернет true, если будет найдено пересечение.

Неправильно!!!

Этот код

#include <iostream>
#include <deque>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>

namespace bg = boost::geometry;
using namespace std;

class cxy
{
public:
    double x;
    double y;
    cxy( double X, double Y )
        : x( X )
        , y( Y )
    {

    }
    /// boost geometry insists on a default constructor
    cxy()
        : cxy(0,0)
    {

    }
};

BOOST_GEOMETRY_REGISTER_POINT_2D( cxy, double, bg::cs::cartesian, x, y )
typedef bg::model::segment<cxy> segment_t;

int main()
{
    cxy a(1,0);
    cxy b(1,1);
    cxy c(0,0.5);
    cxy d(0.5,0.5) ;

    segment_t ab( a, b );
    segment_t cd( c, d );
    std::vector<cxy> out;
    if( ! bg::intersection( ab, cd, out ) ) {
       std::cout << "intersection returned false\n";
       return 1;
    }
    if( ! out.size() ) {
        std::cout << "no intersection point!\n";
        return 2;
    }
    std::cout << "intersection at " << out[0].x <<" " << out[0].y << "\n";

    return 0;
}

выходы

no intersection point!

Что такое возвращение истинного указания?


person ravenspoint    schedule 27.07.2020    source источник


Ответы (1)


Возвращаемое значение истинно, что указывает на отсутствие ошибок. Например. в глубине цепочки вызовов:

template <typename RobustPolicy, typename GeometryOut, typename Strategy>
static inline bool apply(Geometry1 const& geometry1,
        Geometry2 const& geometry2,
        RobustPolicy const& robust_policy,
        GeometryOut& geometry_out,
        Strategy const& strategy)
{
    typedef typename geometry::detail::output_geometry_value
        <
            GeometryOut
        >::type SingleOut;

    intersection_insert
        <
            Geometry1, Geometry2, SingleOut,
            overlay_intersection
        >::apply(geometry1, geometry2, robust_policy,
                 geometry::detail::output_geometry_back_inserter(geometry_out),
                 strategy);

    return true;
}

Это в

#0  0x000055555555598c in boost::geometry::dispatch::intersection<boost::geometry::model::segment<cxy>, boost::geometry::model::segment<cxy>, boost::geometry::segment_tag, boost::geometry::segment_tag, false>::apply<boost::geometry::detail::no_rescale_policy, std::vector<cxy, std::allocator<cxy> >, boost::geometry::strategy::intersection::cartesian_segments<void> > (geometry1=..., geometry2=..., robust_policy=..., geometry_out=std::vector of length 0, capacity 0, strategy=...) at /home/sehe/custom/boost_1_73_0/boost/geometry/algorithms/detail/intersection/interface.hpp:63
#1  0x0000555555555842 in boost::geometry::resolve_strategy::intersection::apply<boost::geometry::model::segment<cxy>, boost::geometry::model::segment<cxy>, std::vector<cxy, std::allocator<cxy> > > (geometry1=..., geometry2=..., geometry_out=std::vector of length 0, capacity 0) at /home/sehe/custom/boost_1_73_0/boost/geometry/algorithms/detail/intersection/interface.hpp:175
#2  0x00005555555556ed in boost::geometry::resolve_variant::intersection<boost::geometry::model::segment<cxy>, boost::geometry::model::segment<cxy> >::apply<std::vector<cxy, std::allocator<cxy> >, boost::geometry::default_strategy> (geometry1=..., geometry2=..., geometry_out=std::vector of length 0, capacity 0, strategy=...) at /home/sehe/custom/boost_1_73_0/boost/geometry/algorithms/detail/intersection/interface.hpp:198
#3  0x00005555555554f3 in boost::geometry::intersection<boost::geometry::model::segment<cxy>, boost::geometry::model::segment<cxy>, std::vector<cxy, std::allocator<cxy> > > (geometry1=..., geometry2=..., geometry_out=std::vector of length 0, capacity 0) at /home/sehe/custom/boost_1_73_0/boost/geometry/algorithms/detail/intersection/interface.hpp:403
#4  0x0000555555554eab in main () at /home/sehe/Projects/stackoverflow/test.cpp:40

Я просмотрел спецификацию OGC Simple Feature, которая Подробнее о Boost Geoetry

Библиотека следует существующим соглашениям:

  • соглашения от повышения
  • соглашения из стандартных библиотек соглашений и
  • имена из одного из стандартов OGC по геометрии и, более конкретно, из Спецификации простых функций OGC

Он концептуально моделирует алгоритм без возвращаемого значения:

введите здесь описание изображения

Я проверил все реализации в algorithms/detail/intersection (areal_areal.hpp, box_box.hpp, реализация.hpp, interface.hpp, multi.hpp) и ничего не возвращает false.

TL;DR Резюме

Возвращаемое значение специально недокументировано, другими словами: это деталь реализации, от которой вы можете не зависеть.

Что касается интерфейса библиотеки, документированный интерфейс может не меняться (без предупреждения) в новых версиях. Многие вещи, которые можно "обнаружить" через заголовки, являются недокументированными — чаще всего обозначаются detail:: пространством имен и/или detail/ папками заголовков.


person sehe    schedule 27.07.2020
comment
Возвращаемое значение специально недокументировано, как ужасно. В моей работе против этого поднимали вопрос и поручали какому-нибудь бедному стажеру. - person ravenspoint; 27.07.2020
comment
Мне придется добавить к этому оболочку, возвращающую true тогда и только тогда, когда размер вывода больше нуля. - person ravenspoint; 27.07.2020
comment
К вашему сведению, я зафиксировал код, который проверяет пересечение сегментов линий с помощью boost::geometry. Это полдюжины строк, которые завершают странность boost, заменяя большую часть сложного кода, который я написал для обработки всех особых случаев в этой задаче. Кажется, для этого стоит использовать boost, но я думаю, что буду придерживаться своего собственного кода для простых геометрических задач. Я благодарю вас за ваши советы по этому поводу в течение последних нескольких дней. - person ravenspoint; 27.07.2020
comment
Именно так предполагается использовать большинство библиотек boost: они стремитесь к универсальности, а не к дружелюбию: сначала они хотят иметь ценность, а потом удобство. Все дело в том, что вы можете использовать их библиотеку со своими собственными типами, и, конечно же, вы должны скрывать сложность, хотя насколько это может быть вопросом компромисса между производительностью и удобством. - person sehe; 27.07.2020
comment
Кстати: если вам нужно нужен только логический код возврата, просто используйте intersects конечно. coliru.stacked-crooked.com/a/94995b94b20d1c63 - person sehe; 27.07.2020
comment
Почему кто-то может подумать, что полезно предоставить только один? Нужны как логическое значение, так и точка пересечения. - person ravenspoint; 27.07.2020
comment
Гы. Я под судом? Это стандарт. Это даже не то, что придумала Boost Geometry (ранее GSL). Они следовали спецификации OGC. Он довольно хорошо зарекомендовал себя. Мне неудобно лениво разглагольствовать о вещах, о которых я не могу судить. Я предполагаю, что есть довольно веские причины. Если вы немного погрузитесь в этот стандарт, вы, вероятно, узнаете секретный ключ. Или вы можете задать вопрос в списке рассылки библиотеки? - person sehe; 27.07.2020
comment
О, может быть, небольшое обратное разглагольствование: в функциональном/математическом смысле у вас уже есть оба варианта идеального ввода: в любом случае ни одно пересечение не является математически фактически пустым пересечением. Зачем изображать одну и ту же информацию избыточно? Интерфейс идеален. (Версия предиката, вероятно, существует как оптимизация, потому что она может быть реализована с помощью умных общих коэффициентов матрицы отношений - отказ от ответственности, я просто болтаю о некоторых деталях спецификации, которые я видел однажды) - person sehe; 27.07.2020
comment
Извиняюсь. Я не думал, что разглагольствую. Могут ли два коротких предложения составить разглагольствование? Что я надеялся сделать, так это дать представление о проблемах, с которыми сталкивается реальный пользователь реальной библиотеки, который пытается добиться чего-то в реальном мире, используя вашу библиотеку. - person ravenspoint; 27.07.2020
comment
Справедливости ради, весь вопрос показался немного разглагольствованным :) Три восклицательных знака часто являются хорошим признаком этого. Никакого вреда. Я не против соответствовать уровню, играя в адвоката дьявола. - person sehe; 27.07.2020
comment
О, и :blush: это не моя библиотека. Я всего лишь отшельник, живущий на StackOverflow — ускорение обучения ради удовольствия и выгоды! - person sehe; 27.07.2020
comment
На самом деле, я так сильно, так долго и так часто ударялся пальцами ног/головой об эти стены, что лучше понял, когда дело было в плохом дизайне библиотеки (смотрю на вас, Boost Process) или в отличном фокусе на ценности (Boost GIL). , ты ужасная хозяйка, ты хороша внутри!) - person sehe; 27.07.2020
comment
Возможно, это не ваша библиотека, но вы, похоже, единственный человек, который имеет хоть какое-то представление о том, как заставить ее работать. - person ravenspoint; 28.07.2020
comment
@ravenspoint Я думаю, ты имеешь в виду это как комплимент, но почему-то это кажется неправильным. Как бы то ни было: другие ведущие пользователи намного лучше разбираются (и некоторые на самом деле разработчики библиотек). Я просто более активен на SO. Да, и я упоминал их список рассылки? - person sehe; 28.07.2020