叉积

本文详细介绍了叉积的计算方法及其在计算机图形学中的多种应用,包括判断线段拐向、计算面积、判断点是否在三角形内部以及判断两直线是否相交。
叉积的计算是线段方法的核心。考虑如图33-1(a)所示的向量p1和p2。我们可以把叉积解释为由点(0,0),p1,p2 和 p1+p2=(x1+x2,y1+y2)所构成的平行四边形的有向面积。另一种与之等价但更有效的叉积定义方式是将之看做矩阵行列式:
p1×p2=det[x1y1x2y2]=x1y2x2y1=p2×p1

p1×p2值为正,则相对于原点(0,0)来说,p1位于p2的顺时针方向;若p1×p2值为负,则p1位于p2的逆时针方向。图(b)展示了向量p的顺时针和逆时针区域。叉积为0时出现边界情况;在这种情况下,两个向量是共线的,指向相同方向或者相反方向。

  为了确定相对于公共端点p0,有向线段p0p1是在顺时针还是逆时针方向更接近p0p2,我们将p0作为原点从而使问题简化。用p1-p0来表示向量p1=(x1,y1),其中x1=x1x0y1=y1y0,类似的,可以定义p2-p0。然后,计算叉积

(p1p0)×(p2p0)=(x1x0)(y2y0)(x2x0)(y1y0)



下面是叉积的用途:

1.叉积判断线段拐向

这里写图片描述

如上图,可以通过计算向量的叉积来判断拐向,即判断(C-B)×(A-B)的符号。
#若(C-B)×(A-B)> 0 ,则CB在B点顺时针得到AB
#若(C-B)×(A-B)< 0 ,则CB在B点逆时针得到AB
#若(C-B)×(A-B)= 0 ,则A,B,C三点共线。

如图,我们给三个点A,B,C,判断沿着AB到BC,在B点是向右拐还是向左拐。并求出拐的 角度。这个先直接用叉积判断拐向,然后再余弦定理计算角度即可,
用180减去这个角度便是拐的角度。

2.叉积还有一个重要的用处,就是用来求面积

叉积用来求面积,求出的是有向面积,也就是说带正负号,
不过再取一下绝对值就是真正的面积大小了。
比如求三角形ABC的面积,先计算出叉积cross(A,B,C),
那么面积就是fabs(cross(A,B,C))/ 2.0
为什么呢?
我们看一下叉积的定义就知道了,a与b的叉积模为:
|a×b|=|a| |b| sin(a,b)他的几何意义就是以a和b为邻边的平行四边形的面积。

这里写图片描述
3判断点p是否在三角形内。
若在三角形内,则必有S.abc=S.abp+S.acp+S.bcp;若在三角形外,式子就不成立。

4.叉积能判断两直线是否相交。

对于给出的两条线段A1A2,B1B2,判断他们是否相交需要分两步
(1)快速排斥实验
设以线段A1A2和线段B1B2为对角线的矩形为M,N;
若M,N 不相交,则两个线段显然不相交;
判断矩形相交,只需判断某一矩形是否有顶点在另一个矩形内即可。
所以:只有当满足第一个条件时,两个线段才可能相交。
(2)跨立实验
如果两线段相交,则两线段必然相互跨立对方.若A1A2跨立B1B2,则矢量( A1 - B1 ) 和(A2-B1)位于矢量(B2-B1)的两侧,
即:((A1-B1) × (B2-B1) )·( (A2-B1) × (B2-B1))<0。
上式可以改写成:((A1-B1) × (B2-B1)) · ((B2-B1) × (A2-B1))>0。
当(A1-B1) × (B2-B1)=0时,说明A1B1和B2B1共线,但前面已经通过了快速排斥实验,所以A1一定在B1B2上,所以判断线段A1A2是否跨立B1B2的依据就是:
((A1-B1) × (B2-B1)) · ((B2-B1) × (A2-B1))>=0。
同理,判断线段B1B2是否跨立A1A2的依据是:((B1-A1) × (A2-A1)) · ((A2-A1) × (B2-A1))>=0。

这里写图片描述



### 向量的计算方法 向量(Cross Product)是一种仅在三维空间中定义的向量运算,其结果是一个新的向量,该向量与原始两个向量垂直,并且其方向由**右手法则**决定,大小等于由这两个向量所构成的平行四边形的面。[^1] 设两个三维向量分别为: $$ \vec{a} = \begin{bmatrix} a_x \\ a_y \\ a_z \end{bmatrix}, \quad \vec{b} = \begin{bmatrix} b_x \\ b_y \\ b_z \end{bmatrix} $$ 则它们的 $\vec{c} = \vec{a} \times \vec{b}$ 可以通过以下行列式形式计算: $$ \vec{a} \times \vec{b} = \begin{vmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ a_x & a_y & a_z \\ b_x & b_y & b_z \\ \end{vmatrix} = (a_y b_z - a_z b_y)\mathbf{i} - (a_x b_z - a_z b_x)\mathbf{j} + (a_x b_y - a_y b_x)\mathbf{k} $$ 也可以写成向量形式: $$ \vec{a} \times \vec{b} = \begin{bmatrix} a_y b_z - a_z b_y \\ a_z b_x - a_x b_z \\ a_x b_y - a_y b_x \end{bmatrix} $$ 在编程中,例如使用 Python 进行计算,可以使用 NumPy 库的 `cross` 函数: ```python import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) cross_product = np.cross(a, b) print(cross_product) ``` ### 三维向量公式 三维向量的公式可以进一步推广为: $$ \vec{a} \times \vec{b} = |\vec{a}||\vec{b}|\sin(\theta)\hat{n} $$ 其中: - $|\vec{a}|$ 和 $|\vec{b}|$ 是向量的模; - $\theta$ 是两个向量之间的夹角; - $\hat{n}$ 是垂直于 $\vec{a}$ 和 $\vec{b}$ 的单位向量,方向由右手法则确定。 的方向由右手法则确定,即:将右手食指指向第一个向量方向,中指指向第二个向量方向,拇指所指的方向即为的方向。[^3] ### 向量的应用 向量在多个领域中都有重要应用,主要包括: 1. **计算面与体** - 的大小等于两个向量围成的平行四边形的面。 - 若有三个向量 $\vec{a}, \vec{b}, \vec{c}$,则它们的混合 $\vec{a} \cdot (\vec{b} \times \vec{c})$ 表示由这三个向量围成的平行六面体的体。[^3] 2. **物理中的力矩与角动量** - 力矩 $\vec{\tau} = \vec{r} \times \vec{F}$,其中 $\vec{r}$ 是力臂,$\vec{F}$ 是作用力。 - 角动量 $\vec{L} = \vec{r} \times \vec{p}$,其中 $\vec{p}$ 是动量。 3. **计算机图形学中的法向量计算** - 在 3D 图形中,用于计算多边形的表面法向量,用于光照、阴影等渲染效果。 4. **判断向量的方向关系** - 通过的正负可以判断两个向量的相对方向(顺时针或逆时针),这在计算几何中非常有用。[^2] 5. **机器人学与工程力学** - 在机器人运动学中,用于描述旋转轴和角速度之间的关系。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值