【CGALDotNet】CGAL的C#封装(C#调用编译好的CGAL的dll)

介绍

开源项目出处(两个模块):
链接1:https://github.com/Scrawk/CGALDotNet/tree/master?tab=readme-ov-file
链接2:https://github.com/Scrawk/CGALDotNetGeometry

该项目提供了编译的、封装相关接口后的CGAL库,可供C#直接调用,无需自行编译CGAL。可根据需要封装更多接口。

快速开始

为了快速创建示例,直接使用编译好的dll:

  1. 下载编译好的CGAL的dll、封装的CGAL调用接口的dll:链接3:https://github.com/Scrawk/CGALDotNet/tree/master/Binaries,其框架版本为.net core3.1。
    共包含5个dll:
  • CGALDotNet.dll (对CGAL的C#封装接口,源码位于上文链接1)
  • CGALDotNetGeometry.dll (对CGAL的C#封装接口,源码位于上文链接2)
  • CGALWrapper.dll (CGAL的编译结果,源码位于上文链接1)
  • gmp.dll (其他第三方库)
  • mpfr-6.dll (其他第三方库)
  1. 创建框架版本为.net core3.1的控制台项目。
  2. 测试代码(判断三点是否共线):
using CGALDotNet;
using CGALDotNetGeometry.Numerics;
using System;

namespace CTestCore31
{
    public class Program
    {
        static void Main(string[] args)
        {
            var p1 = new Point2d(1, 0);
            var p2 = new Point2d(2, 0);
            var p3 = new Point2d(3, 0);
            var p4 = new Point2d(3, 1);

            var isCollinear = CGALGlobal.Collinear(p1, p2, p3);
            Console.WriteLine(isCollinear);//True
            var isCollinear2 = CGALGlobal.Collinear(p1, p2, p4);
            Console.WriteLine(isCollinear2);//False
            Console.ReadLine();
        }
    }
}

更多示例

更多示例请参考上文链接1中的子目录:https://github.com/Scrawk/CGALDotNet/tree/master/CGALDotNetTest
下面列出一些示例。

矢量

两个矢量之间的角度

var t2 = new Vector2d(1, 1);
var u2 = new Vector2d(1, 0);
var v2 = new Vector2d(0, 1);
var w2 = new Vector2d(-1, 1);

Assert.AreEqual(CGALGlobal.Angle(t2, u2), ANGLE.ACUTE);//锐角
Assert.AreEqual(CGALGlobal.Angle(u2, v2), ANGLE.RIGHT);//直角
Assert.AreEqual(CGALGlobal.Angle(w2, u2), ANGLE.OBTUSE);//钝角

计算三个点的重心

var p = new Point2d(0, 0);
var q = new Point2d(1, 0);
var r = new Point2d(1, 1);

var bc = CGALGlobal.Barycenter(p, q, r);
bc.Round(2);

Assert.AreEqual(0.67, bc.x);
Assert.AreEqual(0.33, bc.y);

线

计算两点的垂直平分线

var p = new Point3d(1, 0, 0);
var q = new Point3d(0, 1, 0);
Assert.AreEqual(CGALGlobal.Bisector(p, q), new Line2d(2, -2, 0));//2x -2y + 0 = 0 => y = x

多边形

创建简单凸多边形

在这里插入图片描述

var points = new Point2d[]
{
    new Point2d(0, 0),
    new Point2d(5, 0),
    new Point2d(5, 5),
    new Point2d(0, 5)
};

var poly = new Polygon2<EEK>(points);

Assert.AreEqual(4, poly.Count);//点数
Assert.IsTrue(poly.IsSimple);//简单多边形
Assert.IsTrue(poly.IsCounterClockWise);//逆时针的点顺序
Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);//正负方向
Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);//时针方向
Assert.IsTrue(poly.FindIfConvex());//凸多边形

创建简单凹多边形

在这里插入图片描述

var points = new Point2d[]
{
    new Point2d(0,0),
    new Point2d(5.1,0),
    new Point2d(1,1),
    new Point2d(0.5,6)
};

var poly = new Polygon2<EEK>(points);

Assert.AreEqual(4, poly.Count);
Assert.IsTrue(poly.IsSimple);
Assert.IsTrue(poly.IsCounterClockWise);
Assert.IsTrue(poly.Orientation == ORIENTATION.POSITIVE);
Assert.IsTrue(poly.ClockDir == CLOCK_DIR.COUNTER_CLOCKWISE);
Assert.IsFalse(poly.FindIfConvex());

创建非简单多边形

多边形存在自相交情况。
在这里插入图片描述

