确定point是否在boost :: geometry :: linear_ring会计方向内

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了确定point是否在boost :: geometry :: linear_ring会计方向内相关的知识,希望对你有一定的参考价值。

我想确定点是否在boost::geometry的多边形内。

我使用函数boost::geometry::within并输入boost::geometry::linear_ring<boost::geometry::point_2d>来指定轮廓。

如果我不需要考虑轮廓的方向,那么一切正常。 但就我而言,我想要考虑方向。我的意思是,如果特定轮廓的内部区域被认为受其边界和有限的限制,那么倒置轮廓的内部区域应该是无限的 - 与初始轮廓的区域互补。

是否可以在within函数中考虑轮廓的方向?

它可以用以下代码表示:

// Create contour which defines square
boost::geometry::linear_ring<boost::geometry::point_2d> contour;
contour.push_back(boost::geometry::point_2d(4, 2));
contour.push_back(boost::geometry::point_2d(2, 2));
contour.push_back(boost::geometry::point_2d(2, 4));
contour.push_back(boost::geometry::point_2d(4, 4));
contour.push_back(boost::geometry::point_2d(4, 2));

// Create contour which defines square with opposite direction.
boost::geometry::linear_ring<boost::geometry::point_2d> contourInverted = contour;
std::reverse(contourInverted.begin(), contourInverted.end());

// Specify point inside square
boost::geometry::point_2d testPoint(3, 3);

// Perform tests
bool ret1 = boost::geometry::within(testPoint, contour);
bool ret2 = boost::geometry::within(testPoint, contourInverted);

执行上面的代码后,ret1ret2都是true。但我会有ret1 != ret2

一般来说,当qazxsw poi用于任何qazxsw poi时,我需要获得功能上的功能(当点正好在边界或多边形退化等时,我不考虑边界情况......)

我试过ret1 != ret2传递给testPoint,但我没有得到我需要的东西。

似乎我需要或类似的功能在different strategies中的某处实现,因为boost::geometry::within具有带孔的多边形的示例。但我还没有意识到如何将它用于我的情况。

还有一个非常简单的解决方法。我只需编写一个代码来确定轮廓的方向。然后我根据轮廓方向否定或不是boost::geometry函数的结果。但如果documetation for within已经实现,我不想复制它。

答案

AFAIK,Boost.Geometry和Boost.Polygon都没有使用您定义的“无限”区域。它们可以处理带有孔的多边形甚至是这些多边形的集合。

您可以考虑添加一个限制宇宙的大矩形。然后,您可以将倒置轮廓定义为此矩形中的孔。

顺便说一句,在许多情况下,人们可以避免将盒子转换成轮廓。 Boost.Geometry提供了一个适配器“box_view”,允许使用框,就好像它是一个(正向)轮廓。

至于任意轮廓的方向,可能最简单的方法是计算其面积。另一方面,对于结构良好的环,方向在编译时是已知的,由元函数within提供,详情请见boost::geometry

另一答案

几点评论:

  • 在Boost.Geometry中没有traits::point_order,有here
  • bg::linear_ring<>是Boost.Geometry中称为环的模型,它是一个面几何,一个没有孔的简单多边形。
  • 环与OGC LinearRing不同,它是一个面(2d)几何,它有一个方向。 OGC LinearRing是1d,没有方向。
  • 通过传递第二个模板参数,可以在编译时设置bg::model::ring<>的方向,请参阅bg::model::ring<>
  • bg::model::ring<>函数为反转面(笛卡尔)几何返回的值是负区域(不是无限)。但并非所有函数都适用于反转几何,因为库通常认为它们无效。

在Boost.Geometry中,数据必须反映几何的编译时设置,在这种情况下是在编译时为Ring设置的方向。否则结果可能是意外的。在您的情况下,返回相同的值。在将几何体传递给其他函数之前,可以调用this自动校正方向和闭合。您也可以调用area()来检查几何体是否一切正常。

因此,如果要检查点是否与几何体的内部重叠,则可以调用bg::correct()。如果你想检查一个点是在边界上还是在外部重叠,那么bg::is_valid()应该返回你需要的东西,这当然是显而易见的。

如果你想考虑边界,那么检查一个点是否与内部或边界重叠,那么你可以使用within(pt, ring)!within(pt, ring)covered_by(pt, ring)。显然,在这种情况下的补充可能是!disjoint(pt, ring)intersects(pt, ring)!covered_by(pt, ring)

在Pt / Ring的情况下,内部使用相同的代码来检查所有这些空间关系,因此调用哪一个无关紧要。

以上是关于确定point是否在boost :: geometry :: linear_ring会计方向内的主要内容,如果未能解决你的问题,请参考以下文章

boost::this_thread::interruption_point() 不会抛出 boost::thread_interrupted& 异常

是否可以为 boost::random::uniform_int_distribution<> 设置确定性种子?

Boost.Python 列出所有暴露的类和属性

确定一个 POINT 是不是位于 LINESTRING 上的两个其他 POINT 之间(SQL Server 2008 Geography)

如何查询 Voronoi 图?

使用 boost 库查找交点