#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;
}
}