Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Boost 增强几何体:尚未实现线段相交?_Boost_Intersection_Boost Geometry - Fatal编程技术网

Boost 增强几何体:尚未实现线段相交?

Boost 增强几何体:尚未实现线段相交?,boost,intersection,boost-geometry,Boost,Intersection,Boost Geometry,我正在尝试一个简单的测试:用Boost几何体计算两段的交点。它不编译。我还尝试了一些变体(int点代替浮点,2D代替3D),但没有任何改进 boost真的有可能不实现线段相交吗?或者我做错了什么?错过一些水电站算法“相交”和“相交”之间的混淆? 代码非常基本: #include <boost/geometry.hpp> #include <boost/geometry/geometries/point.hpp> #include <boost/geometry/ge

我正在尝试一个简单的测试:用Boost几何体计算两段的交点。它不编译。我还尝试了一些变体(int点代替浮点,2D代替3D),但没有任何改进

boost真的有可能不实现线段相交吗?或者我做错了什么?错过一些水电站算法“相交”和“相交”之间的混淆?

代码非常基本:

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/algorithms/intersection.hpp>

    typedef boost::geometry::model::point<float, 3, boost::geometry::cs::cartesian> testPoint;
    typedef boost::geometry::model::segment<testPoint> testSegment;

    testSegment s1(
        testPoint(-1.f, 0.f, 0.f),
        testPoint(1.f, 0.f, 0.f)
    );
    testSegment s2(
        testPoint(0.f, -1.f, 0.f),
        testPoint(0.f, 1.f, 0.f)
    );
    std::vector<testPoint> output;
    bool intersectionExists = boost::geometry::intersects(s1, s2, output);
#包括
#包括
#包括
#包括
typedef boost::geometry::model::point testPoint;
typedef boost::geometry::model::segment testSegment;
测试段s1(
测试点(-1.f,0.f,0.f),
测试点(1.f、0.f、0.f)
);
测试段s2(
测试点(0.f,-1.f,0.f),
测试点(0.f、1.f、0.f)
);
std::矢量输出;
bool intersectionExists=boost::geometry::intersects(s1,s2,输出);
但我在编译时通过Visual Studio发现以下错误:

- Error C2039   'apply' n'est pas membre de 'boost::geometry::dispatch::disjoint<Geometry1,Geometry2,3,boost::geometry::segment_tag,boost::geometry::segment_tag,false>'    CDCadwork   C:\Program Files\Boost\boost_1_75_0\boost\geometry\algorithms\detail\disjoint\interface.hpp 54  
- Error C2338   This operation is not or not yet implemented.   CDCadwork   C:\Program Files\Boost\boost_1_75_0\boost\geometry\algorithms\not_implemented.hpp   47  
-错误C2039'apply'n'est pas membre de'boost::geometry::dispatch::disjoint'CDCadwork C:\Program Files\boost\boost\u 1\u 75\u 0\boost\geometry\algorithms\detail\disjoint\interface.hpp 54
-错误C2338此操作未执行或尚未执行。CDCadwork C:\Program Files\Boost\Boost\u 1\u 75\u 0\Boost\geometry\algorithms\not\u implemented.hpp 47

确实存在两个问题:

  • 您正在与三维几何体相交。这还没有实现 相反,您可以对投影执行相同的操作

  • 您正在将一个“输出”几何体传递给
    intersects
    (它实际上只返回您选择的名称
    intersectionExists
    建议的真/假值)。在存在第三个参数的情况下,它将被用作一种策略-一个
    输出
    显然不满足的概念

    注意
    intersection
    始终返回true:-尽管这不是文档化接口的一部分

  • 由于几何图形通常投影到二维平面Z=0上:

    #include <boost/geometry.hpp>
    #include <boost/geometry/geometries/point.hpp>
    #include <boost/geometry/geometries/segment.hpp>
    #include <iostream>
    
    namespace bg = boost::geometry;
    namespace bgm = bg::model;
    
    using Point   = bgm::point<float, 2, bg::cs::cartesian>;
    using Segment = bgm::segment<Point>;
    
    int main() {
        Segment s1{{-1, 0}, {1, 0}};
        Segment s2{{0, -1}, {0, 1}};
    
        bool exists = bg::intersects(s1, s2);
    
        std::vector<Point> output;
        /*bool alwaysTrue = */ bg::intersection(s1, s2, output);
    
        std::cout << bg::wkt(s1) << "\n";
        std::cout << bg::wkt(s2) << "\n";
        for (auto& p : output) {
            std::cout << bg::wkt(p) << "\n";
        }
    
        return exists? 0:1;
    }
    
    LINESTRING(-1 0,1 0)
    LINESTRING(0 -1,0 1)
    POINT(0 0)