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];
        }
    }
}
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年服装私域提升的三大妙招!

在服装行业&#xff0c;私域运营正逐渐成为主流。随着市场的演变&#xff0c;从传统的线下门店与线上电商并行模式&#xff0c;到如今的以小程序商城、企业微信、视频号、公众号等为核心的全渠道私域运营模式&#xff0c;行业的转型已显而易见。 而推动这种转型的关键因素&…

一些关于绩效提升策略的具体例子和数据

员工个人绩效提升策略&#xff1a; 持续学习与发展&#xff1a; 例子&#xff1a;某销售员工报名参加销售技巧提升课程&#xff0c;学习新的销售策略。 数据&#xff1a;经过三个月的学习与实践&#xff0c;该员工的销售额提升了20%。 目标设定与跟踪&#xff1a; 例子&#xf…

如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

OKLink2月安全月报| 2起典型漏洞攻击案例分析

在本月初我们发布的2024年2月安全月报中提到&#xff0c;2月全网累计造成损失约1.03亿美元。其中钓鱼诈骗事件损失占比11.76%。 OKLink提醒大家&#xff0c;在参与Web3项目时&#xff0c;应当仔细调研项目的真实性、可靠性&#xff0c;提升对钓鱼网站和风险项目的甄别能力&…

关于华为昇腾(Ascend)AI芯片,CANN计算架构,MindSpore深度学习框架,MindStudio开发工具

1、华为昇腾生态 深度学习之前的配置都是&#xff1a;NVIDIA GPU / CPU CUDA Tensorflow/PyTorch 后来老美禁止 NVIDIA 卖GPU芯片给我们&#xff0c;于是国内企业开始发力CPU和GPU硬件&#xff0c;成果丰硕&#xff0c;虽然与NVIDIA顶级GPU还有一些差距&#xff0c;但是也不…

基于Java的生活废品回收系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

CCF-C推荐会议 ICANN‘24 3月15日截稿!瑞士阿尔卑斯山脚下探索人工神经网络前沿!

会议之眼 快讯 第33届ICANN(International Conference on Artificial Neural Networks)即国际人工神经网络会议将于 2024 年 9月17日-20日在瑞士卢加诺举行&#xff01;卢加诺坐落于瑞士阿尔卑斯山脚下。会议地点是意大利瑞士大学和瑞士南部应用科学与艺术大学的一部分&#xf…

弱电综合布线:连接现代生活的纽带

在当今信息化快速发展的时代&#xff0c;弱电网络布线作为信息传输的重要基础设施&#xff0c;其作用日益凸显。它不仅保障了数据的高效流通&#xff0c;还确保了通信的稳定性。从商业大厦到教育机构&#xff0c;从政府机关到医院急救中心&#xff0c;再到我们居住的社区&#…

在哪里能找到抖音短视频素材?推荐热门的抖音短视频素材下载资源

哎呦喂&#xff0c;小伙伴们&#xff0c;是不是在短视频的大海里划船&#xff0c;想找到那颗能让你起飞的珍珠&#xff0c;但又觉得素材难寻如针海捞针&#xff1f;别急&#xff0c;今天我就来给你们送上几个超实用的宝藏素材网站&#xff0c;让你的短视频创作不再愁素材 1&am…

支持向量机 SVM | 线性可分:软间隔模型

目录 一. 软间隔模型1. 松弛因子的解释小节 2. SVM软间隔模型总结 线性可分SVM中&#xff0c;若想找到分类的超平面&#xff0c;数据必须是线性可分的&#xff1b;但在实际情况中&#xff0c;线性数据集存在少量的异常点&#xff0c;导致SVM无法对数据集线性划分 也就是说&…

L波段光端机-L波段+CATV射频光端机工作机制及行业应用探究

