C++代码计算任意多边形的面积(转载)

  转载来自:C++代码计算任意多边形的面积_c++求多边形面积-CSDN博客

感谢博主的分析分享!!。 

测试工具: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;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值