欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

求多边形面积小结

程序员文章站 2024-03-16 20:46:40
...

求多边形面积小结

声明:此篇纯粹是与高数公式有关,也在一定程度上将高数与程序设计联系了起来。

先以求三角形面积为例

简单的求面积公式就不多赘述了

而海伦公式却是值得学习并记忆的

下面一道水题是我认识并记住海伦公式的第一道题,虽然是道水题,但不了解海伦公式会有一点点不好处理。

描述

   平面上有一个三角形,它的三个顶点坐标分别为
   (x1, y1), (x2, y2), (x3, y3),
   那么请问这个三角形的面积是多少。

输入

 输入仅一行,包括6个单精度浮点数,分别对应x1, y1, x2, y2, x3, y3。

输出

输出也是一行,输出三角形的面积,精确到小数点后两位。

样例输入

0 0 4 0 0 3

样例输出

6.00

直接套公式就行

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()//海伦公式求面积
{
    float x1,x2,x3,y1,y2,y3;//此题还行给出了数据类型,若未给出需自行判断
    double S,L1,L2,L3,p;//是整型还是实型,否则可能WA
    scanf("%f%f%f%f%f%f",&x1,&y1,&x2,&y2,&x3,&y3);
    L1=sqrt(fabs((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));//此部分可以设
    L2=sqrt(fabs((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)));//置一个求两点
    L3=sqrt(fabs((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)));//间距离的函数
    //或者直接数组加循环求(借助数组的数据可保存性,可读取性)
    p=(L1+L2+L3)/2;
    S=sqrt(p*(p-L1)*(p-L2)*(p-L3));
    printf("%.2lf\n",S);
}

再就是多边形面积

显然比求三角形面积更上一层,但是同样也是套公式即可完成

下面一题即为高数中叉乘法的典型应用

Input

输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2… xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。

Output

对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。

Sample Input

3 0 0 1 0 0 1
4 1 0 0 1 -1 0 0 -1
0

Sample Output

0.5
2.0

叉乘法

求n边形的面积。
设 n 边形的点,按顺时针/逆时针的顺序依次是
(x1,y1)(x2,y2)…(xn,yn)
那么:s = ((x1y2-x2y1) + (x2y3-x3y2) +…+ (xny1-x1yn))/2.0;
注意最后一位是y1,x1
s为有向面积,当顺时针旋转时为负值,逆时针旋转时为正值,题干给出了逆时针旋转,所以此题可不用加绝对值。但用到还是建议加个绝对值,避免出错。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
    float x[102],y[102];//防溢出
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    int n;
    while(cin>>n)
    {
        if(n==0) break;
        int s=0;
        for(int i=1;i<=n;i++)
        {
            cin>>x[i]>>y[i];//用数组存入数据,方便读取,方便后续计算
        }
        x[n+1]=x[1];
        y[n+1]=y[1];//最后一步
        for(int j=1;j<=n;j++)
        {
            s+=(x[j]*y[j+1]-x[j+1]*y[j]);//直接套公式
        }
        cout<<fixed<<setprecision(1)<<fabs(s/2.0)<<endl;
    }
    return 0;
}

此题显然是提示我们用叉乘法(由题干“逆时针”可得出),否则计算将会很困难。
另,
此题若改为求正多边形的面积还可以用一个更简单的公式
S=(naa)/(4.0*tan(180/n));(n为边数,a为每边长。)

感受:

虽然高数与高级语言是两个不同的科目,但编程与高数的联系还是显而易见的,许多题目用上高数相关知识,会让代码更简洁。学好高数就相当于给高级语言学习减了相当一部分负担!

题目来源

NO.1
NO.2