CGAL安装到验证到深入

news2024/11/19 2:28:39

1、安装CGAL

Win10下VS配置CGAL-5.3.1(下载、安装、VS属性表配置)+ 测试代码_cgal下载_孙 悟 空的博客-CSDN博客

2、CGAL验证练习

#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_cartesian<double> Kernel; //笛卡尔坐标(cartesian)double型
typedef Kernel::Point_2 Point_2;			   //_2 :2维
typedef Kernel::Segment_2 Segment_2;
int main()
{
	Point_2 p(1, 1), q(10, 10);
	std::cout << "p = " << p << std::endl;
	std::cout << "q = " << q.x() << " " << q.y() << std::endl;
	//使用CGAL::squared_distance(p, q)来计算点p和q之间的平方距离,并打印这个值。
	std::cout << "sqdist(p,q) = "
		<< CGAL::squared_distance(p, q) << std::endl;
	Segment_2 s(p, q);
	Point_2 m(5, 9);
	std::cout << "m = " << m << std::endl;
	//使用CGAL::squared_distance(s, m)来计算线段s与点m之间的平方距离,并打印这个值。这个距离是指点m到线段s上最近的点的距离。
	std::cout << "sqdist(Segment_2(p,q), m) = "
		<< CGAL::squared_distance(s, m) << std::endl;
	std::cout << " midpoint(p,q) = " << CGAL::midpoint(p, q) << std::endl;
	return 0;
}

3、CGAL深入学习(一)

c++ - CGAL的使用 - Linux/Windows下工具使用notes - SegmentFault 思否

4、二维线段相交

// 包括所需的头文件来使用CGAL的几何和交集功能
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/intersections.h>

// 定义一个精确的内核(Kernel),这在CGAL中是非常常见的。
typedef CGAL::Exact_predicates_exact_constructions_kernel K;
typedef K::Point_2 Point_2;  // 为二维点定义一个类型别名
typedef K::Line_2 Line_2;    // 为二维线定义一个类型别名
typedef K::Intersect_2 Intersect_2;  // 为交点函数定义一个类型别名

int main()
{
    // 定义两条二维直线 lina 和 linb。
    // 这些直线是在它们的参数形式 ax + by + c = 0 中定义的,其中 (a, b) 是线上的方向向量,c 是常数。
    Line_2 lina(1, 1, 2);     // 表示直线 x + y + 2 = 0
    Line_2 linb(1, -1, 1);    // 表示直线 x - y + 1 = 0

    // 求两条线的交点。
    // 如果交点存在,它将被存储在变量result中。
    CGAL::cpp11::result_of<Intersect_2(Line_2, Line_2)>::type
        result = intersection(lina, linb);

    // 检查两条线是否相交
    if (result)
    {
        // 如果相交,获取交点。
        // 由于交点可能是一个点或一个线段(如果两条线重叠),所以我们使用boost::get来检索点。
        const Point_2* p = boost::get<Point_2 >(&*result);

        // 如果交点是一个点,打印它。
        if (p) {
            std::cout << *p << std::endl;
        }
    }

    system("pause");  // 在Windows系统上暂停程序,等待用户按键。
    return 0;
}

 5、三维线段相交

// 包括所需的头文件来使用CGAL的几何和交集功能
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/intersections.h>

// 定义一个精确的内核(Kernel)。在CGAL中使用该内核可以确保计算的准确性。
typedef CGAL::Exact_predicates_exact_constructions_kernel K;
typedef K::Point_3 Point_3;  // 为三维点定义一个类型别名
typedef K::Line_3 Line_3;    // 为三维线定义一个类型别名
typedef K::Intersect_3 Intersect_3;  // 为交点函数定义一个类型别名

