转载来自:C++代码计算任意多边形的面积_c++求多边形面积-优快云博客
感谢博主的分析分享!!。
测试工具:Red Panda Dev-C++
样本数据(程序运行,直接粘贴后回车即可计算):
7
235.0567
89.1
259.0009
116.2674
264.5265
150.3419
221.7032
155.407
221.7032
192.7047
278.8009
175.207
292.1544
105.2163
#include<iostream>
#include<math.h>
using namespace std;
float calculateTwoPointArea(float x1,float x2,float x3,float y1,float y2,float y3);//声明函数
/**
* main()函数,程序入口,进行输入坐标点操做以及计算多边形面积
* 形参:无
* 返回:无
*/
int 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); // 计算面积
}
}
}
cout << "多边形的面积为:" << Sthree << endl; // 输出总面积
system("pause");
return 0;
}
/**
* calculateTwoPointArea()函数,计算三角形面积,海伦公式
* 形参:float xx1,float xx2,float xx3,float yy1,float yy2,float yy3
* 返回:面积area
*/
float calculateTwoPointArea(float x1, float x2, float x3, float y1, float y2,
float y3) {
float a, b, c, p, area;
a = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // 计算边长1
b = sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); // 计算边长2
c = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)); // 计算边长3
p = (a + b + c) / 2;
area = sqrt(p * (p - a) * (p - b) * (p - c)); // 海伦公式计算面积
return area;
}