CGAL 2D Polygons

CGAL 2D Polygons

简单概述 CGAL 2D Polygons使用。

简述

2D Polygon多边形是由一条封闭的边链表组成。对于多边形的操作有若干种常见的算法,有些算法要求多边形是简单多边形。如果边不相交,则多边形为简单多边形,除非连续的边相交于它们的公共顶点。

2d Polygons

常见的多边形算法:

  • 找出最左边、最右边、最上面和最下面的顶点。
  • 计算(有符号)面积。
  • 检查多边形是否为简单多边形。
  • 检查多边形是否为凸多边形。
  • 寻找到方向(顺时针或逆时针)。
  • 检查一个点是否位于多边形内。

所有这些操作都需要两个前向迭代器作为参数来描述多边形。这些形参的值类型与点类型相同。
Polygon_2 可用于表示多边形。多边形是动态的。顶点可以被修改、插入和删除。它们以成员函数的形式提供上述算法。此外,它们还提供了遍历顶点和边的方法。
Polygon_2 类是一个点容器的包装器,但仅此而已。特别是,计算值不会被缓存。也就是说,当 Polygon_2::is_simple() 成员函数被调用两次或两次以上时,每次都会重新计算结果。

示例

Polygon类

下面的例子创建了一个多边形,并说明了一些成员函数的用法。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
typedef CGAL::Polygon_2<K> Polygon_2;
using std::cout; using std::endl;
int main()
{
  Point points[] = { Point(0,0), Point(5.1,0), Point(1,1), Point(0.5,6)};
  Polygon_2 pgn(points, points+4);
  // check if the polygon is simple.
  cout << "The polygon is " <<
    (pgn.is_simple() ? "" : "not ") << "simple." << endl;
  // check if the polygon is convex
  cout << "The polygon is " <<
    (pgn.is_convex() ? "" : "not ") << "convex." << endl;
  return 0;
}

在这里插入图片描述

操作点序列的算法

下面的例子创建了一个多边形,并演示了一些操作点序列的全局函数的用法。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2_algorithms.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
using std::cout; using std::endl;
void check_inside(Point pt, Point* pgn_begin, Point* pgn_end, K traits)
{
    cout << "The point " << pt;
    switch (CGAL::bounded_side_2(pgn_begin, pgn_end, pt, traits)) {
    case CGAL::ON_BOUNDED_SIDE:
        cout << " is inside the polygon.\n";
        break;
    case CGAL::ON_BOUNDARY:
        cout << " is on the polygon boundary.\n";
        break;
    case CGAL::ON_UNBOUNDED_SIDE:
        cout << " is outside the polygon.\n";
        break;
    }
}
int main()
{
    Point points[] = { Point(0,0), Point(5.1,0), Point(1,1), Point(0.5,6) };
    // check if the polygon is simple.
    cout << "The polygon is "
        << (CGAL::is_simple_2(points, points + 4, K()) ? "" : "not ")
        << "simple." << endl;
    check_inside(Point(0.5, 0.5), points, points + 4, K());
    check_inside(Point(1.5, 2.5), points, points + 4, K());
    check_inside(Point(2.5, 0), points, points + 4, K());
    return 0;
}

在这里插入图片描述

3D空间中的多边形

有时,在3D数据上运行2D算法很有用。多边形可以是3D对象的轮廓,其中轮廓被组织为通过从扫描仪分割图像数据产生的平行切片。
为了避免在 xy 平面上的显式投影,可以使用traitProjection_traits_xy_3 ,它是2D和3D线性几何内核的一部分。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Projection_traits_yz_3.h>
#include <CGAL/Polygon_2_algorithms.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_3 Point_3;
int main()
{
  Point_3 points[4] = { Point_3(0,1,1), Point_3(0,2,1), Point_3(0,2,2), Point_3(0,1,2) };
  bool b =  CGAL::is_simple_2(points,
                              points+4,
                              CGAL::Projection_traits_yz_3<K>());
  if (!b){
    std::cerr << "Error polygon is not simple" << std::endl;
    return 1;
  }
  return 0;
}

将三维多边形投影到yz平面上,判断投影的多边形是否为简单多边形。

迭代遍历顶点和边

polygon类提供了 Polygon_2::vertices_begin()Polygon_2::vertices_end() 这样的成员函数来迭代顶点。它还提供了一个成员函数 Polygon_2::vertices() ,它返回一个range,主要用于现代的 for 循环。这同样适用于 Polygon_with_holes_2 类的边和孔。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Polygon_2<K>                                  Polygon_2;
typedef K::Point_2                                          Point_2;
typedef K::Segment_2                                        Segment_2;
int main()
{
  // create a polygon and put some points in it
  Polygon_2 p;
  p.push_back(Point_2(0,0));
  p.push_back(Point_2(4,0));
  p.push_back(Point_2(4,4));
  for(const Point_2& p : p.vertices()){
    std::cout << p << std::endl;
  }
  // As the range is not light weight, we have to use a reference
  const Polygon_2::Vertices& range = p.vertices();
  for(auto it = range.begin(); it!= range.end(); ++it){
    std::cout << *it << std::endl;
  }
  for(const Segment_2& e  : p.edges()){
    std::cout << e << std::endl;
  }
  return EXIT_SUCCESS;
}

在这里插入图片描述

绘制多边形

调用CGAL::draw()函数可以可视化多边形,如下面的例子所示。这个函数会打开一个显示给定多边形的新窗口。对这个函数的调用是阻塞的,也就是说,只要用户不关闭窗口,程序就会继续运行。Polygon_with_holes_2有一个版本,CGAL::draw<PH>()

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/draw_polygon_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Polygon_2<K>                                  Polygon_2;
typedef CGAL::Point_2<K>                                    Point;
int main()
{
	// create a polygon and put some points in it
	Polygon_2 p;
	p.push_back(Point(0, 0));
	p.push_back(Point(4, 0));
	p.push_back(Point(4, 4));
	p.push_back(Point(2, 2));
	p.push_back(Point(0, 4));
	CGAL::draw(p);
	return EXIT_SUCCESS;
}

在这里插入图片描述
该函数需要 CGAL_Qt5 ,并且仅在定义宏 CGAL_USE_BASIC_VIEWER 时可用。与cmake目标 CGAL::CGAL_Basic_viewer 连接将与 CGAL_Qt5 连接并添加定义 CGAL_USE_BASIC_VIEWER

CMakeLists.txt示例:

cmake_minimum_required(VERSION 3.1...3.23)
project(test)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
create_single_source_cgal_program("test.cpp")
if(CGAL_Qt5_FOUND)
  #link it with the required CGAL libraries
  target_link_libraries(test PUBLIC CGAL::CGAL_Basic_viewer)
endif()

示例demo

ploygon.wkt文件。

POLYGON((0 0,4 0,4 4,2 2,0 4))

在这里插入图片描述

参考

  1. https://doc.cgal.org/latest/Polygon/index.html
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值