gpt4 book ai didi

cgal - 是否有 CGAL 函数可以检查点是否在带孔的线性多边形内?

转载 作者:行者123 更新时间:2023-12-04 08:52:11 28 4
gpt4 key购买 nike

我想检查一个点是否位于带孔的多边形内部或外部。具体来说,我感兴趣的是给定点是否位于带孔多边形的“填充区域”内;如果该点位于孔内,我会认为它位于带孔的多边形之外。
我知道有一个 CGAL 函数 check_inside检查点是否位于多边形内(没有孔)。还有一个CGAL函数connect_holes绘制从多边形中每个孔中的最高顶点到多边形本身的路径。我可以看到使用这些函数的两种解决方法来实现我的目标,但我想知道是否有直接执行此操作的 CGAL 函数。

最佳答案

oriented_side() CGAL::General_polygon_set_2<> 的成员函数。显然,还有一个免费(重载)函数(由于某种原因没有记录)。

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Boolean_set_operations_2.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
typedef CGAL::Polygon_2<Kernel> Polygon_2;
typedef CGAL::Polygon_with_holes_2<Kernel> Polygon_with_holes_2;

# define nice(os) ((os == CGAL::ON_ORIENTED_BOUNDARY) ? "on boundary" : \
(os == CGAL::POSITIVE) ? "inside" : "outside")

int main() {
Polygon_2 hole;
hole.push_back(Point_2(1, 1));
hole.push_back(Point_2(1, 2));
hole.push_back(Point_2(2, 2));
hole.push_back(Point_2(2, 1));

Polygon_2 out;
out.push_back(Point_2(0, 0));
out.push_back(Point_2(3, 0));
out.push_back(Point_2(3, 3));
out.push_back(Point_2(0, 3));

Polygon_with_holes_2 pwh(out, &hole, &hole+1);
std::cout << pwh << std::endl;

auto os = CGAL::oriented_side(Point_2(0, 0), pwh);
std::cout << "(0,0) is : " << nice(os) << std::endl;
os = CGAL::oriented_side(Point_2(0.5, 0.5), pwh);
std::cout << "(0,0) is : " << nice(os) << std::endl;
os = CGAL::oriented_side(Point_2(1, 1), pwh);
std::cout << "(0,0) is : " << nice(os) << std::endl;
os = CGAL::oriented_side(Point_2(2.5, 2.5), pwh);
std::cout << "(0,0) is : " << nice(os) << std::endl;
os = CGAL::oriented_side(Point_2(3, 3), pwh);
std::cout << "(0,0) is : " << nice(os) << std::endl;
os = CGAL::oriented_side(Point_2(3.5, 3.5), pwh);
std::cout << "(0,0) is : " << nice(os) << std::endl;
return 0;
}

关于cgal - 是否有 CGAL 函数可以检查点是否在带孔的线性多边形内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64046074/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com