向量
定义
既有方向,又有长度,且可以自由平移的线段,可称作向量(不是有向线段,有向线段不可以自由平移,因为具有起点)。
实现
程序实现中,我们经常把向量的起点移到(0,0),然后用坐标x,y表示这个向量,向量的加减乘除法可以通过重载实现。
代码
struct Point { double x,y; Point(double X=0,double Y=0) {x=X;y=Y;} }; //向量和点可归为一个结构体 typedef Point vec; vec operator + (const vec& a,const vec& b) {
return vec(a.x+b.x,a.y+b.y);} //向量+向量 vec operator - (const vec& a,const vec& b) {
return vec(a.x-b.x,a.y-b.y);} //向量-向量 vec operator * (const vec& a,double b) {
return vec(a.x*b,a.y*b);} //向量*实数 vec operator / (const vec& a,double b) {
return vec(a.x/b,a.y/b);} //向量/实数
点积
定义
对于两个向量va和vb,他们的点积(也叫数量积)=|va|*|vb|*cosθ,其中θ是va和vb的夹角,这是点积的几何意义。
计算
可以证明,点积也=xa*xb+ya*yb,这就是点积的代数意义。
有了这个代数意义的公式,我们就可以方便的计算点积,然后算夹角θ了。
代码
double Dot (const vec& a,const vec& b) {
return a.x*b.x+a.y*b.y;} //点积 double Length (const vec& a) {
return sqrt(a.x*a.x+a.y*a.y);} //长度 double Angle (const vec& a,const vec& b) {
return acos(Dot(a,b)/Length(a)/Length(b));} //算夹角θ(弧度制)
叉积
定义
计算
和点积一样,叉积也有代数意义,叉积=xa*yb-xb*ya(这下我不会证明了,有人会的话可以私信我,谢谢!)。
代码
double Cross (const vec& a,const vec& b) {
return a.x*b.y-b.x*a.y;} //点积 double Area (const Point& a,const Point& b,const Point& c) {
return Cross(b-a,c-a);} //求三角形ABC面积的两倍(有向面积)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214407.html原文链接:https://javaforall.net
