老题新解|计算三角形面积

《信息学奥赛一本通》第30题:计算三角形面积

题目描述

平面上有一个三角形,它的三个顶点坐标分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_1,y_1),(x_2,y_2),(x_3,y_3) (x1,y1),(x2,y2),(x3,y3),那么请问这个三角形的面积是多少。

输入格式

输入仅一行,包括 6 6 6 个双精度浮点数,分别对应 x 1 , y 1 , x 2 , y 2 , x 3 , y 3 x_1,y_1,x_2,y_2,x_3,y_3 x1,y1,x2,y2,x3,y3。坐标的绝对值不超过 100 100 100,且小数点后最多只有一位。

输出格式

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

输入输出样例 #1

输入 #1

0 0 4 0 0 3

输出 #1

6.00

大家好,我是莫小特。

这篇文章给大家带来《信息学奥赛一本通》中的第 30 题:计算三角形面积。

一、题目描述

洛谷的题号是:B2031 计算三角形面积

二、题意分析

这道题是信息学奥赛一本通练习题的第 30 题。

根据输入格式描述,输入只有一行,有 6 个双精度浮点数,绝对值不超过 100,所以使用 double 类型。

cpp 复制代码
double x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;

输入完成后,我们来分析题意,要根据三个点确定一个三角形,按样例输入的数据,可以画出这个三角形。

这个三角形是比较规矩的,利用三角形面积公式: 三角形面积 = ( 底 × 高 ) 2 三角形面积=\frac{(底\times 高)}{2} 三角形面积=2(底×高),但是如果是下面这样的三角形,那无法通过这个面积公式来实现。

但是可以根据海伦公式

S = p ( p − a ) ( p − b ) ( p − c ) S=\sqrt{p(p-a)(p-b)(p-c)} S=p(p−a)(p−b)(p−c)

其中, p = a + b + c 2 p=\frac{a+b+c}{2} p=2a+b+c,也就是三角形周长的一半。

所以我们需要根据三个点来求得三条边的长度,根据线段公式,可以得到以下式子:

AB 的长度: ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{(x1-x2)^2+(y1-y2)^2} (x1−x2)2+(y1−y2)2

BC 的长度: ( x 2 − x 3 ) 2 + ( y 2 − y 3 ) 2 \sqrt{(x2-x3)^2+(y2-y3)^2} (x2−x3)2+(y2−y3)2

AC 的长度: ( x 1 − x 3 ) 2 + ( y 1 − y 3 ) 2 \sqrt{(x1-x3)^2+(y1-y3)^2} (x1−x3)2+(y1−y3)2

转换为程序语言,需要使用 sqrt() 函数,记得加 #include<cmath> 头文件哦!

cpp 复制代码
#include<cmath>
double ab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double bc=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
double ac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));

在利用海伦公式来求面积,新建一个 double 类型变量先存储周长的一半,再定义一个 double 类型变量来存储面积。

cpp 复制代码
double p=(ab+bc+ac)/2.0;
double s=sqrt(p*(p-ab)*(p-ac)*(p-bc));

输出保留小数点后两位。

cpp 复制代码
printf("%.2lf",s);

按样例输入来验证数据。

符合样例输出的格式,到网站提交测评。

三、完整代码

该题的完整代码如下:

cpp 复制代码
#include <cmath>
#include <iostream>
#include <bits/stdc++.h> 
using namespace std;
int main()
{
	double x1,y1,x2,y2,x3,y3;
	cin>>x1>>y1>>x2>>y2>>x3>>y3;
	double ab=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	double ac=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
	double bc=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
	double p=(ab+ac+bc)/2.0;
	double s=sqrt(p*(p-ab)*(p-ac)*(p-bc));//海伦公式
	printf("%.2lf",s);
	return 0; 
}

四、总结

本题考查的是几何基础计算+数学公式的程序实现,尤其是海伦公式的灵活运用,在信息学普及组中属于中等难度的数学类题目,具有以下几个关键点:

技巧一:灵活选择面积公式,海伦公式适应性更强

常规的 底 × 高 2 \frac{底 \times 高}{2} 2底×高 面积公式仅适用于可明确底高的直角三角形;

更通用的是海伦公式:
S = p ( p − a ) ( p − b ) ( p − c ) S=\sqrt{p(p-a)(p-b)(p-c)} S=p(p−a)(p−b)(p−c)

其中, p = a + b + c 2 p=\frac{a+b+c}{2} p=2a+b+c,也就是三角形周长的一半。

掌握该公式,几乎可以求任意三角形面积。

技巧二:三边长度用勾股定理计算,不能用坐标差值直接替代

给出的是点的坐标,需要用两点间距离公式:

距离 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 距离=\sqrt{(x1-x2)^2+(y1-y2)^2} 距离=(x1−x2)2+(y1−y2)2

需要使用 sqrt() 函数,记得引入 头文件;

所有计算中统一使用 double 类型,防止精度丢失。

技巧三:输出格式精度控制,使用 printf("%.2lf", ...)

要求保留两位小数,需使用 printf 控制输出,printf("%.2lf", s) 是最常见写法,避免 cout 输出精度不一致的问题。
---end---

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!

我们下集见~