二维几何-元素

 二维几何的常用元素,点,线,圆,差积,点积的定义。最常用的点积和差积:

点乘几何意义

向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。

点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在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);
}


发布了22 篇原创文章 · 获赞 7 · 访问量 423

猜你喜欢

转载自blog.csdn.net/qq_40905284/article/details/104406060