struct point{
double x,y;
//定义构造函数会对后面的工作提供极大的便利
point(){}
point ( double _x , double _y ) x : ( _x ) , y ( _y ){} //采用运算符重载的方式实现向量的运算
point operator + ( point a ) //向量加法
{
return point( x+a.x , y+a.y );
}
point operator - ( point a ) //向量减法
{
return point( x-a.x , y-a.y );
}
double operator * ( point a ) //向量叉积
{
return x * a.y - a.x * y ;
}
double operator ^ ( point a ) //向量点积
{
return x * a.x + y * a.y;
}
point operator * ( point a ) //向量乘以实数
{
return point ( a * x , a * y );
}
double len2() //向量模的平方
{
return x * x + y * y;
}
};
2.向量点积,向量叉积
向量的点积、叉积是既常用又十分灵活的运算。
1)向量点积
两个向量u、v的点积定义为u · v=||u|| · ||v|| · cosθ,其中θ为u和v的夹角。
如果用坐标表示u,v,即u=( x1 , y1 ),v=( x2 , y2 ),即u · v=x1x2 + y1y2 。
结合以上两点,点积常用来求向量的夹角,如下式:
θ=arccos ( u · v ) / ( ||u|| ·||v|| )
点积还可以用来计算向量在另一向量的投影,如下式:
( u · v ) / ||v|| = ||u|| cosθ
上式表示u在v方向上的投影,它也是个向量,值为正表示其与v同向,否则与v反向。
2)向量叉积
两个向量u、v的叉积又称叉乘,定义为u × v = ||u|| · ||v|| · sinθ,其中θ为u和v的夹角。叉乘的结果还是一个向量,其方向跟u、v垂直且遵循右手定则。
如果用坐标表示u,v,即u=( x1 , y1 ),v=( x2 , y2 ),即u · v=x1y2 - x2y1 。
向量u、v的叉乘的几何意义是以u、v为邻边的平行四边形面积。
当令 I = × ,当I为正时,点C在向量所在直线的左侧(沿向量方向);当其为负时,C在向量所在直线的右侧;当I为0时,C在AB上。这是一条常用的性质,也是用来判断点与直线的位置关系的方法。
习题推荐:HDU 1086
POJ 2826