C++ Boost::在点和多边形上使用内部方法时出现几何问题?

C++ Boost::在点和多边形上使用内部方法时出现几何问题?,c++,boost,boost-geometry,C++,Boost,Boost Geometry,似乎我在正确使用boost几何体库()时遇到了问题。我非常感谢您对我上一个问题的帮助,并想问一些关于boost::geometry::Inside方法的问题,回答一个几何体是否包含在另一个几何体中 我在我的代码中使用它来检查一个点是否包含在多边形中,我遇到了奇怪的结果,其中一个点肯定不应该在远处的多边形中,但调用该方法时仍然返回True 我正在考虑在声明多边形时缺少的一个微妙之处,我真的很想解决这个问题。虽然我来回地看我的代码,但我在调试这段代码时缺乏思路,感觉就像是一个地道的愿景。这就是为什么

似乎我在正确使用boost几何体库()时遇到了问题。我非常感谢您对我上一个问题的帮助,并想问一些关于boost::geometry::Inside方法的问题,回答一个几何体是否包含在另一个几何体中

我在我的代码中使用它来检查一个点是否包含在多边形中,我遇到了奇怪的结果,其中一个点肯定不应该在远处的多边形中,但调用该方法时仍然返回
True

我正在考虑在声明多边形时缺少的一个微妙之处,我真的很想解决这个问题。虽然我来回地看我的代码,但我在调试这段代码时缺乏思路,感觉就像是一个地道的愿景。这就是为什么我想对这个具体的例子给出一个提示:

我的点有坐标:
221.703256

多边形的坐标是,逐点:

266.158 256
266.447  256.5
267.024  256.5
二百六十七点三一三二五七
267.024  257.5
267.313 258

这显然不应该包含上面给出的观点

我很抱歉问这么迂腐的问题,但我真的很感谢任何愿意插手此事的人

我的代码:

#include <iostream>
#include <boost/geometry.hpp>

using namespace std;
namespace bg = boost::geometry;
typedef bg::model::point<float, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef bg::model::polygon<point, false, true> polygon;


int main(int argc, char * argv[]){
polygon pol;
pol.outer().push_back(point(266.158,256));
pol.outer().push_back(point(266.447,256.5));
pol.outer().push_back(point(267.024,256.5));
pol.outer().push_back(point(267.313,257));
pol.outer().push_back(point(267.024,257.5));
pol.outer().push_back(point(267.313,258));

double x = atof(argv[1]);
double y = atof(argv[2]);
cout << "Is inside: " << ((bg::within(point(x,y),pol)) ? "yes" : "no") << endl;
return 0;
}
#包括
#包括
使用名称空间std;
名称空间bg=boost::geometry;
typedef bg::model::point;
typedef bg::model::box;
typedef bg::model::polygon polygon;
int main(int argc,char*argv[]){
多边形pol;
pol.outer().向后推(点(266.158256));
pol.outer().向后推(点(266.447256.5));
pol.outer().向后推(点(267.024256.5));
pol.outer().向后推(点(267.313257));
pol.outer().向后推(点(267.024257.5));
pol.outer().向后推(点(267.313258));
双x=atof(argv[1]);
双y=atof(argv[2]);
cout使用时,您定义的多边形使用
作为其点类型,其点按逆时针顺序排列,并且闭合(表示其最后一个点等于其第一个点)。如果您的多边形或使用开放多边形时,
bg::in
的行为似乎是您所期望的:

#包括
#包括
使用std::cout;
使用std::endl;
名称空间bg=boost::geometry;
typedef bg::model::point;
typedef bg::model::box;
typedef bg::model::polygon closed_polygon;
typedef bg::model::polygon open_polygon;
int main(int argc,char*argv[])
{
{
闭多边形pol;
pol.outer().向后推(点(266.158256));
pol.outer().向后推(点(266.447256.5));
pol.outer().向后推(点(267.024256.5));
pol.outer().向后推(点(267.313257));
pol.outer().向后推(点(267.024257.5));
pol.outer().向后推(点(267.313258));
pol.outer().push_back(点(266.158256));//需要闭合多边形
双x=222;
双y=257;

首先,非常感谢您的贡献。我以前考虑过更改这些
typedef
参数,(我认为当将
closed
设置为
true
时,两个极端点不同,库正在为我关闭它)奇怪的是,当对一个简单的多边形(如正方形)使用相同的代码时,该函数在没有手动关闭的情况下工作正常。我需要掌握这一点。感谢您提供了方向,希望能找到解决方案;)
#include <iostream>
#include <boost/geometry.hpp>

using std::cout;
using std::endl;
namespace bg = boost::geometry;
typedef bg::model::point<float, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef bg::model::polygon<point, false, true> closed_polygon;
typedef bg::model::polygon<point, false, false> open_polygon;



int main(int argc, char * argv[])
{
    {
        closed_polygon pol;
        pol.outer().push_back(point(266.158,256));
        pol.outer().push_back(point(266.447,256.5));
        pol.outer().push_back(point(267.024,256.5));
        pol.outer().push_back(point(267.313,257));
        pol.outer().push_back(point(267.024,257.5));
        pol.outer().push_back(point(267.313,258));
        pol.outer().push_back(point(266.158,256));//you need to close the polygon

        double x = 222;
        double y = 257;
        cout << "Is " << bg::wkt<point>(point(x,y)) << " inside: " << ((bg::within(point(x,y),pol)) ? "yes" : "no") << endl;

        x = 267;
        y = 257;
        cout << "Is " << bg::wkt<point>(point(x,y)) << " inside: " << ((bg::within(point(x,y),pol)) ? "yes" : "no") << endl;
    }

    {
        open_polygon pol;
        pol.outer().push_back(point(266.158,256));
        pol.outer().push_back(point(266.447,256.5));
        pol.outer().push_back(point(267.024,256.5));
        pol.outer().push_back(point(267.313,257));
        pol.outer().push_back(point(267.024,257.5));
        pol.outer().push_back(point(267.313,258));

        double x = 222;
        double y = 257;
        cout << "Is " << bg::wkt<point>(point(x,y)) << " inside: " << ((bg::within(point(x,y),pol)) ? "yes" : "no") << endl;

        x = 267;
        y = 257;
        cout << "Is " << bg::wkt<point>(point(x,y)) << " inside: " << ((bg::within(point(x,y),pol)) ? "yes" : "no") << endl;
    }

    return 0;
}