2018年第九届蓝桥杯 - 国赛 - C/C++大学A组 - A. 三角形面积

三角形面积

已知三角形三个顶点在直角坐标系下的坐标分别为:
(2.3, 2.5)
(6.4, 3.1)
(5.1, 7.2)

求该三角形的面积。

注意,要提交的是一个小数形式表示的浮点数。
要求精确到小数后3位,如不足3位,需要补零。

Ideas

这道题给了三个点,要求三角形的面积,这其实是一个数学问题。

  1. 海伦公式

海伦公式是由古希腊的数学家海伦发现的,它的原理是利用三角形的三条边长求三角形的面积。

S = s ( s − a ) ( s − b ) ( s − c ) 其中 s = a + b + c 2 S=\sqrt{s(s-a)(s-b)(s-c)} \quad \text{其中} s=\frac{a+b+c}{2} S=s(sa)(sb)(sc) 其中s=2a+b+c

所以如果想用海伦公式求解这道题,我还需要计算三角形三条边的边长,这就是个两点之间的距离公式了。

∣ A B ∣ = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 |AB|=\sqrt{\left(x_{1}-x_{2}\right)^{2}+\left(y_{1}-y_{2}\right)^{2}} AB=(x1x2)2+(y1y2)2

然后直接编程就可以了。

  1. 利用行列式

我们也可以使用解析几何和向量表达三角形的面积公式,把三角形放置在一个平面直角坐标系中,三点坐标A(x1, y1),B(x2, y2),C(x3, y3)。

在这里插入图片描述

三角形ABC的面积,其实等于它的外接矩形的面积,减去三个小三角形的面积,其中矩形的面积使用底乘高的公式,三角形的面积使用底乘高的一半。

S Δ = S − S 1 − S 2 − S 3 S = ∣ x 3 − x 1 ∣ ⋅ ∣ y 3 − y 2 ∣ S 1 = 1 2 ∣ x 3 − x 1 ∣ ⋅ ∣ y 3 − y 1 ∣ S 2 = 1 2 ∣ x 2 − x 1 ∣ ⋅ ∣ y 2 − y 1 ∣ S 3 = 1 2 ∣ x 3 − x 2 ∣ ⋅ ∣ y 3 − y 2 ∣ \begin{array}{l} S_{\Delta}=S-S_{1}-S_{2}-S_{3} \\ S=\left|x_{3}-x_{1}\right| \cdot\left|y_{3}-y_{2}\right| \\ S_{1}=\frac{1}{2}\left|x_{3}-x_{1}\right| \cdot\left|y_{3}-y_{1}\right| \\ S_{2}=\frac{1}{2}\left|x_{2}-x_{1}\right| \cdot\left|y_{2}-y_{1}\right| \\ S_{3}=\frac{1}{2}\left|x_{3}-x_{2}\right| \cdot\left|y_{3}-y_{2}\right| \end{array} SΔ=SS1S2S3S=x3x1y3y2S1=21x3x1y3y1S2=21x2x1y2y1S3=21x3x2y3y2

经过整理可以得到行列式:

S = 1 2 ∣ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ∣ S=\frac{1}{2}\left|\begin{array}{lll} x_{1} & y_{1} & 1 \\ x_{2} & y_{2} & 1 \\ x_{3} & y_{3} & 1 \end{array}\right| S=21x1x2x3y1y2y3111

可以得到三点面积公式:

S = 1 2 ( x 1 y 2 − x 1 y 3 + x 2 y 3 − x 2 y 1 + x 3 y 1 − x 2 y 2 ) S=\frac{1}{2} (x_1y_2-x_1y_3+x_2y_3-x_2y_1+x_3y_1-x_2y_2) S=21(x1y2x1y3+x2y3x2y1+x3y1x2y2)

Code

C++

#include <iostream>
#include <cmath>

using namespace std;

double length(double x1,double y1,double x2,double y2) {
    return sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
}

int main() {
    double ax = 2.3, ay = 2.5, bx = 6.4, by = 3.1, cx = 5.1, cy = 7.2;
    double a = length(ax, ay, bx, by), b = length(ax, ay, cx, cy), c = length(bx, by, cx, cy);
    double len = (a + b + c) / 2;
    cout << sqrt(len * (len - a) * (len - b) * (len - c));
    return 0;
}

Python

if __name__ == '__main__':
    x1, y1 = 2.3, 2.5
    x2, y2 = 6.4, 3.1
    x3, y3 = 5.1, 7.2
    print((x1 * y2 + x2 * y3 + x3 * y1 - x1 * y3 - x2 * y1 - x3 * y2) / 2)

Answer: 8.795

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大风车滴呀滴溜溜地转

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值