参考:https://www.cnblogs.com/gxcdream/p/7597865.html
一、向量的内积(点乘)
定义:
两个向量a与b的内积为 a·b = |a||b|cos∠(a, b),特别地,0·a =a·0 = 0;若a,b是非零向量,则a与b****正交的充要条件是a·b = 0。
常见用法:
求两向量夹角:
import numpy as ny# 注意:下面使用的都是单位向量# 二维: x轴和y轴夹角, 输出: 90
np.degrees(np.arccos(np.dot(np.array([0,1]),np.array([1,0]))))# 二维: x轴和第一象限45度,输出: 45
np.degrees(np.arccos(np.dot(np.array([0,1]),np.array([0.7071067811865476,0.7071067811865476]))))# 二维: x轴和负y轴, 输出:180
np.degrees(np.arccos(np.dot(np.array([1,0]),np.array([-1,0]))))# 三维: x轴和z轴, 输出: 90
np.degrees(np.arccos(np.dot(np.array([1,0,0]),np.array([0,0,1]))))
求向量1在向量2的投影长度:
# 下面用的都是单位向量# 第一象限45°单位向量在x轴上投影的长度,输出: 0.7071067811865476
np.dot(np.array([1,0]),np.array([0.7071067811865476,0.7071067811865476]))
判断两向量夹角:
# 因为只是判断方向, 所以不必是单位向量# x轴与y轴内积, 输出0 垂直
np.dot(np.array([1,0]),np.array([0,1]))
# x轴与负y轴内积, 输出0 垂直
np.dot(np.array([1,0]),np.array([0,-1]))# x轴与第一象限45°内积,大于0 夹角在0 ~ 90°之间
np.dot(np.array([1,0]),np.array([1,1]))
二、向量的外积(叉乘)
定义:
向量a与b的外积a×b是一个向量,其长度等于|a×b| = |a||b|sin∠(a,b),其方向正交于a与b。并且,(a,b,a×b)构成右手系。
特别地,0×a = a×0 = 0.此外,对任意向量a,a×a=0。
常见用法:
判断向量a,b的位置关系:
res > 0, a在b的逆时针方向
res = 0, a和b共线
res < 0, a在b的顺时针方向
# 注意:上面内积只能求夹角,但判断不了顺逆时针(180°以内)# x轴和y轴,输出> 0 说明 x轴在y轴逆时针方向
a = np.cross(np.array([1,0]),np.array([0,1]))
print(a) # 输出 1# y轴和x轴,输出 <0 说明,y轴在x轴的顺时针方向
b = np.cross(np.array([0,1]),np.array([1,0]))
print(b) # 输出 -1
求面法线:
# 由x轴和y轴求出z轴,输出: array([0, 0, 1])
np.cross(np.array([1,0,0]),np.array([0,1,0]))