确定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);
执行上面的代码后,ret1
和ret2
都是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<> 设置确定性种子?
确定一个 POINT 是不是位于 LINESTRING 上的两个其他 POINT 之间(SQL Server 2008 Geography)