C++程式碼計算任意多邊形的面積
阿新 • • 發佈:2019-02-01
#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);//計算面積
}
}
#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);//計算面積
}
}