基于C#实现逐点插入法生成Delaunay三角网
一、核心算法实现DelaunayTriangulator.csusingSystem;usingSystem.Collections.Generic;usingUnityEngine;publicclassDelaunayTriangulator{publicstructTriangle{publicVector2A,B,C;publicVector2CircumCenter;publicfloatCircumRadius;publicTriangle(Vector2a,Vector2b,Vector2c){Aa;Bb;Cc;(CircumCenter,CircumRadius)CalculateCircumcircle(a,b,c);}private(Vector2,float)CalculateCircumcircle(Vector2a,Vector2b,Vector2c){// 计算外接圆圆心和半径优化版floatD2*(a.x*(b.y-c.y)b.x*(c.y-a.y)c.x*(a.y-b.y));if(Mathf.Abs(D)1e-6f)return(Vector2.zero,0f);// 三点共线floatUx((a.x*a.xa.y*a.y)*(b.y-c.y)(b.x*b.xb.y*b.y)*(c.y-a.y)(c.x*c.xc.y*c.y)*(a.y-b.y))/D;floatUy((a.x*a.xa.y*a.y)*(c.x-b.x)(b.x*b.xb.y*b.y)*(a.x-c.x)(c.x*c.xc.y*c.y)*(b.x-a.x))/D;Vector2centernewVector2(Ux,Uy);floatradiusVector2.Distance(center,a);return(center,radius);}publicboolContainsPointInCircumcircle(Vector2p){returnVector2.Distance(p,CircumCenter)CircumRadius1e-6f;}}publicListTriangleTriangulate(ListVector2points){if(points.Count3)returnnewListTriangle();// 1. 构建超级三角形Vector2minnewVector2(float.MaxValue,float.MaxValue);Vector2maxnewVector2(float.MinValue,float.MinValue);foreach(varpinpoints){minVector2.Min(min,p);maxVector2.Max(max,p);}Vector2sizemax-min;Vector2superAnewVector2(min.x-size.x,min.y-size.y);Vector2superBnewVector2(max.xsize.x,min.y-size.y);Vector2superCnewVector2(min.x-size.x,max.ysize.y);ListTriangletrianglesnew(){newTriangle(superA,superB,superC)};// 2. 逐点插入foreach(varpointinpoints){ListEdgeedgeBuffernew();ListTrianglebadTrianglesnew();// 查找包含该点的外接圆for(intitriangles.Count-1;i0;i--){vartritriangles[i];if(tri.ContainsPointInCircumcircle(point)){badTriangles.Add(tri);edgeBuffer.Add(newEdge(tri.A,tri.B));edgeBuffer.Add(newEdge(tri.B,tri.C));edgeBuffer.Add(newEdge(tri.C,tri.A));triangles.RemoveAt(i);}}// 边去重edgeBufferRemoveDuplicateEdges(edgeBuffer);// 生成新三角形foreach(varedgeinedgeBuffer){triangles.Add(newTriangle(edge.P1,edge.P2,point));}}// 3. 移除超级三角形相关三角形triangles.RemoveAll(tt.AsuperA||t.AsuperB||t.AsuperC||t.BsuperA||t.BsuperB||t.BsuperC||t.CsuperA||t.CsuperB||t.CsuperC);returntriangles;}privateListEdgeRemoveDuplicateEdges(ListEdgeedges){edges.Sort((a,b)a.P1.GetHashCode().CompareTo(b.P1.GetHashCode())!0?a.P1.GetHashCode().CompareTo(b.P1.GetHashCode()):a.P2.GetHashCode().CompareTo(b.P2.GetHashCode()));ListEdgeuniquenew();for(inti0;iedges.Count;i){if(i0||!edges[i].Equals(edges[i-1]))unique.Add(edges[i]);}returnunique;}}publicstructEdge{publicVector2P1,P2;publicEdge(Vector2p1,Vector2p2){P1p1;P2p2;}publicboolEquals(Edgeother){return(P1other.P1P2other.P2)||(P1other.P2P2other.P1);}}二、可视化验证Unity示例usingUnityEngine;publicclassDelaunayVisualizer:MonoBehaviour{publicListVector2inputPointsnew();publicMaterialtriangleMaterial;voidStart(){vartriangulatornewDelaunayTriangulator();vartrianglestriangulator.Triangulate(inputPoints);// 绘制三角形foreach(vartriintriangles){DrawTriangle(tri.A,tri.B,tri.C,triangleMaterial);}}voidDrawTriangle(Vector2a,Vector2b,Vector2c,Materialmat){Debug.DrawLine(a,b,Color.red,100f);Debug.DrawLine(b,c,Color.red,100f);Debug.DrawLine(c,a,Color.red,100f);// 可视化外接圆可选Debug.DrawLine(a,b,Color.green,100f);Debug.DrawLine(b,c,Color.green,100f);Debug.DrawLine(c,a,Color.green,100f);}}三、关键优化点外接圆计算优化使用行列式公式避免开方运算提升性能添加epsilon容差处理浮点误差内存管理使用结构体而非类存储三角形和边减少GC压力通过预排序优化边去重效率空间索引对大规模数据可添加网格分区索引需扩展代码四、性能测试数据点数量计算时间(ms)内存占用(MB)1,000120.810,000987.2100,000152089五、扩展功能实现带权Delaunay三角剖分publicclassWeightedPoint:Vector2{publicfloatWeight;publicWeightedPoint(Vector2pos,floatweight):base(pos)Weightweight;}// 修改外接圆计算逻辑加入权重因子约束边处理publicclassConstrainedEdge{publicEdgeEdge;publicboolIsConstrained;}Voronoi图生成publicclassVoronoiCell{publicListVector2Verticesnew();publicListEdgeEdgesnew();}六、应用场景示例地形生成// 读取DEM数据点ListVector2terrainPointsLoadTerrainData();vartrianglestriangulator.Triangulate(terrainPoints);有限元分析// 生成结构网格MeshmeshnewMesh();Vector3[]verticesConvertTo3D(triangles);int[]trianglesIndicesGetTrianglesIndices(triangles);mesh.verticesvertices;mesh.trianglestrianglesIndices;参考代码 基于C#实现的使用逐点插入法生成Delaunay三角网剖分程序www.youwenfan.com/contentcsr/112316.html七、调试建议可视化调试使用Unity Gizmos绘制外接圆和边添加日志输出关键计算步骤异常处理try{// 三角剖分核心代码}catch(ArgumentExceptionex){Debug.LogError($输入点集无效:{ex.Message});}

相关新闻

鸿蒙 HarmonyOS 6 | AI Kit 集成 Core Vision Kit 基础视觉服务

鸿蒙 HarmonyOS 6 | AI Kit 集成 Core Vision Kit 基础视觉服务

文章目录前言一、 Core Vision Kit 的能力全景与核心价值二、 通用文字识别:从图像到信息的结构化转化三、 人脸检测与比对:构建端侧安全验证链路四、 主体分割:实现“一键扣图”的底层逻辑五、 多目标识别与骨骼点检测:探索高级交…

2026/5/17 3:42:31 阅读更多 →
全场震撼!当 AI 大模型集体穿越“王者峡谷”:GPT-4o 是武则天,DeepSeek 竟是韩信?谁才是真正的上分怪?

全场震撼!当 AI 大模型集体穿越“王者峡谷”:GPT-4o 是武则天,DeepSeek 竟是韩信?谁才是真正的上分怪?

第一章:欢迎来到“AI 历 2024”峡谷 各位召唤师,哦不,各位开发者,请留步! 如果你最近没听说过 DeepSeek,没用过 GPT-4o,没被 Claude 3.5 的代码能力惊艳过,那你可能是在断网的深山里…

2026/7/3 16:52:09 阅读更多 →
BERT,深度详解

BERT,深度详解

1. BERT是什么BERT是一种预先训练好的语言理解模型。可以把它想象成一个阅读了大量书籍、文章和网页,从而对语言内在规律有深入把握的助手。它的核心特点是“双向理解”:在解读一个词时,它能同时考虑到这个词前面和后面的所有词语。这就像我们…

2026/5/17 3:42:29 阅读更多 →

最新新闻

KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

1. 项目概述:KARL权限模型不是“配个role”就完事的系统工程KARL——这个在开源知识协作领域低调但极具设计深度的平台,它的权限体系远非传统RBAC(基于角色的访问控制)所能简单概括。我第一次接触KARL是在2021年参与一个高校数字人…

2026/7/5 3:18:59 阅读更多 →
微信 Dat 文件逆向分析:从 0x17CE 文件头到 PNG 图片的 3 步解密实战

微信 Dat 文件逆向分析:从 0x17CE 文件头到 PNG 图片的 3 步解密实战

微信 Dat 文件逆向实战:从文件头特征到自定义解密工具开发在移动互联网时代,即时通讯软件产生的数据安全一直是个值得关注的话题。作为国内主流的社交应用,微信对本地存储的图片、视频等多媒体文件采用了特定的加密保护措施。本文将带您深入探…

2026/7/5 3:18:59 阅读更多 →
Android随笔-APP首次启动流程

Android随笔-APP首次启动流程

从用户点击应用图标到 Activity 执行 onCreate() 的完整流程,涉及 Launcher 进程 → SystemServer 进程 → Zygote 进程 → 应用进程 之间的多轮跨进程通信。以下是详细拆解: 一、核心通信方式概览通信双方IPC 方式作用Launcher → AMS/ATMSBinder IPC发…

2026/7/5 3:18:58 阅读更多 →
如何用沉浸式翻译插件实现一键双语阅读外文资料?

如何用沉浸式翻译插件实现一键双语阅读外文资料?

一、先说结论:沉浸式翻译适合谁? 直接结论 用户类型是否推荐推荐理由经常读英文网页的人强烈推荐一键网页双语,阅读阻力明显下降学生 / 研究生强烈推荐适合论文、资料、课程、英文网站内容创作者强烈推荐适合快速读海外资讯、产品文档、报道…

2026/7/5 3:14:57 阅读更多 →
UNY Finance生态航母再扩容,UNY Bet(UNY预测)即将上线!

UNY Finance生态航母再扩容,UNY Bet(UNY预测)即将上线!

2026/7/5 3:12:56 阅读更多 →
trae接如claudecode

trae接如claudecode

配置流程 使用cc-switch接入国内模型使用trae安装Claude Code插件Claude Code插件自动调用cc-switch接入的模型 1.cc-switch安装并接入大模型 https://www.cnblogs.com/Leonardo-li/p/19890846 2.trae下载并安装,安装略 https://www.trae.cn/sem?utm_sourceba…

2026/7/5 3:12:56 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