public void CreateNonSimplePolygon()
{
    var points = new Point2d[]
    {
        new Point2d(0, 0),
        new Point2d(8, 4),
        new Point2d(8, 0),
        new Point2d(0, 4),
    };

    var poly = new Polygon2<EEK>(points);

    Assert.AreEqual(4, poly.Count);
    Assert.IsFalse(poly.IsSimple);
    Assert.IsTrue(poly.IsDegenerate);
    Assert.IsTrue(poly.Orientation == ORIENTATION.ZERO);
    Assert.IsTrue(poly.ClockDir == CLOCK_DIR.ZERO);

}

判断多边形包含点

在这里插入图片描述

var points = new Point2d[]
{
    new Point2d(0, 0),
    new Point2d(5, 0),
    new Point2d(5, 5),
    new Point2d(0, 5)
};

var poly = new Polygon2<EEK>(points);

var p1 = new Point2d(0, 0);
var p2 = new Point2d(2, 2);
var p3 = new Point2d(6, 0);

Assert.IsTrue(poly.ContainsPoint(p1));
Assert.IsTrue(poly.ContainsPoint(p2));
Assert.IsFalse(poly.ContainsPoint(p3));

创建简单带洞多边形

在这里插入图片描述

var points = new Point2d[]
{
    new Point2d(0, 0),
    new Point2d(5, 0),
    new Point2d(5, 5),
    new Point2d(0, 5)
};
var holePoints = new Point2d[]
{
    new Point2d(1, 1),
    new Point2d(2, 1),
    new Point2d(3, 3),
    new Point2d(1, 2)
};//洞的点坐标序列必须是逆时针的

var poly = new PolygonWithHoles2<EIK>(points);
var holePoly = new Polygon2<EIK>(holePoints);
poly.AddHole(holePoly);

var area = poly.FindArea(POLYGON_ELEMENT.BOUNDARY);//计算不含洞的面积
var area2 = poly.FindArea(POLYGON_ELEMENT.HOLE);//计算洞的面积

Assert.IsTrue(area == 25);
Assert.IsTrue(area2 == 2);

对CGAL的支持情况

CGALDotNet和CGALDotNetGeometry并未提供CGAL所有的对象和功能接口,所实现的接口参考https://github.com/Scrawk/CGALDotNet/tree/master?tab=readme-ov-file,翻译如下:

  • 基础

    • 数字类型
    • 特征矩阵
    • CGAL对象
    • CGAL全局函数
    • Unity扩展
  • 几何

    • 数值
    • 图形
    • 对象
    • 相交
  • 多边形

    • 多边形对象
    • 带洞多边形对象
    • 多边形布尔运算
    • 多边形Minkowski(闵可夫斯基和)
    • 多边形偏移
    • 多边形简化
    • 多边形可视性
    • 多边形分割
  • 三角剖分(Triangulation)

    • 三角剖分2D
    • 三角剖分3D
  • 排列(Arrangements)

    • 排列2D
    • 扫描线2D
  • 多面体(Polyhedra)

    • 多面体网格
    • 网格处理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; int uniquePaths(int m, int n) {long long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return ans; }

“Unite“ > MacOS下很不错的网站转应用App的工具

前言 前不久在浏览mac论坛&#xff0c;无意了解到一款非常好的工具&#xff0c;可以将网站转换为app&#xff0c;考虑到我们现在的主要应用都从本地客户端转成web形式使用&#xff0c;但基于本能的使用习惯&#xff0c;还是希望有个快捷的访问信息&#xff0c;这个应用非常适合…

万兆以太网MAC设计(11)完整UDP协议栈仿真

文章目录 前言一、模块接口二、IP模块与ARP模块之间的联系三、整体协议栈仿真总结&#xff1a; 前言 目前除了巨帧处理逻辑之外&#xff0c;所有的准备工作都已经结束了&#xff0c;先进行整体的功能验证。 一、模块接口 所有模块接口皆采用AXIS数据流的形式&#xff0c;其中…

IDEA基于Maven构建项目

IDEA基于Maven构建项目 一、Maven简介 Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中心信息中管理项目的构建、报告和文档。 Apache Maven 可以用于构建和管理任何基于 Java 的项目。 下载地址…

【Web】D^3CTF之浅聊d3pythonhttp——TE-CL请求走私

目录 step0 题目信息 step1 jwt空密钥伪造 step1.5 有关TE&CL的lab step2 TE-CL请求走私 payload1 payload2 step0 题目信息 注意到题目源码前端是flask写的&#xff0c;后端是web.py写的 frontend from flask import Flask, request, redirect, render_templat…

C#核心之面向对象-封装

