向量的代数运算、几何投影(点积)与有向面积(叉积)的直观演示
在信息学竞赛(特别是计算几何)中,向量 (Vector) 是最基本的研究对象。利用向量的代数运算,我们可以避开三角函数,通过单纯的乘加运算高效判断点线关系、多边形面积和线段交点。
对于二维向量 $\vec{u} = (u_x, u_y)$ 和 $\vec{v} = (v_x, v_y)$,其点积定义为:
几何意义:$\vec{u}$ 在 $\vec{v}$ 方向上的投影长度乘以 $\vec{v}$ 的模长。
对于二维向量 $\vec{u}$ 和 $\vec{v}$,其叉积(标量形式)定义为:
几何意义:两向量围成的平行四边形的有向面积。
struct Point { double x, y; };
typedef Point Vector;
Vector operator - (Point A, Point B) { return {A.x - B.x, A.y - B.y}; }
// 向量点积
double Dot(Vector u, Vector v) {
return u.x * v.x + u.y * v.y;
}
// 向量叉积
double Cross(Vector u, Vector v) {
return u.x * v.y - u.y * v.x;
}
// 利用叉积计算三角形面积 (S = |u × v| / 2)
double Area2(Point A, Point B, Point C) {
return Cross(B - A, C - A);
}