1、叉乘-數(shù)學(xué)解釋
向量積酗宋,數(shù)學(xué)中又稱外積积仗、叉積,物理中稱矢積蜕猫、叉乘寂曹,是一種在向量空間中向量的二元運(yùn)算。與點積不同回右,它的運(yùn)算結(jié)果是一個向量而不是一個標(biāo)量隆圆。并且兩個向量的叉積與這兩個向量和垂直。其應(yīng)用也十分廣泛翔烁,通常應(yīng)用于物理學(xué)光學(xué)和計算機(jī)圖形學(xué)中渺氧。
叉乘是三維設(shè)計和游戲開發(fā)的底層最簡單邏輯,計算機(jī)從業(yè)者都應(yīng)用理解叉乘租漂。
2維空間中的叉乘是
看起來像個標(biāo)量,事實上叉乘的結(jié)果是個向量颊糜,方向在z軸上哩治。我們來做一個推導(dǎo),我們可以來嘗試計算一下兩個向量圍成的平行四邊形的面積衬鱼,其實可以求向量圍成的三角形的面積业筏。我們知道面積是底*高,所有推導(dǎo)如下:
設(shè):
我找到向量A',使得A?A',
也就出現(xiàn)了
也就是
就有如下推導(dǎo):
這個推導(dǎo)不是很容易直接看懂鸟赫,我來解釋一下蒜胖,首先是A’是如何求得的消别,這非常簡單,但是我們程序員可能忘了:
a,b是兩個向量:a=(a1,a2) b=(b1,b2)
a垂直b:a1b1+a2b2=0
由此可以得到A’,然后是|A|=|A`|,因為是垂直關(guān)系台谢,向量的膜肯定是相等的啊寻狂,然后就是
這是其實更加簡單直接查詢點積公式即:
同樣的后面的利用點積代數(shù)定義:
很容易就得出結(jié)論,這個說的這樣細(xì)致朋沮,就是因為我們程序員可能很久不碰數(shù)學(xué)了蛇券,這個推導(dǎo)對于高中生是非常簡單的。好了樊拓,展示:
繼續(xù)說叉乘:
叉乘不是面積纠亚,叉乘的膜才是面積,嚴(yán)格來說筋夏,叉乘是有向面積蒂胞,正負(fù)代表了面積的方向。好像這樣沒什么意思啊条篷,計算面積沒有簡化都少啊骗随,來看三維向量。
3維空間中的叉乘是:
這里涉及到行列式的計算拥娄,后面在說明蚊锹,我們來看一下結(jié)合意義
不難發(fā)現(xiàn),在3D圖像學(xué)中稚瘾,叉乘的概念非常有用牡昆,可以通過兩個向量的叉乘,生成第三個垂直于a摊欠,b的法向量丢烘,從而構(gòu)建X、Y些椒、Z坐標(biāo)系播瞳,所以上面描述的有方向的面積現(xiàn)在應(yīng)該明白了,因為二維向量的法向量其實就是Z軸免糕,我們把二維向量補(bǔ)齊成三維向量計算赢乓,a=(a1,a2,0) b=(b1,b2,0) 發(fā)現(xiàn)結(jié)果為(0,0,a1b2-a2b1)的一個平行于Z軸的向量。
2石窑、叉乘-程序應(yīng)用
P1(-1,0,1)牌芋、P2(0,2,2)、P3(0,-1,2)三個點正好可以圍成一個三角形松逊,這三角形的面積是多少躺屁?
import numpy as np
# 構(gòu)建點
P1 = np.array([-1, 0, 1])
P2 = np.array([0, 2, 2])
P3 = np.array([0, -1, 2])
# A和B兩個向量尾部相連
A = P3 - P1
B = P3 - P1
# 計算叉乘
A_B = np.cross(A, B)
# 計算叉乘的膜
AB_mo = np.linalg.norm(A_B)
# 計算面積
Area = AB_mo / 2
print("三角形的面積為:", Area)
三角形的面積為: 2.1213203435596424
已知四個點p1(2,0,0),p2(1,0,2),p3(-1,0,0),p4(2,5,0)可以構(gòu)成平行四面體,求它的體積经宏?
這個題目我們利用小學(xué)的知識一樣可以解決犀暑,但是如何利用程序的方式去解決驯击?我們不可能讓計算機(jī)自己畫圖,然后低乘高吧耐亏,而且如果四面體的所有面全部平行四邊形(沒有90度的角)徊都,我們即使繪圖也是不容易求解的。所以苹熏,展示:
空間向量A碟贾,B,C組成平行6面體的三條鄰邊轨域,H是高袱耽,我們知道向量的叉乘的模是面積,所以底面積就是|B×C|干发,關(guān)鍵看H如何表示朱巨,我們設(shè)i為H方向的單位向量,則:
這里參考點積公式
即可明白一個向量點積一個單位向量枉长,結(jié)果為這個單位向量方向上的投影冀续。繼續(xù)展示:
得到:
接著展示:
import numpy as np
# 構(gòu)建點
P1 = np.array([2, 0, 0])
P2 = np.array([1, 0, 2])
P3 = np.array([-1, 0, 0])
P4 = np.array([2, 5, 0])
# 構(gòu)建向量,以P1為原點
A = P2 - P1
B = P4 - P1
C = P3 - P1
# 計算叉乘
A_B = np.cross(B, C)
# 計算點積
volume = np.inner(A, A_B)
print("四點圍成的體積:", volume)
四點圍成的體積: 30