几何,路口 [英] Geometry, intersection

查看:168
本文介绍了几何,路口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题。我想相交四有四。

I have a problem. I would like to intersect a quad with a quad.

int main(){
  typedef boost::geometry::model::point_xy<double> TBoostPoint;
  typedef boost::geometry::model::polygon<TBoostPoint> TBoostPoly;
  TBoostPoint point;
  TBoostPoly firstPoly, secondPoly;
  boost::geometry::read_wkt("POLYGON(
                (1.504477611940313, 3.761194029850755), 
                (1.504477611940305, 3.573134328358203),
                (1.316417910447765, 3.573134328358206),
                (1.316417910447769, 3.761194029850752))", firstPoly);
  boost::geometry::read_wkt("POLYGON(
                (1.504477611940313, 3.761194029850755), 
                (1.504477611940305, 3.573134328358203),
                (1.316417910447765, 3.573134328358206),
                (1.316417910447751, 3.761194029850769))", secondPoly);
 std::vector<TBoostPoly> outPoly;
 boost::geometry::intersection(firstPoly,secondPoly,outPoly);
}

outPoly - 是空的,但它并非如此。

outPoly - is empty, but it not so.

推荐答案

有两个主要的问题。

输出不确定,因为输入是无效的。

The output is undefined because the input is invalid.


  1. 输入WKT指定的,而不是你所期望的大量无效内圈(包括单点)的,5分(不含收盘点位)的单外圈。修复:

  1. The input WKT specifies a lot of invalid inner rings (consisting of single points), instead of what you expected, a single outer ring of 5 points (excl. closing point). Fix it:

bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447769 3.761194029850752))", first);
bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447751 3.761194029850769))", second); 


  • 几何加速整个假设你从不对文件preconditions错误。如果您在多边形概念页和preconditions读路口你会看到thew全list¹。

  • Boost Geometry assumes throughout that you never make errors against the documented preconditions. If you read in the polygon concept page and preconditions for intersection you'll see thew full list¹.

    如果你没有,你没有友好的错误,只是无声的故障,损坏或者只是错误的答案。是啊。这是不好的。

    If you don't, you get no friendly errors, just silent failure, corruption or just wrong answers. Yeah. That's bad.

    更糟的是,BGeo甚至没有一个 is_valid 工具来测试大量的需求,直到升压1_57(IIRC)。好消息是,如果升级到该版本或更高版本你的生活就会简单得多。

    What's worse, BGeo didn't even have a is_valid facility to test the bulk of requirements until Boost 1_57 (IIRC). The good news is, if you upgrade to this version or later your life will be much simpler.

    在这种情况下,你会了解到,多边形没有正确关闭:

    In this case you would have learned that the polygons weren't properly closed:

    <大骨节病> 住在Coliru

    #include <boost/geometry.hpp>
    #include <boost/geometry/geometries/point_xy.hpp>
    #include <boost/geometry/geometries/polygon.hpp>
    #include <boost/geometry/geometries/multi_polygon.hpp>
    #include <boost/geometry/io/io.hpp>
    #include <boost/geometry/algorithms/intersection.hpp>
    #include <boost/geometry/algorithms/correct.hpp>
    #include <boost/geometry/algorithms/is_valid.hpp>
    
    namespace bg = boost::geometry;
    
    int main(){
        typedef bg::model::d2::point_xy<double> TPoint;
        typedef bg::model::polygon<TPoint>      TPoly;
        TPoly first, second;
    
        bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447769 3.761194029850752))", first);
        bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447751 3.761194029850769))", second); 
    
        std::string reason;
        // polys not closed!
        if (!bg::is_valid(first, reason))  std::cout << "First polygon not valid: "  << reason << "\n";
        if (!bg::is_valid(second, reason)) std::cout << "Second polygon not valid: " << reason << "\n";
    
        bg::correct(first);
        bg::correct(second);
    
        // no more output!
        if (!bg::is_valid(first, reason))  std::cout << "First polygon not valid: "  << reason << "\n";
        if (!bg::is_valid(second, reason)) std::cout << "Second polygon not valid: " << reason << "\n";
    
        std::vector<TPoly> out;
        bg::intersection(first, second, out);
    
        for (auto& g : out)
            std::cout << "\nresult: " << bg::wkt(g) << "\n";
    }
    

    打印:

    First polygon not valid: Geometry is defined as closed but is open
    Second polygon not valid: Geometry is defined as closed but is open
    

    哎呀。在GEOS不营业! 正确的(多)自动驾驶修复了这个对我们来说:

    Oops. The geos weren't closed! correct(poly) fixes this for us on auto-pilot:

    result: POLYGON((1.50448 3.57313,1.31642 3.57313,1.31642 3.76119,1.50448 3.76119,1.50448 3.57313))
    


    ¹外环必须是逆时针,顺时针内,多边形必须被关闭......类似的东西。


    ¹ outer ring must be counter clockwise, inner cw, polys must be closed... stuff like that.

    这篇关于几何,路口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