最优三角剖分

来源:互联网 发布:安卓 网络修复 编辑:程序博客网 时间:2024/04/29 07:22
 

#include<iostream>
#include<math.h>

using namespace std;

//输入多边形的顶点(二维)序列,构造最优的三角剖分,所谓最优三角剖分是指n个顶点的凸多边形,从任何顶点向它不相邻的顶点连线
//可以构成n-2个三角形,n个顶点可以构成n(n-2)个三角形
//三角形的边上的权值是边上两个邻接点的欧式距离,找出这n(n-2)个三角形权值最小的那n-2组

const double Max=1000000;
double distance(double **p,int i,int j) //计算顶点i,j的欧式距离
{
 return pow(p[i][0]-p[j][0],2)+pow(p[i][1]-p[j][1],2);
}

void OptimalTrangleDivision(double **p,int n,int& besti) //找出最优三角剖分
{
 double sum; //不相邻顶点欧式距离之和
 double min=Max;
 int i,j;
 int cnt;// 用于计数,n个顶点可以有n-3条对角线
 for(i=0;i<n;i++)
 {
  sum=0;
  for(cnt=0,j=(i+2)%n;cnt<n-3;j=(j+1)%n,cnt++)
  {
   sum+=distance(p,i,j);
   if(sum<min)
   {
    min=sum;
    besti=i;
   }
  }
 }
}

void main()
{
 int n;
 cout<<"输入多边形的顶点数N:";
 cin>>n;
 double **p=new double*[2]; //多边形的顶点数组
 int i;
 for(i=0;i<n;i++) p[i]=new double[2];
 for(i=0;i<n;i++)   //顶点数组初始化
 {
  cout<<"输入第"<<i<<"个顶点的横坐标:";
  cin>>p[i][0];
  cout<<"输入第"<<i<<"个顶点的纵坐标:";
  cin>>p[i][1];
 }
 int besti;
 OptimalTrangleDivision(p,n,besti);
 int j,cnt;
 cout<<"最优三角剖分是:"<<endl;
 for(cnt=0,j=(besti+2)%n;cnt<n-3;cnt++,j=(j+1)%n)
 {
  cout<<"从顶点"<<besti<<"到顶点"<<j<<endl;
 }
}

原创粉丝点击