三角形面积 - B2031

· · 题解

计算几何入门题。

考虑向量叉积。两个向量的叉积定义为

\vec{a}\times\vec{b}=|\vec a||\vec b|\sin\theta

其中 \theta 为向量 \vec a\vec b 的旋转角。

叉积的几何意义为两个向量及其和向量构成的平行四边形的有向面积。那么,三角形面积不就是平行四边形面积除以 2 吗?

下面考虑如何计算叉积。首先计算出向量 \overrightarrow{AB}\overrightarrow{AC}。接下来我们计算 |S_{\triangle ABC}|=\dfrac{|\overrightarrow{AB}\times\overrightarrow{AC}|}{2} 即可。

编程的时候并不需要 \theta,这是因为借助三角函数有更简单的计算方法。

\vec a\vec b 的极角分别为 \theta_1,\theta_2,则 \theta=\theta_2-\theta_1

又有 \sin\theta=\sin(\theta_2-\theta_1)=\sin\theta_2\cos\theta_1-\sin\theta_1\cos\theta_2

可知 \vec a \times \vec b=|\vec a||\vec b|\sin\theta_2\cos\theta_1-|\vec a||\vec b|\sin\theta_1\cos\theta_2=x_ay_b-x_by_a

于是直接计算即可。

#include <bits/stdc++.h>
using namespace std;
int main(void) {
    double xa,xb,xc,ya,yb,yc;
    cin>>xa>>ya>>xb>>yb>>xc>>yc;
    double x1=xb-xa,y1=yb-ya,x2=xc-xa,y2=yc-ya;
    double area=fabs(x1*y2-x2*y1)/2.0;
    printf("%.2lf\n",area);
    return 0;
}