二维几何的常用元素,点,线,圆,差积,点积的定义。最常用的点积和差积:
点乘几何意义
向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影,有公式:
根据这个公式就可以计算向量a和向量b之间的夹角。从而就可以进一步判断这两个向量是否是同一方向,是否正交(也就是垂直)等方向关系,具体对应关系为:
a·b>0 方向基本相同,夹角在0°到90°之间
a·b=0 正交,相互垂直
a·b<0 方向基本相反,夹角在90°到180°之间
差积的应用
1)叉乘可以用来判断两个向量是否平行或相交。返回值为0,则平行。
(2)用于求平面法线(叉乘的几何意义:absinθ)
(3)计算两个物体之间形成四边形的面积(|a||b|sinθ)
(4)得到2个向量的夹角:范围[-90,90]
(5)判断目标在自己的左右方位
Vector3.Cross(transform.forward, target.position).y
返回值为正时,目标在自己的右方;返回值为负时,在自己的左方;返回值为0时,在自己的正前方或者正后方。
代码:
//点的定义
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){};
void input() {
scanf("%lf%lf",&x,&y);
}
};
//向量
typedef Point Vector;
//直线
struct Line{
Point p;
Vector v;
double ang;
Line(){
}
Line(Point p,Vector v):p(p),v(v){
ang=atan2(v.y,v.x;)
}
Point point(double t){
return Point(p.x+t*v.x,p.y+t*v.y;)
}
bool operator < (const Line & L)const {
return ang<L.ang;
}
};
//圆
struct Circle{
Point c;
double r;
Circle(){
}
Circle(Point c,double r):c(c),r(r){};
Point point(double a){
return Point(c.x+cos(a)*r,c.y+sin(a)*r);
}
void input()
{
scanf("%lf%lf%lf",&c.x,&c.y,&r);
}
};
//判断相等
int dcmp(double x)
{
if(x<-eps) return -1;
if(x>eps) return 1;
return 0;
}
template <class T> T sqr(T x){
return x*x;
}
//向量的运算
Vector operator + (Vector A,Vector B)
{
return Vector(A.x+B.x,A.y+B.y);
}
Vector operator -(Vector A,Vector B)
{
return Vector(A.x-B.x,A.y-B.y);
}
Vector operator *(Vector A,double p)
{
return Vector(A.x*p,A.y*p);
}
Vector operator /(Vector A,double p)
{
return Vector(A.x/p,A.y/p);
}
bool operator < (const Point &a ,const Point &b)
{
return a.x<b.x || (a.x==b.x && a.y<b.y);
}
bool operator >=(const Point &a,const Point &b)
{
return a.x>=b.x && a.y>=b.y;
}
bool operator <= (const Point &a,const Point &b)
{
return a.x<=b.x && a.y<=b.y;
}
bool operator == (const Point &a,const Point &b)
{
return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y==0);
}
//点积
/*
根据这个公式就可以计算向量a和向量b之间的夹角。
从而就可以进一步判断这两个向量是否是同一方向,
是否正交(也就是垂直)等方向关系:
a·b>0 方向基本相同,夹角在0°到90°之间
a·b=0 正交,相互垂直
a·b<0 方向基本相反,夹角在90°到180°之间
*/
double Dot(Vecotr A,Vector B)
{
return A.x*B.x+A.y*B.y;
}
//向量的长度
double Length(Vector A)
{
return sqrt(Dot(A,A));
}
//求俩向量的夹角
double Angle(Vector A,vector B)
{
return acos(Dot(A,B))/Length(A)/Length(B);
}
//求差积
/*
在二维空间中,叉乘还有另外一个几何意义就是:
aXb等于由向量a和向量b构成的平行四边形的面积。
*/
double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
//求某向量的单位向量
Vector VectorUnit(Vector x)
{
return x/Length(x);
}
//求法向量
vector Normal(Vector x)
{
return Point(-x.y,x.x);
}
double angle(Vector v)
{
return atan2(v.y,v.x);
}