Problem6574--学习系列 —— 计算几何 —— 向量的概念极其表示方式

6574: 学习系列 —— 计算几何 —— 向量的概念极其表示方式

[Creator : ]
Time Limit : 1.000 sec  Memory Limit : 256 MiB

Description

【向量】

向量 (英语:euclidean vector,物理、工程等也称作矢量 、欧几里得向量)是数学、物理学和工程科学等多个自然科学中的基本概念。指一个同时具有大小和方向,且满足平行四边形法则的几何对象。
在二维空间中引入一组正交基矢量 $\{i,j\}$,一般成右手系,则该平面的任一向量均可唯一确定地表示为这组基矢量的线性组合: $v=v_xi+v_yj$。

【如何表示一个向量】

数学上的向量通常可用加向右箭头的小写字母表示。

如上图所示,给定两点 $\displaystyle A, \displaystyle B$ 时,也可确定一固定向量:如确定一个始于点从 $\displaystyle A$ 终于点 $\displaystyle B$ 的向量,符号表示为:$\overrightarrow{AB}$。

【向量运算】

【加法】

向量的加法满足平行四边形法则和三角形法则。具体地,两个向量 $\vec {a}$ 和 $\vec {b}$ 相加,得到的是另一个向量。这个向量可以表示为 $\vec {a}$ 和 $\vec {b}$ 的起点重合后,以它们为邻边构成的平行四边形的一条对角线(以共同的起点为起点的那一条,见下图左),或者表示为将 $\vec {a}$ 的终点和 $\vec{b}$ 的起点重合后,从$\vec{a}$ 的起点指向 $\vec{b}$ 的终点的向量:


【减法】

两个向量 $\vec{a}$ 和 $\vec{b}$ 的相减,则可以看成是向量 $\vec{a}$ 加上一个与 $\vec{b}$ 大小相等,方向相反的向量。又或者,$\vec{a}$ 和 $\vec{b}$ 的相减得到的向量可以表示为 $\vec{a}$ 和 $\vec{b}$ 的起点重合后,从 $\vec{b}$ 的终点指向 $\vec{a}$ 的终点的向量:


【点乘】

两个向量的点乘得到一个标量。我们假设 $\vec{a}$ 和 $\vec{b}$ 是 $n$ 维向量。
$\vec{a} \cdot \vec{b}=a_1 \cdot b_1 + a_2 \cdot b_2 + \cdots + a_n \cdot b_n$
点乘的几何含义:
点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在 $\vec{b}$ 向量在 $\vec{a}$ 向量方向上的投影,有公式:
$\vec{a} \cdot \vec{b}=|a||b|\cos \theta$
点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。

进一步作用:判断两个向量是否同一方向或正交(即垂直)等方向关系。
$\vec{a} \cdot \vec{b} > 0$,说明两个向量夹角 $\theta$ 在 $[0^\circ, 90^\circ)$,也就是两个向量方向相同。
$\vec{a} \cdot \vec{b} = 0$,说明两个向量夹角 $\theta=90^\circ$。也就是两个向量正交,互相垂直。
$\vec{a} \cdot \vec{b} < 0$,说明两个向量夹角 $\theta$ 在 $(90^\circ, 180^\circ]$,也就是两个向量方向相反。

【叉乘】

它也是向量与向量的乘积,不过需要注意的是,它的结果是个向量。它的几何意义是所得的向量与被乘向量所在平面垂直,方向由右手定则规定,大小是两个被乘向量张成的平行四边形的面积。所以向量积不满足交换律。
为了简化,我们假设$\vec{a}$ 和 $\vec{b}$ 是 $2$ 维向量,则其向量积的矩阵表达式可用下列符号表示:
$\vec{a} \times \vec{b}=\begin{vmatrix} \vec{i} & \vec{j} \\ a_x & a_y \\ b_x & b_y \end{vmatrix}=(a_xb_y)\vec{i}-(b_xa_y)\vec{j}$
在 3D 图像学中,外积的概念非常有用,可以通过两个向量的外积,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示:



在二维空间中,外积还有另外一个几何意义就是:$|a×b|$ 在数值上等于由向量a和向量b构成的平行四边形的面积。


叉乘的几何含义:
$\vec{a} \times \vec{b}=|a|*|b|*\sin \theta$
$\overrightarrow{P_0P_1}$ 和 $\overrightarrow{P_0P_2}$,对它们的公共端点 $P_0$ 来说,判断 $P_0P_1$ 是否在 $P_0P_2$ 的顺时针方向。

如上图,吧 $P_0$ 作为原点,得到向量 $P_1^{\prime}=P_1-P_0$ 和 $P_2^{\prime}=P_2-P_0$,计算 $P_1^{\prime} \times P_2^{\prime}$ 的叉乘即可。
  • 如果叉乘为正数,说明 $P_1^\prime, P_2^\prime$ 是顺时针方向。
  • 如果叉乘为负数,说明 $P_1^\prime, P_2^\prime$ 是逆时针方向。
  • 如果叉乘为零,说明 $P_0, P_1, P_2$ 是三点共线。

Input

【向量】

在OI中,我们直接用点表示向量。
const double EPS=1e-10;
struct POINT{
	double x,y;//点坐标
	//构造函数 
	POINT(double x=0,double y=0):x(x),y(y){
	}
	
	//重载符号运算 
	//向量加 
	POINT operator+(const POINT &p) const {
		return POINT(x+p.x,y+p.y);
	}
	//向量减 
	POINT operator-(const POINT &p) const{
		return POINT(x-p.x,y-p.y);
	}
	//乘标量 
	POINT operator*(double a) const {
		return POINT(x*a,y*a);
	}
	//除标量 
	POINT operator/(double a) const{
		return POINT(x/a,y/a);
	}
	//比较 
	bool operator<(const POINT &p) const{
		return x!=p.x?x<p.x:y<p.y;
	}
	//判断相等 
	bool operator==(const POINT &p) const{
		return fabs(x-p.x)<EPS&&fabs(y-p.y)<EPS;
	}
	
	//计算norm
	double norm() const{
		return x*x+y*y;
	}
	//向量模长 
	double length() const{
		return sqrt(norm());
	}
}; 
//定义向量 
typedef POINT VECTOR;


【点乘(dot product)】

设向量 $\vec{a}, \vec{b}$ 的夹角为 $\theta\ (0 \leq \theta \leq 180)$,那么 $\vec{a}, \vec{b}$ 的内积 $a \cdot b=|a||b|\text{cos}\theta$。

根据余弦定理 $\text{cos}\theta=\frac{|a|^2+|b|^2-|b-a|^2}{2|a||b|}$ 可知,$a \cdot b=\frac{|a|^2+|b|^2-|b-a|^2}{2}=a_x \times b_x+a_y \times b_y$。
也就是说 $a \cdot b=|a||b|\text{cos}\theta=a_x \times b_x+a_y \times b_y$。
//点乘 
double dot(const VECTOR &a, const VECTOR &b){
	return a.x*b.x+a.y*b.y;
}


【叉乘(cross product)】

设向量 $\vec{a}, \vec{b}$ 的夹角为 $\theta\ (0 \leq \theta \leq 180)$,那么 $\vec{a}, \vec{b}$ 的外积 $a \times b=|a||b|\text{sin}\theta$。
也就是 $|a \times b|=|a||b|\text{sin}\theta =a_x \times b_y-a_y \times b_x$。
//叉乘
double cross(const VECTOR &a, const VECTOR &b){
	return a.x*b.y-a.y*b.x;
}
叉积的结果也是一个向量,是垂直于 $\vec{a},\ \vec{b}$ 所形成的平面

Source/Category

计算几何