关于叉积

学过计算几何以后,我发现几乎每一道题都用到了叉积这个东西

叉积是什么呢

在这个图中(以原点为中心)叉积就是x1*y2-x2*y1

( 记得话就记1221,x前y后)

但是这并不是完全正确

比如说这个图

在这个图中,点1和点2是以点0为中心,不是原点

因此我们可以把点0当成原点

x1 = p1.x-p0.x;
y1 = p1.y-p0.y;
x2 = p2.x-p0.x;
y2 = p2.y-p0.y;

(p1表示点1,p2表示点2,p0表示点0 )

在此之后,我们又可以用原来x1*y2-x2*y1的公式来求叉积了

所以叉积的代码是 

int multi ( node p1 , node p2 , node p0 ) {
	int x1 , y1 , x2 , y2 ;
	x1 = p1.x-p0.x , y1 = p1.y-p0.y ;
	x2 = p2.x-p0.x , y2 = p2.y-p0.y ;
	return x1*y2 - x2*y1 ; 
}

注意一下double和int的类型

 

第二个问题就是叉积怎么用

当我一开始学习计算几何根本就不懂叉积的意思是什么

我听老师说如果

叉积>0 , 则以点0为中心点1逆时针转向点2

叉积=0,则三点共线

叉积<0 , 则以点0为中心点1顺时针转向点2

终于理解了意思,但为什么是这样呢,我用各种方法都没有知道原因

直到我做了一道题,就是求三角形的面积(边不一定与坐标轴平行)

然后老师用了叉积除以2就可以得到面积

起初我不信,然后就试了很多种情况,都证明这个结论是对的

我研究了好一会儿,才理解了原理

把刚才的那个图片拿出来

我们给ta做一个辅助线

变成这样

据图得知

AE = x1 , AB = CD = y1 , BC = AD = x2 , CF= y2

DE = BC-AE = x2-x1 , DF = DC-FC = y1-y2

呵呵,图片似乎有点丑

S正方形ABCD = AB * BC = x2*y1

S▲ABE = AE * AB / 2 = x1*y1/2

S▲EDF = ED*DF/2 = (x2-x1)*(y1-y2)/2 = (x2*y1-x2*y2-x1*y1+x1*y2 ) / 2 

S▲BCF = BC * CF / 2 = x2*y2/2

所以

S▲BEF = S正方形ABCD - S▲ABE - S▲EDF - S▲BCF

                = x2*y1- ( x1*y1 +  x2*y1-x2*y2-x1*y1+x1*y2   +   x2*y2  ) / 2

                = x2*y1 - ( x2*y1 + x1*y2 ) / 2

                = - ( x1*y2 - x2*y1 ) / 2 

记得前面有个负号

补充一下

对于钝角三角形,就连接连接钝角顶点和矩形的一个顶点,还是可以证明的

 

这个面积不仅解释了叉积求面积的问题,也解释了前面的问题

叉积>0 , 则以点0为中心点1逆时针转向点2

叉积<0 , 则以点0为中心点1顺时针转向点2

通过求面积,这两个理论也被很好的解释了

但还有一个,就是三点共线的问题

为什么三点共线的时候叉积就是0呢?

这个要分两种情况讨论

情况一 :点0不在中间

我们可以考虑将点0假设成原点

然后过点1和点2向x轴,y轴分别作垂线

我们根据三角形全等和相似的结论可以求出

x2 = tx1 , y2 = ty1

叉积 = x1*y2-x2*y1 = x*ty - tx*y = txy-txy = 0 

反过来亦是如此

 

 

情况2 :点0在中间

我们可以考虑先将点0变成原点

那么我们可以考虑给点2做一个原点对称点点3

点3就是 ( -x2 , -y2 ) , 也可以说点2是放过来的点3

根据情况2得出的结论,点3也是tx1和ty1

也就是说 -x2 = tx1 , -y2 = ty1

叉积 = x1 * y2 - x2 * y1

         = - x1*(-y2) + ( -x2) * y1 

         = - x1 * ty1 + tx1 * y1

         = - t * x1 * y1 + t * x1 * y1

         = 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. **机器人学与工程力学** - 在机器人运动学中,用于描述旋转轴和角速度之间的关系。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值