关于图形学中生成三角形库Triangle.Net的下载及简单使用

背景

Triangle.NET 是生成 2D(约束)Delaunay 三角剖分和点集或平面直线图的高质量网格。此库是基于 Jonathan Richard Shewchuk 的 Triangle 项目,主要用于图形学像Opengl(或Unity3D)中生成三角形使用。

下载

Triangle.Net是基于C#语言的库,下载有两种方式
一种方式 :可以下载源码自己生成Triangle.dll库,github地址下载代码后解压在VS中生成Triangle.dll,然后可以用在自己的项目中。
另一种方式 :本人下载代码生成的Triangle.dll库,传送门链接: 传送门 提取码: cxw7

使用

1.生成Triangle.dll后,写一个小demo测试一下,vs中创建一个窗体应用项目

2.创建完成后,添加项目引用,将Triangle.dll引用至项目中,如图

3.在Form.cs中使用Triangle.dll生成并绘制,具体思路步骤:

  1. 由于是Form测试,并非Opengl绘制,因此先创建一个Graphics画板
csharp 复制代码
 Graphics g = e.Graphics;
 // 创建一个位图对象
 Bitmap bitmap = new Bitmap(200, 200);
 // 获取位图的绘图上下文
 Graphics bitmapGraphics = Graphics.FromImage(bitmap);
  1. 使用Triangle.dll库计算三角形的点
    创建一个多变形对象--》输入约束点(周围一圈点)==》对多边形进行三角化 =》
    提取三角形化后的点
csharp 复制代码
         private List<Vertex> GetMeshPoints()
         {
            // 创建一个输入几何对象
            Polygon input = new Polygon();
            List<Vertex> resPointList = new List<Vertex>();
            List<Vertex> pointList = new List<Vertex>();

            // 添加顶点列表1
            pointList.Add(new Vertex(0, 0));
            pointList.Add(new Vertex(150, 0));
            pointList.Add(new Vertex(150, 100));
            pointList.Add(new Vertex(100, 100));
            pointList.Add(new Vertex(100, 50));
            pointList.Add(new Vertex(50, 50));
            pointList.Add(new Vertex(50, 100));
            pointList.Add(new Vertex(0, 100));
            
            //添加顶点列表2
            pointList.Add(new Vertex(0, 0));
            pointList.Add(new Vertex(150, 0));
            pointList.Add(new Vertex(150, 100));
            pointList.Add(new Vertex(100, 100));
            //pointList.Add(new Vertex(100, 50));
            pointList.Add(new Vertex(50, 50));
            pointList.Add(new Vertex(50, 100));
            pointList.Add(new Vertex(0, 100));

            //添加点及约束边
            for (int i = 0; i < pointList.Count; i++)
            {
                input.Add(pointList[i]);
                if (i == pointList.Count - 1)
                {
                    input.Add(new Segment(pointList[i], pointList[0]));
                }
                else
                {
                    input.Add(new Segment(pointList[i], pointList[i + 1]));
                }
            }

            // 创建网格使用默认的网格划分器进行网格划分
            var mesh = input.Triangulate();

            // 输出结果
            foreach (ITriangle t in mesh.Triangles)
            {
                resPointList.Add(t.GetVertex(0));
                resPointList.Add(t.GetVertex(1));
                resPointList.Add(t.GetVertex(2));

                //Console.WriteLine($"Triangle: {t.GetVertex(0).X},{t.GetVertex(0).Y}, {t.GetVertex(1).X},{t.GetVertex(1).Y}, {t.GetVertex(2).X},{t.GetVertex(2).Y}");
            }

            return resPointList;
        }
复制代码
3)因为这里使用的画板,我们将三角形三个点进行连接即可看到生成的三角形
csharp 复制代码
List<Vertex> points = GetMeshPoints();
if (points.Count > 0)
{
    for (int i = 0; i < points.Count; i = i + 3)
       {
           bitmapGraphics.DrawLine(Pens.Black, (float)points[i].X, (float)points[i].Y, (float)points[i + 1].X, (float)points[i + 1].Y);
           bitmapGraphics.DrawLine(Pens.Black, (float)points[i].X, (float)points[i].Y, (float)points[i + 2].X, (float)points[i + 2].Y);
           bitmapGraphics.DrawLine(Pens.Black, (float)points[i + 1].X, (float)points[i + 1].Y, (float)points[i + 2].X, (float)points[i + 2].Y);
        }
}

这里需要注意的是生成三角形,与输入的约束点顺序息息相关,生成三角形组成整个轮廓线就是输入约束点连起来,代码中例子如图所示:

总结

以上就是Triangle.dll的简单使用,其实就是输入约束点,然后生成对应三角形。如果想填充不规则三角形,就可以对三角形进行绘制,但其实Opengl中也有现有的绘制不规则多变形方法,如下:

cpp 复制代码
 GL.Begin(PrimitiveType.Polygon);
 for (int i = 0; i < vec2fClipOutlines.Count; i++)
 {
     visVec2f v2f = vec2fClipOutlines[i];
     GL.Vertex2(v2f.x, v2f.y);
 }
 GL.Vertex2(vec2fClipOutlines[0].x, vec2fClipOutlines[0].y);
 GL.End();

原理一样,将Triangle例子中约束点设置给Opengl,Opengl会自动生成三角形并填充,所以如果单纯不规则多边形填充可以使用Opengl自带函数,需要注意的是约束点也需要自动闭合

相关推荐
不可求~8 小时前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
别动我齐刘海19 小时前
机器人运动控制学习2——基础进阶
c++·人工智能·神经网络·学习·目标检测·机器学习·机器人
傻啦嘿哟20 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅21 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
闻道且行之21 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv
莫浅子1 天前
day01-USB架构与枚举
c++·单片机·嵌入式驱动
小欣加油1 天前
leetcode3069 将元素分配到两个数组中I
数据结构·c++·算法·leetcode·职场和发展
不会代码的小猴1 天前
7. JSON
开发语言·c++·笔记·qt·算法·json
沫璃染墨1 天前
《Qt从零入门系列(六):信号与槽进阶——从多种连接方式到Lambda表达式》
开发语言·c++·qt·代码规范·设计规范·qt5
小小龙学IT1 天前
ZeroMQ(libzmq)开源消息库深度解析:brokerless 时代的轻量消息内核
c++·开源