凸多边形最优三角剖分

来源:互联网 发布:微信怎么在淘宝买东西 编辑:程序博客网 时间:2024/04/30 03:28

凸多边形最优三角剖分

(2012-12-20 16:38:40)[编辑][删除]
转载
标签:

it

分类:algorithm
凸多边形最优三角剖分
 

注意:
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】可递归地定义为
    
    
                                 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;
}
原创粉丝点击