最優三角剖分

來源:互聯網
上載者:User

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.