求多边形面积小结
求多边形面积小结
声明:此篇纯粹是与高数公式有关,也在一定程度上将高数与程序设计联系了起来。
先以求三角形面积为例
简单的求面积公式就不多赘述了
而海伦公式却是值得学习并记忆的
下面一道水题是我认识并记住海伦公式的第一道题,虽然是道水题,但不了解海伦公式会有一点点不好处理。
描述
平面上有一个三角形,它的三个顶点坐标分别为
(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为每边长。)
感受:
虽然高数与高级语言是两个不同的科目,但编程与高数的联系还是显而易见的,许多题目用上高数相关知识,会让代码更简洁。学好高数就相当于给高级语言学习减了相当一部分负担!
题目来源
上一篇: 【AndroidTV】如何自定义屏保、更改屏保时长
下一篇: 数独游戏实战学习