- 程序員數(shù)學(xué):用Python學(xué)透線性代數(shù)和微積分
- (美)保羅·奧蘭德
- 1984字
- 2022-01-10 14:44:13
3.1 在三維空間中繪制向量
在二維平面上,向量擁有三種可互換的心智模型:坐標(biāo)對、有固定長度和方向的箭頭以及相對于原點的點。由于本書篇幅有限,我們只專注于平面的一小部分——如圖3-3所示的長寬固定的矩形。

圖3-3 二維平面的一小部分
也能以類似的方式解釋三維向量。我們從三維空間中的一個小方框開始,而不是觀察平面中的矩形。這樣的三維框(如圖3-4所示)具有有限的長度、寬度和高度。三維空間中仍然保留了方向和
方向的概念,并增加了
方向來測量高度。

圖3-4 三維空間中的小框具有長度()、寬度(
)和高度(
)
可以說,所有二維向量也都存在于三維空間中,它們的大小和方向不變,但被固定在一個高度為零的平面上。圖3-5顯示了被嵌入三維空間的向量(4, 3)的二維圖形,它的特征與之前相同。右圖對所有仍然保持不變的特征添加了注釋。

圖3-5 三維世界包含的二維世界和其中的向量(4, 3)
虛線在沒有深度的二維平面中形成了一個矩形。畫出垂直相交的虛線有助于定位三維空間中的點。否則,我們可能會受到視覺的誤導(dǎo),點其實不在我們認(rèn)為的位置上。
可見,向量不僅存在于平面中,也存在于更大的三維空間中。我們可以畫出另一個三維向量(新的箭頭和新的點),它位于原來的平面之外,向更大的高度值延伸(見圖3-6)。

圖3-6 與圖3-5中的二維世界和其中的向量(4, 3)相比,延伸到三維的向量
通過繪制虛線框而不是圖3-5中的虛線矩形,可以明確第二個向量的位置。在圖3-6中,這個虛線框顯示了向量在三維空間中覆蓋的長度、寬度和高度。就像在二維平面上一樣,箭頭和點在三維空間中充當(dāng)向量的心智模型,同樣可以用坐標(biāo)來測量。
3.1.1 用坐標(biāo)表示三維向量
在二維平面上,(4, 3)這個數(shù)對足以指定一個點或箭頭,但在三維空間中,存在許多坐標(biāo)為4、
坐標(biāo)為3的點。事實上,在三維空間中,有一整條線上的點都有這個坐標(biāo)(如圖3-7所示),每個點在
(高度)方向上都有不同的位置。

圖3-7 坐標(biāo)和
坐標(biāo)相同但
坐標(biāo)不同的幾個向量
要在三維空間中指定唯一的點,總共需要三個數(shù)。像(4, 3, 5)這樣的三元數(shù)對在三維空間中稱為向量的坐標(biāo)、
坐標(biāo)和
坐標(biāo)。和以前一樣,可以將這些數(shù)理解為找到所需點的指令。如圖3-8所示,要找到(4, 3, 5)這個點,首先在
方向上移動+4個單位,然后在
方向上移動+3個單位,最后在
方向上移動+5個單位。

圖3-8 坐標(biāo)(4, 3, 5)指定三維空間中該點的方向
3.1.2 用Python進(jìn)行三維繪圖
和第2章中一樣,我們使用Python的Matplotlib庫的包裝器來繪制三維空間中的向量。你可以在本書的源代碼中找到實現(xiàn)方法,但我將堅持使用一些包裝器來專注于繪圖的概念性過程,而不是Matplotlib的細(xì)節(jié)。
我的包裝器使用了諸如Points3D
和Arrow3D
這些新的類來將三維對象和二維對象區(qū)分開來。新函數(shù)draw3d
負(fù)責(zé)解釋和渲染三維對象,讓它們看起來是三維的。draw3d()
會默認(rèn)顯示軸、原點以及三維空間中的小框(見圖3-9),即使沒有指定要繪制的對象時也是如此。

圖3-9 用Matplotlib的draw3d()
繪制一個空的三維區(qū)域
盡管看上去有所偏斜,但繪制出的軸、
軸和
軸在空間中是垂直的。為清晰起見,Matplotlib會在框外顯示單位,但將原點和軸本身顯示在框內(nèi)。原點的坐標(biāo)是(0, 0, 0),坐標(biāo)軸從它出發(fā)并分別在
、
和
正負(fù)方向上延伸。
Points3D
類存儲了我們希望以點來呈現(xiàn)的向量集合,因此會在三維空間中將其繪制為點。例如,下面的代碼可以繪制出向量(2, 2, 2)和(1, -2, -2),生成圖3-10。
draw3d(
Points3D((2,2,2),(1,-2,-2))
)

