1. 程式人生 > >C++程式碼計算任意多邊形的面積

C++程式碼計算任意多邊形的面積

#include<iostream>
#include<math.h>
using namespace std;
float calculateTwoPointArea(float x1,float x2,float x3,float y1,float y2,float y3);//宣告函式
/**
*  main()函式,程式入口,進行輸入座標點操做以及計算多邊形面積
*  形參:無
*  返回:無
*/
void main(){
    int count;//多邊形的邊數(或頂點數)
    float point[1000][2];//未整理點集
    float point2[1000][2];//已整理點集
    float comp;//存比較數
    int locat;//存最低點位置
 float x1,x2,x3,y1,y2,y3;//存放三角形的頂點座標
 float k1,k2;//存放斜率
 static float Sthree=0;//存放三角形面積(靜態變數,避免被銷燬)
    do{//要求輸出3-1000的數
     cout<<"請輸入點的個數(3-1000個點)"<<endl;
     cin>>count;
    }while(count>1000||count<3);
    cout<<"請!!!順時針!!!輸入"<<count<<"個點集:(x,y)"<<endl;
    for(int i=0;i<count;i++){
     cout<<"請輸入第"<<(i+1)<<"點的座標(x,y):"<<endl;
     for(int j=0;j<2;j++){
      cin>>point[i][j];//輸入座標
   
  }
    }
    //查詢最低點
    comp=point[0][1];//賦予第一點
    locat=0;//第一個位置
    for(int k=1;k<count;k++){
        if(point[k][1]<comp){//只比較y
         locat=k;
  }
    }
    //整理點集point2[][],把locat位置的點當成第一點
    for(int s=0;s<(count-locat);s++){//賦予point2[][]以locat後半段(包括locat)
     for(int t=0;t<2;t++){
         point2[s][t]=point[s+locat][t];
  }
    }
    for(int p=0;p<locat;p++){//賦予point2[][]以locat前半段
     for(int q=0;q<2;q++){
         point2[count-locat+p][q]=point[p][q];
  }
    }
    ////開始計算面積/////////////////////////////////////////////
    x1=point2[0][0];//最低點橫座標
 y1=point2[0][1];//最低點縱座標
    for(int u=0;u<(count-2);u++){//計算(count-2)個三角形的面積的代數和(凹面積取負,凸面積取正)
     x2=point2[u+1][0];//三角形第2個點橫座標
  x3=point2[u+2][0];//三角形第3個點橫座標
     y2=point2[u+1][1];//三角形第2個點縱座標
  y3=point2[u+2][1];//三角形第3個點縱座標
  ////做邏輯判斷此三角形是否為凹三角形,凹面積取負,凸面積取正
  if((x1==x2)&&(x1==x3)){//說明k1,k2都不存在
      continue;//結束本步迴圈,繼續下一步
  }else if(x1==x2){//說明k1不存在
   k2=(y3-y1)/(x3-x1);//計算斜率
   if(k2<0){//k2<0說明此三角形為凹,(不考慮共線(k2=0),因為共線此時k2會不存在,會進入第一個判斷)
    Sthree-=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
   }else{//為凸
                Sthree+=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
   }
  }else if(x1==x3){//說明k2不存在
      k1=(y2-y1)/(x2-x1);//計算斜率
   if(k1>0){//k1>0說明此三角形為凹,(不考慮共線(k1=0),因為共線此時k2會不存在,會進入第一個判斷)
       Sthree-=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
   }else{//為凸
                Sthree+=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
   }
  }else{//說明斜率都存在
      k1=(y2-y1)/(x2-x1);//計算斜率k1
   k2=(y3-y1)/(x3-x1);//計算斜率k2
   if(k1>0&&k2<0){//為凹
       Sthree-=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
   }else if(k1<0&&k2<0){//斜率同號且小於0
    if(k1<k2){//說明為凹
        Sthree-=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
    }else{//為凸或共線
        Sthree+=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
    }
   }else if(k1>0&&k2>0){//斜率同號且大於0
    if(k1<k2){//說明為凹
        Sthree-=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
    }else{//為凸或共線
        Sthree+=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
    }
   }else{//其他為凸
       Sthree+=calculateTwoPointArea(x1,x2,x3,y1,y2,y3);//計算面積
   }
  }