凸多边形最优三角剖分
注意:
P={v0,v1,....vn-1}表示具有n条边v0,v1, v1v2,...,vn-1vn的凸边形。其中约定v0=vn
1.
三角剖分的结构及其相关问题
上图位凸多边形的语法数
可以定义三角形上各种的权函数w,例如
W(vi vj vk) = |vi vj| + | vi vk| + | vj vk | = pipj pk
2. 最优子结构性质:
¡设v0vkvn是将n+1边形P={v0,v1,…,vn}分成三部分{v0,v1,…,vk}、{vk,vk+1,…,vn}和{v0,vk,vn}的最佳剖分方法,那么凸多边形{v0,v1,…,vk}的剖分一定是最优的,{vk,vk+1,…,vn}的剖分也一定是最优的。
¡设{v0,v1,…,vn}三角剖分的权函数之和为c,{v0,v1,…,vk}三角剖分的权函数之和为a,{vk,vk+1,…,vn}三角剖分的权函数之和为b,三角形v0vkvn的权函数为w(v0vkvn),则c=a+b+w(v0vkvn)。
如果c是最小的,则一定包含a和b都是最小的。如果a不是最小的,则它所对应的{v0,v1,…,vk}的三角剖分就不是最优的。那么,对于凸多边形{v0,v1,…,vk}来说,肯定存在最优的三角剖分,设{v0,v1,…,vk}的最优三角剖分对应的权函数之和为a'(a'
3.最优三角剖分的递归结构
首先定义t【i】【j】,1<=i<=j<=n为凸子多边形{vi-1 , v I , ... ,vj}的最优三角剖分所对应的权函数值,即其最优值。。设退化的多边形{vi-1 , vi}的多边形具有权值0。根据定义,要计算的凸(n+1)边形P的最优权值t[1][n].
t[i][j]的值可以利用最优子结构性质递归地计算。由于退化的2个顶点多边形的权值为0,所以t【i】【i】 = 0 , i=0,2,...,n 。当j-i>=1 时,凸子多边形{vi-1 , v I , ... ,vj}至少有三个顶点。由最优子结构性质,t【i】【j】的值应为t【i】【k】的值加上t【k+1】【j】的值,在加上vi-1vkvj的权值,其中i<=k<=j-1.由于计算时不知道k的确定位置,而k的所有可能位置只有j-i个,因此,可以在这j-i个位置中选出使t【i】【j】值达到最小的位置。由此,t【i】【j】可递归地定义为
0 i=j
t【i】【j】
min{ t [i][ k ] + t[ k+1 ][ j ] + w( vi-1 vk vj)} j
4. 计算最优值
#include
#include"stdio.h"
#include"math.h"
int abs ( int b)
{
returnb>0? b :-b ;
}
using namespace std;
struct node
{
double x;
double y;
}nums[160];
double t[160][160] ;
double distance(int i,int k,int j,int n)
{
double temp1=0,temp2=0,temp3=0;
if (abs(k-i)<=1||abs(k-i)>=n-1)
temp1=0;
else
temp1=sqrt((nums[i].x-nums[k].x)*(nums[i].x-nums[k].x)+(nums[i].y-nums[k].y)*(nums[i].y-nums[k].y));
if(abs(j-k)<=1 ||abs(j-k)>=n-1)
temp2=0;
else
temp2=sqrt((nums[k].x-nums[j].x)*(nums[k].x-nums[j].x)+(nums[k].y-nums[j].y)*(nums[k].y-nums[j].y));
if(abs(j-i)<=1||abs(j-i)>=n-1)
temp3=0;
else
temp3=sqrt((nums[i].x-nums[j].x)*(nums[i].x-nums[j].x)+(nums[i].y-nums[j].y)*(nums[i].y-nums[j].y));
return temp1+temp2+temp3;
}
double mint(int n)
{
int i,j,r,k;
double q;
for(i=1;i<=n;i++)
t[i][i]=0;
for(r=2;r<=n;r++)
{
for(i=1;i<=n-r+1;i++)
{
j=i+r-1;
t[i][j]=1e+10;
for(k=i;k<=j-1;k++)
{
q=t[i][k]+t[k+1][j]+distance(i-1,k,j,n);
if(q
t[i][j]=q;
}
}
}
return t[1][n];
}
int main( )
{
int n,j,size;
double num;
cin>>size;
for(j=0;j
cin>>nums[j].x>>nums[j].y;
nums[j].x=nums[0].x;
nums[j].y=nums[0].y;
num=mint(size)/2;
printf("%0.3f\n",num);
return 0;
}
注意:
P={v0,v1,....vn-1}表示具有n条边v0,v1, v1v2,...,vn-1vn的凸边形。其中约定v0=vn
1.
上图位凸多边形的语法数
可以定义三角形上各种的权函数w,例如
W(vi vj vk) = |vi vj| + | vi vk| + | vj
2. 最优子结构性质:
¡设v0vkvn是将n+1边形P={v0,v1,…,vn}分成三部分{v0,v1,…,vk}、{vk,vk+1,…,vn}和{v0,vk,vn}的最佳剖分方法,那么凸多边形{v0,v1,…,vk}的剖分一定是最优的,{vk,vk+1,…,vn}的剖分也一定是最优的。
¡设{v0,v1,…,vn}三角剖分的权函数之和为c,{v0,v1,…,vk}三角剖分的权函数之和为a,{vk,vk+1,…,vn}三角剖分的权函数之和为b,三角形v0vkvn的权函数为w(v0vkvn),则c=a+b+w(v0vkvn)。
如果c是最小的,则一定包含a和b都是最小的。如果a不是最小的,则它所对应的{v0,v1,…,vk}的三角剖分就不是最优的。那么,对于凸多边形{v0,v1,…,vk}来说,肯定存在最优的三角剖分,设{v0,v1,…,vk}的最优三角剖分对应的权函数之和为a'(a'
3.最优三角剖分的递归结构
首先定义t【i】【j】,1<=i<=j<=n为凸子多边形{vi-1 , v I , ... ,vj}的最优三角剖分所对应的权函数值,即其最优值。。设退化的多边形{vi-1 , vi}的多边形具有权值0。根据定义,要计算的凸(n+1)边形P的最优权值t[1][n].
t【i】【j】
4. 计算最优值
#include"stdio.h"
#include"math.h"
int abs ( int b)
{
}
using namespace std;
struct node
{
}nums[160];
double t[160][160] ;
double distance(int i,int k,int j,int n)
{
}
double mint(int n)
{
}
int
{
}
本文探讨了凸多边形的最优三角剖分问题,详细阐述了如何通过数学优化方法来实现更高效的剖分方案,旨在提高几何计算的效率和准确性。
6606

被折叠的 条评论
为什么被折叠?



