2.1 计算几何中的几何量表示
2.1.1 点的表示
二维平面中 : 横坐标x 和 纵坐标y
struct point{double x , y ;
}
三维中 : x , y , z
2.1.2 向量的表示
struct vec{point start ; point end ;
} // 起始点+终止点表示法
struct vec{double x , y ;
} // 以(0,0)点为起点,(x,y)表示向量终点
1. 向量的加减法
e g : c = a + b ∣ c = a − b eg : c = a + b | c = a - b eg:c=a+b∣c=a−b
a : ( x 1 , y 1 ) a : (x1 , y1) a:(x1,y1)
b : ( x 2 , y 2 ) b : (x2 , y2) b:(x2,y2)
向量加法法则 : a + b = ( x 1 + x 2 , y 1 + y 2 ) a + b= (x1 + x2 , y1 + y2) a+b=(x1+x2,y1+y2)
向量减法法则 : a − b = ( x 1 − x 2 , y 1 − y 2 ) a - b= (x1 - x2 , y1 - y2) a−b=(x1−x2,y1−y2)
本文认为使用第二种方式进行向量表示将会更加简单,故本文将以第二种方法为例。
向量的加减法如下:
struct vec{double x , y ; friend vec operator+(vec A ,vec B){vec C ; C.x = A.x + B.x ; C.y = A.y + B.y ; return C ; }friend vec operator-(vec A , vec B){vec C ; C.x = A.x - B.x ; C.y = A.y - B.y ; return C ; }
};
2. 向量的点乘
向量点乘的几何意义主要体现在以下几个方面:
-
计算两向量的夹角:向量点乘的结果可以用来表征或计算两个向量之间的夹角并且判断两个向量之间的夹角。
如果两个向量a和b的点乘结果大于0,表示这两个向量的方向基本相同,夹角在0°到90°之间;
如果点乘结果等于0,表示这两个向量正交(即垂直),夹角为90°;
如果点乘结果小于0,表示这两个向量的方向基本相反,夹角在90°到180°之间。
-
投影:向量点乘还可以表示一个向量在另一个向量方向上的投影长度。
这是通过计算一个向量在另一个向量上的分量大小来实现的,该分量大小等于第一个向量的模长乘以第二个向量在第一个向量上的投影系数(即夹角的余弦值)。
a ⋅ b = ∣ a ∣ ∣ b ∣ c o s θ a · b = |a||b| cos \theta a⋅b=∣a∣∣b∣cosθ
a : ( x 1 , y 1 ) , b : ( x 2 , y 2 ) , a ⋅ b = x 1 x 2 + y 1 y 2 a :(x1,y1) , b : (x2,y2) , a · b = x1x2 + y1y2 a:(x1,y1),b:(x2,y2),a⋅b=x1x2+y1y2
friend long long operator*(vec A , vec B){long long C ; C = A.x * B.x ; C += A.y * B.y ; return C ;
} // 放在 struct vec 下
3. 向量的叉乘
A ⃗ : ( x 1 , y 1 ) , B ⃗ : ( x 2 , y 2 ) A ⃗ × B ⃗ = x 1 ∗ y 2 − x 2 ∗ y 1 \vec A : (x1 , y1 ) , \vec B : (x2 , y2) \quad \quad \vec A × \vec B = x1 * y2 - x2 * y1 A:(x1,y1),B:(x2,y2)A×B=x1∗y2−x2∗y1
叉乘有一个非常重要性质,叉乘可以判断两个点的共线情况,
- 叉乘为0的时候 , A ⃗ , B ⃗ 共线 \vec A , \vec B 共线 A,B共线
- 叉乘 > 0 的时候 , A ⃗ , B ⃗ 的夹角在 0 − 90 度 \vec A , \vec B 的夹角在0 - 90度 A,B的夹角在0−90度
- 叉乘 < 0 的时候 , A ⃗ , B ⃗ 的夹角在 90 − 180 度 \vec A , \vec B 的夹角在90 - 180度 A,B的夹角在90−180度
在算法竞赛中一般只考虑叉乘的值的关系,所以crossProduct 返回一个 long long
long long Crossproduct(vec A , vec B ){long long C ; C = A.x * B.y - A.y * B.x ; return C ;
}
4.向量模板
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std ;
struct vec{double x , y ; friend vec operator+(vec A ,vec B){vec C ; C.x = A.x + B.x ; C.y = A.y + B.y ; return C ; }// vec1 + vec2 friend vec operator-(vec A , vec B){vec C ; C.x = A.x - B.x ; C.y = A.y - B.y ; return C ; }// vec1 - vec2 friend long long operator*(vec A , vec B){long long C ; C = A.x * B.x ; C += A.y * B.y ; return C ; }// vec1 * vec2 点乘 long long Crossproduct(vec A , vec B ){long long C ; C = A.x * B.y - A.y * B.x ; return C ; }// 叉乘double val(){return sqrt( x * x + y * y ) ; }// vec1.val
};
int main (){return 0 ;
}