问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

计算几何基础:向量的叉乘、点乘与夹角计算

创作时间:
作者:
@小白创作中心

计算几何基础:向量的叉乘、点乘与夹角计算

引用
CSDN
1.
https://blog.csdn.net/Meloor/article/details/89715670

计算几何是计算机科学和数学领域的重要分支,广泛应用于图形学、机器人学、计算机视觉等领域。本文将详细介绍向量的叉乘、点乘以及夹角的计算方法,帮助读者掌握这些基本的计算几何工具。

一、向量的叉乘

向量p=(x1,y1), q=(x2,y2)

则pxq=x1.y2-x2.y1

pxq= - qxp

叉乘的大小等于于2倍三角形面积。

右手法则:手掌表示p向量,手指表示q向量,方向均指向指尖

pxq> 0,则p在q的顺时针方向(q,p),即大拇指朝上,手指与手掌弯曲成九十度,手指弯向左边,p逆时针方向旋转到q

pxq<0, 则p在q的逆时针方向 (p,q) ,即大拇指朝下,手指与手掌弯曲成九十度,手指弯向右边,p顺时针方向旋转到q

pxq=0. 则pq重合

代码计算叉乘

class point{
     public:
    double x;
    double y;
    point(double x_=0,double y_=0):x(x_),y(y_){} 
    friend const point operator+(const point& p1,const point& p2){
        return point(p1.x+p2.x,p1.y+p2.y);
    };
    friend const point operator-(const point& p1,const point& p2){
        return point(p1.x-p2.x,p1.y-p2.y);
    };
    friend const point operator*(const point& p,const double& m){
        return point(p.x*m,p.y*m);
    };
    friend const point operator*(const double& m,const point& p){
        return point(p.x*m,p.y*m);
    };
    friend const point operator/(const point& p,const double& m){
        return point(p.x/m,p.y/m);
    };
    friend ostream& operator <<(ostream& out,point& a){
        printf("(%lf,%lf)",a.x,a.y);
        return out;
    };
};
typedef point vect2;//重命名,向量也是用坐标表示 
class line{
    public:
    point start;
    point end; 
    line(point s=point(0,0),point e=point(0,0)):start(s),end(e){}
};
double cross(point O,point A,point B){//叉乘 
    double oa_x=A.x-O.x;
    double oa_y=A.y-O.y;
    double ob_x=B.x-O.x;
    double ob_y=B.y-O.y;
    return oa_x*ob_y-oa_y*ob_x;
}  

二、向量的点乘

向量p=(x1,y1), q=(x2,y2)

pq=x1x2+y1y2

double dot(point O,point A,point B){//点乘 
    double oa_x=A.x-O.x;
    double oa_y=A.y-O.y;
    double ob_x=B.x-O.x;
    double ob_y=B.y-O.y;
    return oa_x*ob_x+oa_y*ob_y;
}  

三、向量的夹角

cos(alpha)=(pq)/(|p|*|q|)

#include<cmath>
double dot(point O,point A,point B){//点乘 
    double oa_x=A.x-O.x;
    double oa_y=A.y-O.y;
    double ob_x=B.x-O.x;
    double ob_y=B.y-O.y;
    return oa_x*ob_x+oa_y*ob_y;
}
double dis(const point &p1,const point &p2){//求两点之间距离
    double ans=(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
    return sqrt(ans);
}
double angle(point O,point A,point B){//两向量OA,OB的夹角
    return acos(dot(O,A,B)/(dis(O,A)*dis(O,B)));
}  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号