圖3-10 畫出點(2, 2, 2)和(1, -2, -2)
為了將這些向量可視化為箭頭,可以將向量表示為Arrow3D
對象。此外,也可以用Segment3D
對象連接箭頭的頭部,如圖3-11所示。
draw3d(
Points3D((2,2,2),(1,-2,-2)),
Arrow3D((2,2,2)),
Arrow3D((1,-2,-2)),
Segment3D((2,2,2), (1,-2,-2))
)
要看出圖3-11中箭頭的指向有點兒困難。為了讓方向更清晰,可以在箭頭周圍畫上虛線框,使其看起來更立體。由于會頻繁繪制框,因此我創(chuàng)建了Box3D
類來表示一個角位于原點、其對角位于給定點的框。圖3-12展示了這個三維框,代碼如下所示。
draw3d(
Points3D((2,2,2),(1,-2,-2)),
Arrow3D((2,2,2)),
Arrow3D((1,-2,-2)),
Segment3D((2,2,2), (1,-2,-2)),
Box3D(2,2,2),
Box3D(1,-2,-2)
)

圖3-11 繪制三維箭頭

圖3-12 繪制虛線框,使箭頭看起來是三維的
本章用了許多關(guān)鍵字參數(shù),但沒有明確地加以介紹(希望它們的含義不言自明)。例如,color
關(guān)鍵字參數(shù)可以被傳遞給大多數(shù)構(gòu)造函數(shù),來控制所繪對象的顏色。
3.1.3 練習(xí)
練習(xí)3.1:繪制表示坐標(biāo)(-1, -2, 2)的點和三維箭頭,以及使箭頭更立體的虛線框??梢允謩永L制來進(jìn)行練習(xí),不過從現(xiàn)在開始,我們將使用Python來繪圖。
解:答案如圖3-13所示。
![]()
圖3-13 向量(-1, -2, 2)和使箭頭更立體的虛線框
練習(xí)3.2(小項目):有8個三維向量的坐標(biāo)都是+1或-1。例如,(1, -1, 1)就是其中之一。將這8個向量繪制成點。然后想辦法通過
Segment3D
對象用線段將它們連接到一起,以形成立方體的輪廓。提示:總共需要12條線段。
解:因為只有8個頂點和12條邊,所以要把它們?nèi)苛谐鰜聿⒉惶珶┈?,不過這里使用列表推導(dǎo)式來枚舉它們。對于頂點,讓
、
和
分布在兩個可能值組成的列表
[1,-1]
上,并收集8個結(jié)果。對于邊,把它們分成3組、每組4條,分別指向每個坐標(biāo)方向。例如,有4條邊從指向
,它們的
坐標(biāo)和
坐標(biāo)在兩個端點處都是相同的。結(jié)果如圖3-14所示。
pm1 = [1,-1] vertices = [(x,y,z) for x in pm1 for y in pm1 for z in pm1] edges = [((-1,y,z),(1,y,z)) for y in pm1 for z in pm1] +\ [((x,-1,z),(x,1,z)) for x in pm1 for z in pm1] +\ [((x,y,-1),(x,y,1)) for x in pm1 for y in pm1] draw3d( Points3D(*vertices,color=blue), *[Segment3D(*edge) for edge in edges] )
![]()
圖3-14 所有頂點坐標(biāo)等于+1或-1的立方體
- 微信公眾平臺與小程序開發(fā):從零搭建整套系統(tǒng)
- Mastering Natural Language Processing with Python
- Java編程指南:基礎(chǔ)知識、類庫應(yīng)用及案例設(shè)計
- jQuery從入門到精通 (軟件開發(fā)視頻大講堂)
- 零基礎(chǔ)學(xué)Python數(shù)據(jù)分析(升級版)
- Android Native Development Kit Cookbook
- Python時間序列預(yù)測
- R Data Analysis Cookbook(Second Edition)
- ANSYS Fluent 二次開發(fā)指南
- Java系統(tǒng)化項目開發(fā)教程
- Java Web開發(fā)就該這樣學(xué)
- Android驅(qū)動開發(fā)權(quán)威指南
- 響應(yīng)式Web設(shè)計:HTML5和CSS3實戰(zhàn)(第2版)
- Android傳感器開發(fā)與智能設(shè)備案例實戰(zhàn)
- Vue.js光速入門及企業(yè)項目開發(fā)實戰(zhàn)