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

news2024/11/25 10:41:48

介绍

开源项目出处(两个模块):
链接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)

    • 多面体网格
    • 网格处理

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

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

相关文章

纯js对比excel小工具

如何使用JavaScript和xlsx.js实现Excel文件对比&#xff1a;实战指南 在日常办公或数据分析工作中&#xff0c;我们经常需要比较两个Excel文件中的数据差异。手动对比不仅耗时费力&#xff0c;还容易出错。本文将带你通过一个简单的网页应用&#xff0c;利用JavaScript和开源库…

Spring AI聊天功能开发

一、引入依赖 继承父版本的springboot依赖&#xff0c;最好是比较新的依赖。 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePat…

transformer上手(10)—— 文本摘要任务

文本摘要是一个 Seq2Seq 任务&#xff0c;尽可能保留文本语义的情况下将长文本压缩为短文本。 文本摘要可以看作是将长文本“翻译”为捕获关键信息的短文本&#xff0c;因此大部分文本摘要模型同样采用 Encoder-Decoder 框架。当然&#xff0c;也有一些非 Encoder-Decoder 框架…

低代码技术在构建质量管理系统中的应用与优势

引言 在当今快节奏的商业环境中&#xff0c;高效的质量管理系统对于组织的成功至关重要。质量管理系统帮助组织确保产品或服务符合客户的期望、符合法规标准&#xff0c;并持续改进以满足不断变化的需求。与此同时&#xff0c;随着技术的不断进步&#xff0c;低代码技术作为一…

Linux系统编程---线程池并发服务器

模型原理分析&#xff1a; 线程池的关键优势在于它减少了每次任务执行时创建和销毁线程的开销 线程池的组成主要分为 3 个部分&#xff0c;这三部分配合工作就可以得到一个完整的线程池&#xff1a; 1. 任务队列&#xff0c;存储需要处理的任务&#xff0c;由工作的线程来处理…

python代码实现kmeans对鸢尾花聚类

导入第三方库和模型 from sklearn import datasets import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans2、创建画图函数 def draw_result(train_x, labels, cents, title):n_clusters np.unique(labels).shape[0]#获取类别个数color …

esp32s3使用psram后音频播报不了的问题解决记录

idf.py menuconfig开启psram后会报错 提示需要打补丁&#xff1a; 根据提示切换到IDF_PATH目录&#xff0c;然后执行git apply %ADF_PATH%/ida_patches/idf5.0_freertos.patch打补丁。 再次编译提示如下错误&#xff1a; assert failed: spi_flash_disable_interrupts_cach…

嵌入式学习,方法、交流很重要

关注、星标公众号&#xff0c;直达精彩内容 ID&#xff1a;技术让梦想更伟大 整理&#xff1a;李肖遥 Who Am I 大家好&#xff0c;我是「逍遥的小蜜圈」星球的星主&#xff0c;如果大家关注我早一点&#xff0c;一定看了我的简单的自我介绍&#xff0c;关于我 — 聊聊自己的经…

【Python网络爬虫】python爬虫用正则表达式进行数据清洗与处理

&#x1f517; 运行环境&#xff1a;PYTHON &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

QT学习篇—qt软件安装

qt下载网址http://download.qt.io/new_archive/qt/ QT官网Qt | Tools for Each Stage of Software Development LifecycleAll the essential Qt tools for all stages of Software Development Lifecycle: planning, design, development, testing, and deployment.https:…

CSS样式特异性5层次详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

FANUC机器人SOCKET断开KAREL程序编写

一、添加一个.KL文件创建编辑断开指令 添加一个KL文件用来创建karel程序中socket断开指令 二、断开连接程序karel代码 PROGRAM SOC_DIS %COMMENT SOCKET断开 %INCLUDE klevccdf VAR str_input,str_val : STRING[20] status,data_type,int_val : INTEGER rel_val : REALBEGING…

全球首发!龙蜥社区助力 Intel SPR 加速器上云

编者按&#xff1a;云原生平台下芯片的竞争力日渐增强&#xff0c;加速器如何在赛道上体现竞争力。龙蜥社区开发者、阿里云高级研发工程师易兴睿介绍运用龙蜥操作系统提供的解决方案&#xff0c;依靠 Intel SPR 平台专用硬件加速器&#xff0c;实现云原生场景下 Envoy 网关加速…

微信小程序 request 配置了服务器域名后 发布体验版无法访问

问题描述 在微信小程序公众平台配置了测试服务器域名后&#xff0c;发布了体验版进行测试&#xff0c;发现网络请求不通&#xff0c;打开调试也依然无法访问。 解决步骤&#xff1a; 1.首先根据小程序文档网络模块的使用说明&#xff0c;一步步排查域名证书是否符合规范&…

Llama3 mac本地部署教程

1.下载的软件清单&#xff1a; ollama下载&#xff1a; Download Ollama on macOS nodejs下载&#xff1a; Node.js — Download Node.js 2.安装 安装Ollama 下载之后打开&#xff0c;直接点击Next以及Install安装ollama到命令行。安装完成后界面上会提示ollama run llam…

在Docker中部署Java应用:Java版本隔离的实践案例

在Docker中部署Java应用&#xff1a;Java版本隔离的实践案例 人生就是一场又一场的相遇&#xff0c;一个明媚&#xff0c;一个忧伤&#xff0c;一个华丽&#xff0c;一个冒险&#xff0c;一个倔强&#xff0c;一个柔软&#xff0c;最后那个正在成长。 背景需求 在软件开发和部…

18 python定制篇-开发平台Ubuntu

第 18 章Linux 之 Python 定制篇-Python 开发平台 Ubuntu 18.1 Ubuntu 介绍 Ubuntu&#xff08;友帮拓、优般图、乌班图&#xff09;是一个以桌面应用为主的开源 GNU/Linux 操作系统&#xff0c;Ubuntu 是基于 GNU/Linux&#xff0c; 支持 x86、amd64&#xff08;即 x64&…

PG修改端口号与error: could not connect to server: could not connect to server 问题解决

刚开始学习PG修改端口号之后数据库端口号没变。 修改端口号&#xff1a;/usr/local/pgsql/data中的postgresql.conf中 修改后并不能直接生效需要重启PG&#xff1a; /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/logfile restart重启后新…

如何免费生成文本二维码?文字生成二维码的方法

随着信息技术的不断发展&#xff0c;文本二维码作为一种简便、高效的信息分享方式&#xff0c;受到了越来越多人的关注和应用。文本二维码是将文本信息编码成二维码的形式&#xff0c;通过扫描二维码即可快速获取文本内容&#xff0c;为信息分享和传播提供了全新的可能性。 便…

美富特 | 邀您参加2024全国水科技大会暨技术装备成果展览会

王涛 四川美源环能科技有限公司 技术总监 报告题目&#xff1a;绿色智慧水岛如何助力工业园区污水及再生水资源化利用降碳增效 拥有十余年的环保行业从业经验&#xff0c;对各类前沿物化、生化及膜技术均有丰富的研发、设计及应用经验&#xff0c;先后参与多项重点核心技术…