凸多边形的最优三角剖分
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;} 实验截图: