使用Delaunay三角剖分解决求多边形面积的问题

朋友那边最近有个需求,需要框选一个选区,然后根据选区中的点求出面积。并且让我尝试用Delaunay来解决

似乎音译过来应该是德诺类

 

大致如下:

 

我在github上找了一个可以用的Delaunay库

https://gist.github.com/miketucker/3795318

(补充:我的Delaunay三角剖分实现:https://www.cnblogs.com/hont/p/15310157.html)

 

但是需要注意这个只能针对凸多边形创建三角面。

 

因为创建出来的始终是三角面,把顶点顺序除以3进行遍历

然后根据差乘求平行四边形面积的方法,得到总面积

复制代码
using UnityEngine;
using System.Linq;
using System.Collections;

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class DelaunayTest : MonoBehaviour
{
    public Transform[] points;
    MeshFilter meshFilter;
    Triangulator tr;


    void Start()
    {
        meshFilter = GetComponentInChildren<MeshFilter>() as MeshFilter;
    }

    void Update()
    {
        tr = new Triangulator();
        meshFilter.mesh = tr.CreateInfluencePolygon(points.Select(m => new Vector2(m.localPosition.x, m.localPosition.z)).ToArray());
        var vertices = meshFilter.mesh.vertices;
        var triangles = meshFilter.mesh.triangles;
        var vertexCount = meshFilter.mesh.triangles.Length;
        var finalArea = 0f;

        for (int i = 0; i < meshFilter.mesh.triangles.Length; i += 3)
        {
            var a = vertices[triangles[i]];
            var b = vertices[triangles[i + 1]];
            var c = vertices[triangles[i + 2]];

            finalArea += Area(a, b, c);
        }

        Debug.Log("Final Area: " + finalArea);
    }

    float Area(Vector3 p1, Vector3 p2, Vector3 p3)
    {
        float area = Vector3.Cross(p2 - p1, p3 - p2).magnitude * 0.5f;

        return area;
    }
}
复制代码

 

 

posted @   HONT  阅读(1160)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2015-02-20 scut客户端心跳超时和客户端断开测试
点击右上角即可分享
微信分享提示
回到顶部