凸多边形的最优三角剖分

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

凸多边形的最优三角剖分程序清单:

#include

#include

using namespace std;

void MinWeightTriangulation(int n,float t[][50],int s[][50],float v[][2]);

float w(int i,int j,int k,float v[][2]);

void traceback(int i,int j,int s[][50]); //输出三角形的剖分结果

bool judge(int i,int j,int n,float v[][2]); //用于判断是否能构成凸多边形

void main()

{

float t[50][50];

int s[50][50];

float v[7][2]={8,26,0,20,0,10,10,0,22,12,27,21,15,26};

bool boola=1;

for(int i=0;i<7;i++)

cout<<"("<

for(int i=0;i<6;i++)

{

boola=judge(i,i+1,7,v); //当boola为0时说明有点不能构成凸多边形,为1则继续扫描下一对临进的点对

if(boola==0)break;

}

if(boola=0)

cout<<"不能构成凸多边形";

else

{

cout<<"能构成凸多边形"<

MinWeightTriangulation(6,t,s,v);

traceback(1,6,s);

cout<<"最优值为:"<

cout<

}

}

void MinWeightTriangulation(int n,float t[][50],int s[][50],float v[][2])

{

for(int i=1;i<=n;i++)t[i][i]=0;

for(int r=2;r<=n;r++)

for(int i=1;i<=n-r+1;i++)

{

int j=i+r-1;

t[i][j]=t[i+1][j]+w(i-1,i,j,v);

s[i][j]=i;

for(int k=i+1;k

{

float u=t[i][k]+t[k+1][j]+w(i-1,k,j,v);

if(u

{

t[i][j]=u;

s[i][j]=k;

}

}

}

}

float w(int i,int j,int k,float v[][2])

{ float x=(v[i][0]-v[j][0])*(v[i][0]-v[j][0])+(v[i][1]-v[j][1])*(v[i][1]-v[j][1]);

float y=(v[i][0]-v[k][0])*(v[i][0]-v[k][0])+(v[i][1]-v[k][1])*(v[i][1]-v[k][1]);

float z=(v[k][0]-v[j][0])*(v[k][0]-v[j][0])+(v[k][1]-v[j][1])*(v[k][1]-v[j][1]);

float ww=sqrt(x)+sqrt(y)+sqrt(z);

return ww;}

void traceback(int i,int j,int s[][50])

{

if(i==j)return;

traceback(i,s[i][j],s);

traceback(s[i][j]+1,j,s);

cout<<"三角形V"<

}

bool judge(int a,int b,int n,float v[][2]) //返回1表示能构成凸多边形

{

float k,y;

bool boola=0,boolb=0;

if(v[a][0]-v[b][0]==0) //两点构成的直线与x轴平行

for(int i=0;i

{

if(i!=a&&i!=b)

{

if(v[i][1]>v[a][0])boola=1;

else if(v[i][1]

if(boola==boolb)return 0; //boola和boolb的值相等,说明直线两侧都与点,不能构成凸多边形

else return 1;

}

else

{

k=(v[a][1]-v[b][1])/(v[b][0]-v[a][0]); //直线的斜率

y=((v[a][1]-v[b][1])/(v[a][0]-v[b][0]))*v[a][0]-v[a][1];

for(int i=0;i

{

if(i!=a&&i!=b)

{if(v[i][1]+k*v[i][0]+y>0)boola=1;

else if(v[i][1]+k*v[i][0]+y<0)boola=1; //直线两侧都有点则boola和boolb都置为1

else return 0; //三点共线不能构成凸多边形

}

if(boola==boolb)return 0; //boola和boolb的值相等,说明直线两侧都与点,不能构成凸多边形

else return 1;

}}

return 1;}

实验截图:

相关文档
最新文档