面向对象-封装 文章目录 1、类和对象1、什么是类2、类的声明3、类声明语法4、类声明实例5、对象(类)6、实例化对象语法7、实例化对象 2、成员变量和访问修饰符1、成员变量2、访问修饰符3、成员变量的使用和初始值 3、成员方法1、成员方法声明2、成员方法的使用 4、构造函数和…

【工具类安装教程】IDEA Ui设计器JFormDesigner

1、下载插件 File->Settings->Plugins->JFormDesigner 2、注册教程 2.1注册机下载 链接&#xff1a;https://pan.baidu.com/s/1Rb1EMva5HIYbyBcYgCxIsw 提取码&#xff1a;6666 2.2找到目录 1、找到idea目录 2.3进入plugins目录 找到在JFormDesigner文件夹下lib文…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…

jenkins汉化不完全问题解决

jenkins安装完Localization:Chinese(Simplified)中文语言包后&#xff0c;发现是出现汉化不完全或者部分汉化的情况&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 启动命令中指定语言 -Duser.languageen_US.UTF-8 或者 -Duser.languageC.UTF-8原因分析&#xff1a;安…

用户中心(下)

文章目录 计划登录逻辑接口简单说明cookie和session写代码流程后端逻辑层控制层测试用户管理接口 前端简化代码对接后端代理 计划 开发完成后端登录功能 &#xff08;单机登录 > 后续改造为分布式 / 第三方登录&#xff09;✔开发后端用户的管理接口 &#xff08;用户的查询…

南方Southmap4.0 一体成图软件

SouthMap 4.0 新增行业应用模块&#xff0c;实用工具箱扩展7大工具&#xff0c;集结8大模块&#xff0c;共45种实用功能&#xff0c;为水利、电力、道路施工等多应用场景提供数据生产的一站式解决方案。 SouthMap 4.0 新增行业应用模块&#xff0c;实用工具箱扩展7大工具&#…

前端素材库

大家好我是苏麟 , 今天推荐一个前端素材库 . 官网 : iconfont-阿里巴巴矢量图标库 这期就到这里 , 下期见!

【docker】docker compose 搭建私服

安装 Docker Registry 创建目录 mkdir -pv /usr/local/docker/registrymkdir -pv /usr/local/docker/data 创建 docker-compose.yml文件 进入目录创建docker-compose.yml cd /usr/local/docker/registrytouch docker-compose.yml 编辑docker-compose.yml vim docker-compo…

探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

目录 目录 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 洗牌算法 准备工作 买一副牌 洗牌 发牌 测试整体 &#x1f3af;&#x1f3af;很重要的一点 杨辉三角 总结 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ …

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

PaLmTac嵌入软体手手掌的视触觉传感器

触觉是感知和操作之间的桥梁。触觉信息对于手部行为反馈和规划具有重要意义。软体手的柔性特性在人机交互、生物医学设备和假肢等方面具有潜在应用的优势。本文提出了一种名为 PaLmTac的嵌入软体手手掌的视触觉传感器&#xff08;vision-based tactile sensor, VBTS&#xff09…

使用 BurpSuite 基于 Token 机制实施暴力破解

前言 Token是一种用于身份验证和授权的令牌&#xff0c;通常由服务器生成并发送给客户端&#xff0c;客户端在后续的请求中携带该令牌来进行身份验证和授权操作。Token的使用可以增强应用程序的安全性&#xff0c;避免了直接传递敏感凭证&#xff08;如用户名和密码&#xff0…

Gradle 进阶学习之 Gradle插件

1、使用插件的原因 使用插件是现代自动化构建工具中一个非常重要的概念&#xff0c;Gradle 作为其中一个流行工具&#xff0c;通过插件提供了多种便利。以下是使用插件的几个主要原因&#xff1a; 促进代码重用 减少重复代码&#xff1a;插件允许你重用在不同项目中执行相同功…

Linux中gcc/g++的使用

文章目录 前言gcc/g 前言 gcc和g即为编译器。其中gcc为c语言的编译器&#xff0c;只能编译c语言&#xff1b;g为c的编译器&#xff0c;既能编译c语言&#xff0c;又能编译c。 在前面的文章中&#xff0c;我们提到代码转换成可执行程序需要经过 预处理&#xff08;进行宏替换)…

ID决策树的构造原理

前言 &#x1f3f7;️&#x1f3f7;️本章开始学习有关决策树的相关知识&#xff0c;决策树是一种树形模型&#xff0c;也是一种常用的分类和回归方法。本章我们首先介绍第一种决策树的构造原理 学习目标 了解决策树算法的基本思想掌握 ID3 决策树的构建原理 1.决策树介绍 …