int main()
{
    // 定义直线lina的起点和终点
    Point_3 linea_b(0, 0, 0);
    Point_3 linea_e(1, 1, 1);

    // 定义直线linb的起点和终点
    Point_3 lineb_b(0, 1, 0);
    Point_3 lineb_e(1, 0, 1);

    // 通过起点和终点创建两条三维直线lina和linb
    Line_3 lina(linea_b, linea_e);
    Line_3 linb(lineb_b, lineb_e);

    // 计算两条直线的交点
    CGAL::cpp11::result_of<Intersect_3(Line_3, Line_3)>::type
        result = intersection(lina, linb);

    // 检查两条直线是否有交点
    if (result)
    {
        // 如果有交点,获取交点。
        // 由于交点可能是一个点或一个线(如果两条线重叠)或没有(如果线是平行的),所以我们使用boost::get来检索点。
        const Point_3* p = boost::get<Point_3>(&*result);

        // 如果交点是一个点,打印它。
        if(p) {
            std::cout << *p << std::endl;
        }
    }
    return 0;
}

6、求二维直线和二维三角形的交点和数量

// 包括CGAL库中所需的头文件以进行准确的几何计算、交点检测和二维三角形的表示
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/intersections.h>
#include <CGAL/Triangle_2.h>

// 定义一个精确的内核(Kernel)。在CGAL中使用该内核可以确保计算的准确性。
typedef CGAL::Exact_predicates_exact_constructions_kernel K;
typedef K::Point_2 Point_2;       // 为二维点定义一个类型别名
typedef K::Line_2 Line_2;         // 为二维直线定义一个类型别名
typedef K::Intersect_2 Intersect_2;  // 为交点函数定义一个类型别名
typedef K::Triangle_2 Triangle_2; // 为二维三角形定义一个类型别名
typedef K::Segment_2 Segment_2;   // 为二维线段定义一个类型别名

int main()
{
    // 定义一个二维直线line。直线方程为y = 1。
    Line_2 line(0, -1, 1);

    // 定义一个二维三角形triangle,顶点为(0,0),(2,0)和(1,1.732)。
    Triangle_2 triangle(Point_2(0, 0), Point_2(2, 0), Point_2(1, 1.732));

    // 计算直线line与三角形triangle的交点
    CGAL::cpp11::result_of<Intersect_2(Line_2, Triangle_2)>::type
        result = intersection(line, triangle);

    // 检查是否有交点
    if (result) {
        // 交点存在

        // 检查交点是否为一个点
        if (const Point_2* p = boost::get<Point_2>(&*result)) {
            std::cout << "Points intersect:" << std::endl;
            std::cout << *p << std::endl; // 输出交点
        }
        else {
            // 如果不是点,那么交点是一个线段
            std::cout << "Segment intersect:" << std::endl;
            const Segment_2* s = boost::get<Segment_2>(&*result);
            std::cout << *s << std::endl; // 输出交线段
        }
    }
    else {
        // 交点不存在
        std::cout << "None intersection!" << std::endl;
    }

    system("pause");  // 在Windows系统上暂停程序,等待用户按键。
    return 0;
}

7、生成两个随机三角形并计算它们的交集

// 引入CGAL库中的各种头文件
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/point_generators_2.h>
#include <CGAL/random_polygon_2.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Boolean_set_operations_2.h>
#include <list>

// 定义精确内核和其相关类型
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::list<Polygon_with_holes_2>                   Pwh_list_2;

// 定义不精确内核和其相关类型
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
// 使用前面定义的Point_2类型
typedef std::list<Point_2>                         Container;
// 使用前面定义的Polygon_2类型
typedef CGAL::Random_points_in_square_2< Point_2 > Point_generator;

// 引入打印工具
#include "print_utils.h"

int main() {
    Polygon_2 triangle1;
    Polygon_2 triangle2;

    // 使用随机生成器生成两个随机三角形,并插入triangle1和triangle2中
    CGAL::random_polygon_2(3, std::back_inserter(triangle1),
        Point_generator(2));
    CGAL::random_polygon_2(3, std::back_inserter(triangle2),
        Point_generator(2));

    // 打印这两个随机三角形
    std::cout << triangle1 << std::endl;
    std::cout << triangle2 << std::endl;

    // 计算两个三角形的交集,并保存在intR列表中
    Pwh_list_2                  intR;
    Pwh_list_2::const_iterator  it;
    CGAL::intersection(triangle1, triangle2, std::back_inserter(intR));

    // 打印交集结果
    std::cout << "The intersection:" << std::endl;
    for (it = intR.begin(); it != intR.end(); ++it) {
        std::cout << "--> ";
        print_polygon_with_holes(*it);
    }

    return 0;
}
// 保护宏,防止头文件被重复包含
#ifndef CGAL_PRINT_UTILS_H
#define CGAL_PRINT_UTILS_H

