官术网_书友最值得收藏!

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é)。

我的包裝器使用了諸如Points3DArrow3D這些新的類來將三維對象和二維對象區(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的立方體

主站蜘蛛池模板: 营口市| 如东县| 罗城| 泸定县| 攀枝花市| 峨山| 三亚市| 马尔康县| 武穴市| 深圳市| 广州市| 桂林市| 凤冈县| 大田县| 报价| 铜山县| 白城市| 奇台县| 美姑县| 黑龙江省| 灵丘县| 徐汇区| 郯城县| 塘沽区| 仁化县| 温宿县| 宝山区| 霍城县| 曲阳县| 蓬莱市| 丰原市| 兴和县| 靖安县| 武城县| 道孚县| 重庆市| 会泽县| 太保市| 麦盖提县| 定州市| 舒城县|