洛谷 B2031:计算三角形面积 ← 叉积
【题目来源】
https://www.luogu.com.cn/problem/B2031
【题目描述】
平面上有一个三角形,它的三个顶点坐标分别为 (x1, y1),(x2, y2),(x3, y3),那么请问这个三角形的面积是多少。
【输入格式】
输入仅一行,包括 6 个双精度浮点数,分别对应 x1,y1,x2,y2,x3,y3。
【输出格式】
输出也是一行,输出三角形的面积,精确到小数点后两位。
【输入样例】
0 0 4 0 0 3
【输出样例】
6.00
【算法分析】
本题有多种解法,如基于“海伦公式”的解法。
下面给出基于“向量叉积”的解法,更简洁。
● 向量叉积:a×b=|a||b|sinθ,其中 θ 为向量 a 与向量 b 的夹角。
● 向量叉积的绝对值是以两个向量 a 与 b 为邻边的平行四边形的面积。
在下图中,若设 (x1,y1) 到 (x2,y2) 的向量为 a,(x1,y1) 到 (x3,y3) 的向量为 b,dx=x2-x1,dy=y2-y1,du=x3-x1,dv=y3-y1,则向量 a 与向量 b 的叉积的绝对值为 |dx*dv-du*dy|。
【算法代码】
#include <bits/stdc++.h>
using namespace std;
int main() {
double x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
double dx=x2-x1,dy=y2-y1,du=x3-x1,dv=y3-y1;
double s=abs(dx*dv-du*dy)/2.0;
printf("%.2lf",s);
return 0;
}
/*
in:
0 0 4 0 0 3
out:
6.00
*/
【参考文献】
https://www.luogu.com.cn/problem/solution/B2031