// 引入必要的头文件
#include <CGAL/Polygon_with_holes_2.h>
#include <iostream>

// 函数模板:打印一个CGAL多边形
template<class Kernel, class Container>
void print_polygon(const CGAL::Polygon_2<Kernel, Container>& P)
{
    // 使用常量迭代器遍历多边形的所有顶点
    typename CGAL::Polygon_2<Kernel, Container>::Vertex_const_iterator  vit;

    std::cout << "[ " << P.size() << " vertices:"; // 打印顶点数量
    for (vit = P.vertices_begin(); vit != P.vertices_end(); ++vit) // 遍历每个顶点
        std::cout << " (" << *vit << ')'; // 打印顶点坐标
    std::cout << " ]" << std::endl;

    return;
}

// 函数模板:打印带孔的多边形
template<class Kernel, class Container>
void print_polygon_with_holes
(const CGAL::Polygon_with_holes_2<Kernel, Container>& pwh)
{
    // 判断多边形是否是有界的
    if (!pwh.is_unbounded())
    {
        std::cout << "{ Outer boundary = ";
        print_polygon(pwh.outer_boundary()); // 打印外部边界
    }
    else
        std::cout << "{ Unbounded polygon." << std::endl; // 如果是无界的,打印提示信息

    // 使用常量迭代器遍历所有的孔
    typename CGAL::Polygon_with_holes_2<Kernel, Container>::
        Hole_const_iterator  hit;
    unsigned int k = 1; // 用于计数孔的编号

    std::cout << "  " << pwh.number_of_holes() << " holes:" << std::endl; // 打印孔的数量
    for (hit = pwh.holes_begin(); hit != pwh.holes_end(); ++hit, ++k) // 遍历每个孔
    {
        std::cout << "    Hole #" << k << " = ";
        print_polygon(*hit); // 打印孔的边界
    }
    std::cout << " }" << std::endl;

    return;
}

// 结束保护宏
#endif

8、两个2D多边形之间的布尔操作(即并集和交集)

// 引入必要的头文件
#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;
typedef std::list<Polygon_with_holes_2> Pwh_list_2;

// 函数模板:用于打印CGAL多边形
template<class Kernel, class Container>
void print_polygon(const CGAL::Polygon_2<Kernel, Container>& P)
{
    typename CGAL::Polygon_2<Kernel, Container>::Vertex_const_iterator  vit;

    std::cout << "[ " << P.size() << " vertices:";
    for (vit = P.vertices_begin(); vit != P.vertices_end(); ++vit)
        std::cout << " (" << *vit << ')';
    std::cout << " ]" << std::endl;
}

// 函数模板:打印带孔多边形
template<class Kernel, class Container>
void print_polygon_with_holes(const CGAL::Polygon_with_holes_2<Kernel, Container>& pwh)
{
    if (!pwh.is_unbounded()) {
        std::cout << "{ Outer boundary = ";
        print_polygon(pwh.outer_boundary());
    }
    else
        std::cout << "{ Unbounded polygon." << std::endl;

    typename CGAL::Polygon_with_holes_2<Kernel, Container>::Hole_const_iterator  hit;
    unsigned int k = 1;

    std::cout << "  " << pwh.number_of_holes() << " holes:" << std::endl;
    for (hit = pwh.holes_begin(); hit != pwh.holes_end(); ++hit, ++k) {
        std::cout << "    Hole #" << k << " = ";
        print_polygon(*hit);
    }
    std::cout << " }" << std::endl;
}