L波段光端机-L波段CATV射频光端机工作机制及行业应用探究 北京海特伟业任洪卓发布于2023年3月8日 一、何为L波段光端机 L波段光端机是一种用于光通信的设备&#xff0c;其主要工作波长位于L波段&#xff0c;即40~860MHz和950~2600MHz的带宽&#xff0c;可选独立工作于950~260…

一键转发朋友圈!微信快速营销推广必备法宝!

在这个“得私域者得天下”的互联网时代&#xff0c;如何能够在微信上进行快速、高效的营销推广成为了摆在许多人面前的一道难题。 幸运的是&#xff0c;随着微信管理系统的出现&#xff0c;一键转发朋友圈的快速营销推广法宝已经变得触手可及。 首先&#xff0c;微信管理系统…

【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题

【网络连接】ping不通的常见原因解决方案&#xff0c;如何在只能访问网关时诊断&#xff0c;并修复IP不通的问题 写在最前面网络基础可能的问题、表现以及解决方案如何诊断和解决操作步骤 详细问题描述详细解决方案1. 防火墙或安全软件拦截2. IP配置错误3. 网络设备问题4. 物理…

ArcGIS筛选工具:19段SQL示例代码,所有需求一网打尽

一、使用方法 筛选工具(Select_analysis)主要用于从输入要素类或输入要素图层中提取要素&#xff08;通常使用选择或结构化查询语言 (SQL) 表达式&#xff09;&#xff0c;并将其存储于输出要素类中。 以三调图斑为例&#xff0c;图斑中有一个【DLMC】字段&#xff0c;该字段…

做好用户期望管理的4大重点

用户期望管理对项目成功至关重要&#xff0c;充分了解和满足用户期望可以提高项目的成功率&#xff0c;增加项目的商业价值。如果没有完全理解和忽略用户期望&#xff0c;后期往往容易造成需求变更和重复性工作等问题&#xff0c;增加项目成本和风险。 因此我们需重视用户期望管…

易于使用的6个原型软件,让原型设计事半功倍!

产品原型可以帮助团队更有效地测试产品的可行性&#xff0c;了解和评估用户的需求&#xff0c;并不断优化迭代产品的最终解决方案。它决定了最终产品的质量和用户体验&#xff0c;也影响了产品业务运营的成功。高效的原型设计过程必须离不开优秀的设计工具。高质量的原型软件可…

006-浏览器输入域名到返回

浏览器输入域名到返回 1、URL 输入2、DNS 域名解析3、建立 TCP 连接三次握手概念三次握手理解 4、发送 HTTP/HTTPS 请求5、服务器处理&#xff0c;并返回响应6、浏览器解析并渲染页面7、请求结束&#xff0c;端口 TCP 连接四次挥手概念四次挥手理解 1、URL 输入 2、DNS 域名解析…

光谱下的养殖业:数据可视化的现代变革

在数字化时代&#xff0c;数据可视化在养殖业中崭露头角&#xff0c;为这一传统行业注入了新的活力。无论是家禽养殖还是水产养殖&#xff0c;数据可视化都以其直观、高效的特点&#xff0c;为养殖业带来了全新的发展机遇。下面我就以可视化从业者的角度&#xff0c;简单聊聊这…

fasta文件与fastq文件相互转化Python脚本

fa文件与fq文件互相转换 今天分享的内容是fasta文件与fastq文件的基本知识&#xff0c;以及通过Python实现两者互相转换的方法。 测序数据公司给的格式通常是fq.gz&#xff0c;也就是fastq文件&#xff0c;计算机的角度来说&#xff0c;生物的序列属于一种字符串&#xff0c;就…

高质量无损音乐压缩:效果如何?如何进行?

随着数字音乐的发展&#xff0c;无损音乐压缩技术已成为音乐爱好者们关注的焦点。无损音乐压缩能在保持音乐原始质量的同时&#xff0c;减小文件大小&#xff0c;方便存储和传输。那么&#xff0c;高质量无损音乐压缩的效果究竟如何&#xff1f;我们又该如何进行音乐压缩呢&…