在点和多边形上使用内部方法的麻烦
Boost::geometry Trouble in using within method on point and polygons?
似乎我在正确使用boost几何库(boost::geometry:多边形质心的计算)时遇到了麻烦。我非常感谢你对我之前问题的帮助,我想问一些关于boost::geometry::within方法的问题,回答一个几何是否包含在另一个几何中。
我在我的代码中使用它来检查一个点是否包含在一个多边形中,我遇到了奇怪的结果,其中一个点绝对不应该在一个多边形内,但该方法在调用时仍然返回True
。
我正在考虑我在声明多边形时遗漏的一个微妙之处,我真的很想确定这个问题。虽然反复查看我的代码,但我在调试方面缺乏想法,感觉就像一个狭窄的视野。这就是为什么我想在这个特定的例子中有一个提示:
我的点有坐标:221.703 , 256
多边形的坐标为:
266.158 256
266.447 256.5
267.024 256.5
267.313 257
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;
}
当您使用bg::model::polygon<point, false, true>
时,您正在定义一个使用point
作为其点类型的多边形,该多边形的点按逆时针顺序排列,并且关闭(意思是它的最后一个点等于它的第一个点)。如果你"关闭"多边形或使用开放多边形,bg::within
的行为似乎是你所期望的:
在Coliru上运行
#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;
}
相关文章:
- 方法内部但循环仍得到预期的不合格id错误C++
- 在C++中更改结构内部元素的方法?
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 如何在JNI中从线程内部调用JAVA方法
- 方法c++内部出现异常
- 正确的方法是什么?调用指针到指针到指针内部的函数?
- 使用虚拟变量对 std::vector 内部循环进行切片的最佳方法
- C++:访问对象内部子对象的方法
- C++类内部结构动态分配的方法
- C 是什么是在结构内部洗牌的最有效方法
- C++ - 在单独的文件中实现内部模板类的模板方法
- 电子内部或外部方法创建自己的右键单击上下文菜单 - Windows
- gmock-模拟对象及其内部模拟方法
- Sendmessage在方法定义内部无法正常工作
- 在静态方法内部使用函数时,会出现LNK2019未解析的外部
- 从构造函数中本地声明的device_vector使用device_vector::data()方法初始化结构内部的指针是
- 内联方法:类定义内部与外部类定义
- 有什么方法可以在工会内部获得受保护的声明吗
- 在点和多边形上使用内部方法的麻烦
- 类内部C++方法的定义,如Java