int main()
{
    // 定义多边形P,并赋值
    Polygon_2 P;
    P.push_back(Point_2(0, 0));
    P.push_back(Point_2(1000, 0));
    P.push_back(Point_2(1000, 1000));
    P.push_back(Point_2(0, 1000));

    // 定义多边形Q,并赋值
    Polygon_2 Q;
    Q.push_back(Point_2(500, 500));
    Q.push_back(Point_2(1500, 500));
    Q.push_back(Point_2(1500, 1500));
    Q.push_back(Point_2(500, 1500));

    // 计算多边形P和Q的并集,并显示结果
    Polygon_with_holes_2 unionR;
    if (CGAL::join(P, Q, unionR)) {
        std::cout << "The union: ";
        print_polygon_with_holes(unionR);
    }
    else
        std::cout << "P and Q are disjoint and their union is trivial." << std::endl;
    std::cout << std::endl;

    // 计算多边形P和Q的交集,并显示结果
    Pwh_list_2 intR;
    Pwh_list_2::const_iterator it;
    CGAL::intersection(P, Q, std::back_inserter(intR));
    std::cout << "The intersection:" << std::endl;
    for (it = intR.begin(); it != intR.end(); ++it) {
        std::cout << "--> ";
        print_polygon_with_holes(*it);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

800多个看图猜电视剧的含图的ACCESS\EXCEL数据库

虽然说看图猜什么是去年流行的一种手机游戏&#xff0c;但是这种游戏放置在任何年代都算是一种趣味之一&#xff0c;而今天看到一个800多的电视载图猜电视剧的内容&#xff0c;因此就弄下来&#xff0c;毕竟这种数据是永不过期的。 其实&#xff0c;实现迷惑字很简单&#xff0…

柔和舒适的瑜伽垫,设计时尚两面可用

日常健身的时候&#xff0c;瑜伽垫是个很实用的工具&#xff0c;可以大大提升健身时的舒适性&#xff0c;不过在选择瑜伽垫的时候也要注意质量&#xff0c;特别是像厚度、弹力、异味之类的细节&#xff0c;对平时使用的影响都很大。 目前我用的是一款莫比 联名扭蛋兔瑜伽垫&…

2023年前端面试真题之CSS篇

人的一生&#xff0c;总是难免有浮沉。不会永远如旭日东升&#xff0c;也不会永远痛苦潦倒。反复地一浮一沉&#xff0c;对于一个人来说&#xff0c;正是磨练。因此&#xff0c;浮在上面的&#xff0c;不必骄傲&#xff1b;沉在底下的&#xff0c;更用不着悲观。必须以率直、谦…

Knife4jInsight 1.0.0 MVP 版本发布

Knife4jInsight 1.0.0 MVP 版本发布 前言系统用户平台特性主要功能后期计划的功能 平台管理OpenAPI数据源接口文档自动i18n,支持中英双语微服务OpenAPI规范数据源自动注册上报整合开源swagger-ui组件&#xff0c;平台中可进行OpenAPI规范接口设计打通开源注册中心(Nacos\Eureka…

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样&#xff0c;它是独立安装和部署的&#xff0c;下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

ISP技术概述

原本或许是为了对冲手机系统和APP设计无力感而诞生的拍照功能,现今却成为了众手机厂家除背部设计外为数不多可“卷”的地方,自拍、全景、夜景、小视频等旺盛的需求让这一技术的江湖地位迅速变化。对圈内人士而言,这一波变化带来的后摄、双摄、多摄、暗光、防抖、广角、长焦、…

软件定制开发具有以下特点|APP搭建|小程序

软件定制开发具有以下特点|APP定制|小程序 一、快速响应用户需求 软件定制开发的优势在于&#xff0c;它可以快速响应用户的需求&#xff0c;因为它是在现有软件的基础上进行功能定制、界面定制、服务定制等改造&#xff0c;而不是从零开始进行重新设计与开发&#xff0c;所以…

Spring MVC 请求参数绑定

文章目录 默认⽀持 Servlet API 作为⽅法参数绑定简单类型参数绑定Pojo类型参数绑定⽇期类型参数&#xff08;需要配置⾃定义类型转换器&#xff09;路径变量参数 Spring MVC 是一个用于构建 Web 应用程序的框架&#xff0c;它提供了一种方便的方式来处理 HTTP 请求和响应。在 …

【java】【SpringBoot】【三】开发实用篇 基于SpringBoot整合任意第三方技术

目录 一、热部署 1、手动启动热部署 2、自动启动热部署 3、热部署范围配置 4、关闭热部署 二、配置高级 1、ConfigurationProperties 2、宽松绑定/松散绑定 3、常用计量单位绑定 4、数据校验 三、测试 1、加载测试专用属性 2、加载测试专用配置 3、web环境模拟测…

Delft3D水动力与泥沙运动模拟教程

详情点击公众号链接&#xff1a;Delft3D水动力与泥沙运动模拟教程 前沿 1.Delft3D水动力&#xff0d;泥沙模型的基本原理&#xff1b; 2.Delft3D模型正价曲线网格和边界条件构建方法&#xff1b; 3.Delft3D模型水动力及泥沙模块使用方法&#xff1b; 4.Delft3D模型泥沙运动…

数据库----- 数据库高级

1.2 多表查询分类 将多个表的数据横向的联合起来。 1、 内连接 2、 外连接 a) 左外连接 b) 右外连接 3、 交叉连接 4、 自然连接 1.2.1 内连接【inner join】 语法一&#xff1a;select 列名 from 表1 inner join 表2 on 表1.公共字段表2.公共字段语法二&#xff1a;select …

