C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码

本文主要是介绍C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 最小代价多边形三角剖分算法

凸多边形的三角剖分是通过在非相邻顶点(角点)之间绘制对角线来形成的,这样对角线就不会相交。问题是如何以最小的代价找到三角剖分的代价。三角剖分的代价是其组成三角形的权重之和。每个三角形的重量是其周长(所有边的长度之和)

请参阅以下来源的示例。

多项式三角

同一凸五边形的两个三角剖分。左侧的三角测量的成本为8+2√2+2√5(约15.30),右侧的成本为4+2√2 + 4√5(约15.77)。

建议:在继续解决方案之前,请先在{IDE}上尝试您的方法。


该问题具有递归子结构。其思想是将多边形分为三部分:单个三角形、左侧的子多边形和右侧的子多边形。我们尝试所有可能的分割,像这样,找到一个最小化三角形成本加上两个子多边形三角剖分成本的分割。

设顶点从i到j的三角剖分的最小代价为最小代价(i,j)

如果j<=i+2,则

最小成本(i,j)=0

其他的

最小成本(i,j)=最小{最小成本(i,k)+最小成本(k,j)+成本(i,k,j)}

这里k从“i+1”到“j-1”变化

由边(i,j)、(j,k)和(k,i)形成的三角形的成本为

成本(i,j,k)=距离(i,j)+距离(j,k)+距离(k,i)

2 源代码

using System;
using System.Collections;
using System.Collections.Generic;using Legalsoft.Truffer.TGraph;namespace Legalsoft.Truffer.Algorithm
{public static partial class Algorithm_Gallery{public static double MCPT_Solve(TPoint[] vertices, int i, int j){if (j < (i + 2)){return 0;}double cost = float.MaxValue;for (int k = i + 1; k <= j - 1; k++){double weight = vertices[i].Distance(vertices[j]) + vertices[j].Distance(vertices[k]) + vertices[k].Distance(vertices[i]);cost = Math.Min(cost, weight + MCPT_Solve(vertices, i, k) + MCPT_Solve(vertices, k, j));}return cost;}private static double MCPT_Cost(TPoint[] points, int i, int j, int k){TPoint p1 = points[i];TPoint p2 = points[j];TPoint p3 = points[k];return TPoint.Distance(p1, p2) + TPoint.Distance(p2, p3) + TPoint.Distance(p3, p1);}public static double MCPT_Solve(TPoint[] points, int n){if (n < 3){return 0;}double[,] table = new double[n, n];for (int gap = 0; gap < n; gap++){for (int i = 0, j = gap; j < n; i++, j++){if (j < i + 2){table[i, j] = 0.0;}else{table[i, j] = 1000000.0;for (int k = i + 1; k < j; k++){double val = table[i, k] + table[k, j] + MCPT_Cost(points, i, j, k);if (table[i, j] > val){table[i, j] = val;}}}}}return table[0, n - 1];}}
}

3 源程序

using System;
using System.Collections;
using System.Collections.Generic;

using Legalsoft.Truffer.TGraph;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class Algorithm_Gallery
    {
        public static double MCPT_Solve(TPoint[] vertices, int i, int j)
        {
            if (j < (i + 2))
            {
                return 0;
            }

            double cost = float.MaxValue;

            for (int k = i + 1; k <= j - 1; k++)
            {
                double weight = vertices[i].Distance(vertices[j]) + vertices[j].Distance(vertices[k]) + vertices[k].Distance(vertices[i]);

                cost = Math.Min(cost, weight + MCPT_Solve(vertices, i, k) + MCPT_Solve(vertices, k, j));
            }

            return cost;
        }

        private static double MCPT_Cost(TPoint[] points, int i, int j, int k)
        {
            TPoint p1 = points[i];
            TPoint p2 = points[j];
            TPoint p3 = points[k];
            return TPoint.Distance(p1, p2) + TPoint.Distance(p2, p3) + TPoint.Distance(p3, p1);
        }

        public static double MCPT_Solve(TPoint[] points, int n)
        {
            if (n < 3)
            {
                return 0;
            }
            double[,] table = new double[n, n];
            for (int gap = 0; gap < n; gap++)
            {
                for (int i = 0, j = gap; j < n; i++, j++)
                {
                    if (j < i + 2)
                    {
                        table[i, j] = 0.0;
                    }
                    else
                    {
                        table[i, j] = 1000000.0;
                        for (int k = i + 1; k < j; k++)
                        {
                            double val = table[i, k] + table[k, j] + MCPT_Cost(points, i, j, k);
                            if (table[i, j] > val)
                            {
                                table[i, j] = val;
                            }
                        }
                    }
                }
            }
            return table[0, n - 1];
        }
    }
}
 

这篇关于C#,最小代价多边形三角剖分MCPT(Minimum Cost Polygon Triangulation)算法与源代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772926

相关文章

C#中的 Dictionary常用操作

《C#中的Dictionary常用操作》C#中的DictionaryTKey,TValue是用于存储键值对集合的泛型类,允许通过键快速检索值,并且具有唯一键、动态大小和无序集合的特性,常用操作包括添... 目录基本概念Dictionary的基本结构Dictionary的主要特性Dictionary的常用操作

C# winform操作CSV格式文件

《C#winform操作CSV格式文件》这篇文章主要为大家详细介绍了C#在winform中的表格操作CSV格式文件的相关实例,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录实例一实例效果实现代码效果展示实例二实例效果完整代码实例一实例效果当在winform界面中点击读取按钮时 将csv中

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm