首页 > 编程知识 正文

向量叉积和点积运算公式,两向量的点积和叉积公式

时间:2023-05-03 13:19:36 阅读:285113 作者:3055

除了正常的加减乘除以外,向量的最常见的三个运算是点积、叉积、正交基。

对于向量的乘法和除法要做一下说明,因为除发的效率要远低于乘法,因此会将除法尽可能的化为乘法来实现。比如我们要对向量缩放一半,则可以除以2,也可以乘以0.5,则尽量要以乘以0.5来实行。

【向量定义】

对于维向量来说,有个相互垂直的正交基 {},那么一个独立的维标量集{}和此正交基存在一个线性组合,则就是一个维向量。

这里面有一点要注意,只要有正交基,则可以在基上定义向量。比如经常的局部坐标系就是要求其正交基在其上定义局部坐标,比如这篇文章就求了相机坐标的局部坐标系的正交基:【OptiX】第1个示例 光线生成模块(RayGenerationProgram), 相机操作、添加三角网以及相交丢失模块(Miss Program)

【向量的加减法】

在求解颜色时,我们经常使用到加法,比如漫反射的结果再加上镜面反射的结果是最终的结果等等。这里要理解的一点是当代表颜色时,加法代表两个颜色叠加。比如R(1.0, 0.0, 0.0)+G(1.0, 0.0, 0.0)+B(1.0, 0.0, 0.0)=W(1.0, 1.0, 1.0),结果就是颜色混合的白色。

向量的加法从几何上代表两个向量所围成的平行四边形的对角线:

向量的减法代表另一条对角线()时,叫做被减向量,叫做减向量,记方向的一个口决是:指向被减向量

【向量的点积】

向量点积的定义,拿三维向量来说:

这里要注意向量的点积结果是一个数值,而非一个向量。

下面来推导点积的最重要的几何意义公式其中是两个向量之间的夹角。当和都是单位向量时, 这是图形学界使用频率最高的公式之一。仅对二三维有效。

下面来进行推导:

设,它们的终点分别为,

那么,在三角形OAB中,使用余弦定理:

 其中是与的夹角。

将A,B,的值代入后,整理即得

【向量的叉积】

先看叉积的性质。两个向量的叉积的结果是垂直于这两个向量和的第三个向量,它的方向使用右手螺旋定则,长度则为和所围的平行四边形的面积。

,其中为和的夹角。

叉乘满足的基本性质如下:

,自己与自己的夹角=0,则=0,所夹的平行四边形的面积也是0。

再看叉乘在数值计算上的定义:

 (展开式一)

先讨论正交基的运算法则:

再代入到(展开式一)

【计算正交基】

向量的经常的一个操作是构造正交基,根据一个向量,构建正交基,往往需要用到叉乘。在给定的单位向量,构建一个与之垂直的向量,则保证其相互垂直,则,随手可构造,再构造

在pbrt-v2的geometry.h的针对向量的定义中有个内联函数用来根据一个输入的向量,计算正交基,输入一个v1,输出v2, 和v3,都是单位向量:

inline void CoordinateSystem(const Vector &v1, Vector *v2, Vector *v3) { if (fabsf(v1.x) > fabsf(v1.y)) { float invLen = 1.f / sqrtf(v1.x*v1.x + v1.z*v1.z); *v2 = Vector(-v1.z * invLen, 0.f, v1.x * invLen); } else { float invLen = 1.f / sqrtf(v1.y*v1.y + v1.z*v1.z); *v2 = Vector(0.f, v1.z * invLen, -v1.y * invLen); } *v3 = Cross(v1, *v2);}

 

 

快三大小单双稳赚买法是与的夹角。

将A,B,的值代入后,整理即得

【向量的叉积】

先看叉积的性质。两个向量的叉积的结果是垂直于这两个向量和的第三个向量,它的方向使用右手螺旋定则,长度则为和所围的平行四边形的面积。

,其中为和的夹角。

叉乘满足的基本性质如下:

,自己与自己的夹角=0,则=0,所夹的平行四边形的面积也是0。

再看叉乘在数值计算上的定义:

 (展开式一)

先讨论正交基的运算法则:

再代入到(展开式一)

【计算正交基】

向量的经常的一个操作是构造正交基,根据一个向量,构建正交基,往往需要用到叉乘。在给定的单位向量,构建一个与之垂直的向量,则保证其相互垂直,则,随手可构造,再构造

在pbrt-v2的geometry.h的针对向量的定义中有个内联函数用来根据一个输入的向量,计算正交基,输入一个v1,输出v2, 和v3,都是单位向量:

inline void CoordinateSystem(const Vector &v1, Vector *v2, Vector *v3) { if (fabsf(v1.x) > fabsf(v1.y)) { float invLen = 1.f / sqrtf(v1.x*v1.x + v1.z*v1.z); *v2 = Vector(-v1.z * invLen, 0.f, v1.x * invLen); } else { float invLen = 1.f / sqrtf(v1.y*v1.y + v1.z*v1.z); *v2 = Vector(0.f, v1.z * invLen, -v1.y * invLen); } *v3 = Cross(v1, *v2);}

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。