PMP考试如何报名?麻烦吗?

还是比较麻烦的&#xff0c;PMP考试不是国内的考试&#xff0c;要报两次名&#xff0c;报名条件也很严格&#xff0c;PMP考试报名需要先在PMI网站进行英文报名&#xff0c;英文报名成功后才能在中国国际人才交流基金会网站进行中文报名&#xff0c;具体说明如下。 一、PMP考试…

求链表的倒数第k个节点

思路&#xff1a;利用快慢指针空间差 代码&#xff1a; struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {// write code herestruct ListNode* slow pListHead;struct ListNode* fast pListHead;while(k--){if(fastNULL){return NULL;}fastfast->…

CentOS7.9安装mysql8.0

网上各种安装教程五花八门&#xff0c;各种报错&#xff0c;所以整理了一个完整版本&#xff0c;以下教程作者在2台新服务器测试安装均无问题。 一.下载mysql 下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 或者直接执行命令 wget htt…

乐观锁与悲观锁

概述 悲观锁总会假设最坏的情况&#xff0c;乐观锁总会假设最好的情况。悲观锁和乐观锁最终都是为了保证线程的安全&#xff0c;避免在并发场景下的资源竞争问题&#xff0c;但是&#xff0c;相对于乐观锁&#xff0c;悲观锁对性能的影响更大&#xff01; 悲观锁 共享资源每…

操作系统权限提升(二十六)之数据库提权-MySQL UDF提权

MySQL UDF提权 MySQL介绍 MySQL是最流行的开放源码SQL数据库管理系统&#xff0c;相对于Oracle&#xff0c;DB2等大型数据库系统&#xff0c;MySQL由于其开源性、易用性、稳定性等特点&#xff0c;受到个人使用者、中小型企业甚至一些大型企业的广泛欢迎&#xff0c;MySQL具有…

点大商城V2_2.5.0 全开源独立版 商家自营+多商户入驻 百度+支付宝+QQ+头条+小程序端+unipp开源前端

点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用&#xff0c;支持H5、微信公众号、微信小程序、头条小程序、支付宝小程序、百度小程序&#xff0c;本程序是点大商城V2独立版&#xff0c;包含全部插件&#xff0c;代码全开源&#xff0c;并且有VUE全端代码。分销&am…

log4j2原理分析及漏洞复现CVE-2021-44228

文章目录 log4j2原理分析及漏洞复现0x01 log4j2简介Log4j2 特点Log4j2组件的应用 0x02 CVE-2021-44228漏洞简介&#xff1a;漏洞适用版本漏洞原理lookup功能jndi解析器jndi是什么ldap服务RMI 0x03攻击过程0x04漏洞复现漏洞环境1.访问靶机2.dns回显验证3.将bash反弹shell命令编码…

职业观察|02:铁路维修师

高铁及地铁的发展&#xff0c;新生了许多之前没有的职位和专业。除了空乘/铁乘、安检人员等&#xff0c;大家可能相对熟悉。背后的维系工作人员其实也是一群更庞大的从业人员。本次主要介绍“铁路机务”。以下由一位铁路机务小哥讲述。 首先简单介绍一下铁路系统&#xff08;包…