获取CGAL多边形交点的顶点号

时间:2019-03-04 16:58:03

标签: c++ performance cgal

我想高效地创建一个相交的多边形的顶点编号列表。为了检查是否稍微移动多边形,我可以检查它是相同的交集还是完全不同的交集。大概如果列表中至少有一个顶点号,则它是相同的交点。

因此,我在t = 0处有多边形P和Q相交,这应该给我P的顶点编号[1,2,3]和多边形Q的顶点编号[2],请参见图像进行澄清。在t = 1时,对于P,我将得到[1,2],对于Q,我将得到[2]。

Intersecting polygons at two timesteps

当前,我首先检索交点,然后两个多边形都在顶点之间循环,并使用has_on_boundary函数确定它是否是交点的一部分并存储顶点号。查看代码:

//Standard Includes
#include <iostream>
using std::cout;
using std::endl;

//Include CGAL options
#define CGAL_HEADER_ONLY 1 //Defining to use the CGAL library as header only
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Boolean_set_operations_2.h>
#include <CGAL/Constrained_Delaunay_triangulation_2.h>

//Typedefs for CGAL Uses.
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;
typedef std::vector<Polygon_with_holes_2>               Pwh_list_2;

int main() {
    Polygon_2 P;
    P.push_back(Point_2(-1, 1));
    P.push_back(Point_2(-0.01, -1));
    P.push_back(Point_2(0, -1));
    P.push_back(Point_2(0.01, -1));
    P.push_back(Point_2(1, 1));

    Polygon_2 Q;
    Q.push_back(Point_2(-1, -1));
    Q.push_back(Point_2(1, -1));
    Q.push_back(Point_2(0, 1));

    Pwh_list_2 polygon_intersections;
    CGAL::intersection(P, Q, std::back_inserter(polygon_intersections));
    //For ease now only assume one intersection
    Polygon_2 intersection = polygon_intersections[0].outer_boundary();

    //Get vertex number of P in intersection
    int vertex_nr = 0;
    std::set<int> overlapping_vertices_P;
    cout << "Find intersection vertices of Polygon P" << endl;
    for (auto it = P.vertices_begin(); it != P.vertices_end(); ++it, ++vertex_nr)   {
        if (intersection.has_on_boundary(*it)) {
            overlapping_vertices_P.insert(vertex_nr);
            cout << vertex_nr << endl;
        }
    }

    //Get vertex number of Q in intersection
    vertex_nr = 0;
    std::set<int> overlapping_vertices_Q;
    cout << "Find intersection vertices of Polygon Q" << endl;
    for (auto it = Q.vertices_begin(); it != Q.vertices_end(); ++it, ++vertex_nr)   {
        if (intersection.has_on_boundary(*it)) {
            overlapping_vertices_Q.insert(vertex_nr);
            cout << vertex_nr << endl;
        }
    }
    return 0;
}

问题:它可行,但对我来说似乎效率很低。有更好的方法吗?

任何帮助或建议都将受到高度赞赏。

0 个答案:

没有答案