问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

洛谷 B2031:计算三角形面积的向量叉积解法

创作时间:
作者:
@小白创作中心

洛谷 B2031:计算三角形面积的向量叉积解法

引用
CSDN
1.
https://blog.csdn.net/hnjzsyjyj/article/details/145344955

洛谷B2031题目要求计算给定三个顶点坐标的三角形面积。本文将介绍一种基于向量叉积的简洁算法来解决这个问题。

题目描述

平面上有一个三角形,它的三个顶点坐标分别为 ((x_1, y_1)),((x_2, y_2)),((x_3, y_3)),那么请问这个三角形的面积是多少。

输入格式

输入仅一行,包括 6 个双精度浮点数,分别对应 (x_1),(y_1),(x_2),(y_2),(x_3),(y_3)。

输出格式

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

输入样例

0 0 4 0 0 3

输出样例

6.00

算法分析

本题有多种解法,如基于“海伦公式”的解法。下面给出基于“向量叉积”的解法,更简洁。

  • 向量叉积:(\mathbf{a} \times \mathbf{b} = |\mathbf{a}||\mathbf{b}|\sin\theta),其中 (\theta) 为向量 (\mathbf{a}) 与向量 (\mathbf{b}) 的夹角。
  • 向量叉积的绝对值是以两个向量 (\mathbf{a}) 与 (\mathbf{b}) 为邻边的平行四边形的面积。

在下图中,若设 ((x_1,y_1)) 到 ((x_2,y_2)) 的向量为 (\mathbf{a}),((x_1,y_1)) 到 ((x_3,y_3)) 的向量为 (\mathbf{b}),(dx=x_2-x_1),(dy=y_2-y_1),(du=x_3-x_1),(dv=y_3-y_1),则向量 (\mathbf{a}) 与向量 (\mathbf{b})的叉积的绝对值为 (|dx \cdot dv - du \cdot 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
*/

参考文献

洛谷B2031题解

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号