為第12版 Wolfram 語言建立均勻多面體

多面體是什么?

多面體是由平面多面體面組成的三維幾何體。相鄰的面相交于邊,邊相交于定點。多面體的奇妙已經超越數學家研究的范疇了。古希臘人證明有五個正多邊形或稱為柏拉圖多面體(正四面體、正方體、正八面體、正十二面體)都新引進了第十二版:

1.png

十六世紀天文學家開普勒甚至用多面體研究在他那個時代已知的太陽系六個行星的軌跡比率關系。

模型展示了柏拉圖體鑲嵌在球體內,每個多面體都接觸兩個行星球體。開普勒相信這能解釋行星間的距離和為什么存在恰好六顆行星:

2.png

但是,直到歐拉才發現了一個關于多面體的重要公式,內容是正多面體頂點的數量減去邊數加上面數等于2:

V – E + F = 2

這個等式的左邊稱為歐拉-龐加萊示性數,我們可以在第十二版中用EulerCharacteristic來測試:

3.png
在那時,多面體的理論主要集中在測量角度、求多面體面的面積和邊長等屬性。而歐拉則開始不同的屬性對多面體進行分類。就像哥德巴赫的理念一樣,歐拉也討論了他認為的關于多面體的重要部分:面、頂點和邊。這樣,歐拉不僅提出了他著名的歐拉-龐加萊示性數,他還為拓撲學的發展鋪平了道路:他不像傳統幾何學一樣把重點放在距離上,而是像拓撲學一樣使用其他屬性來描述一個面。

多面體到底是什么?

盡管為幾何形狀建立模型看上去是一件很直接的操作,但是還是有一些特殊的事情需要考慮。對于什么是多面體這件事總是有不同的觀點。像前面提到的一樣,最常見的概念是,多面體是由頂點、邊和面組成的。但是,現在依然沒有一個普遍接受的多面體定義。有些人說多面體包括凸多面體和非凸多面體,而另一些人認為多面體只是凸多面體。

多邊形的研究者還在其他很多方面有爭論。如果多面體內有多邊形相交呢?模型內部發生的事情是否應該考慮?那使用五角星形和其他多邊形的均勻多面體呢——這種情況也有爭論?模型是否應該用空集來描述?這樣有爭議的觀點使得為多面體建立模型更加困難。

特別的均勻多面體

多面體有很多種,但是這篇博文會著重75種特殊的多面體,一般稱為均勻多面體。均勻多面體有點傳遞的特點,每條邊只有兩個面;更重要的是,所有組成這些多面體的多邊形都是正多邊形。在第十二版中,我們可以使用EntityList和UniformPolyhedron來為我們提供均勻多面體的信息:

1.jpg

從模型中提取信息

一般能找到的多面體模型長這樣:

4.png

這些是均勻多面體的圖形表示。在第十二版之前,PolyhedronData有其中一部分多面體的信息。在第十二版中,我們現在可以把第一個模型表示為72個面和30個頂點:

5.png

使用FaceForm,我們可以看到在某些區域多面體面的朝向有翻轉:

7.png
6.png

這個模型有相交的多邊形,也沒遵守多邊形的“右手法則”(如圖所示),說明它的面朝向不對:

8.png

為了在這個項目中復制多面體,必須改變這些模型來解決這些問題。我的第一個方法很簡單,使用標準模型得到頂點,使用這些頂點重構多面體,然后根據右手原則改變面的朝向。下一步是將模型等比例縮放到單位尺寸,并收集精確的坐標。可惜的是,在數次嘗試獲取精確坐標失敗后,我得出結論,從這些模型中獲取坐標并不是一件簡單的事。現在是時候往回看看并花時間進一步了解多面體。

創建幾何體

有一些多面體有共同結構的頂點和邊。這樣,我就可以整合PolyhedronData里有的均勻多面體數據重建這些有類似屬性的多面體。用這種方法,我可以匯集某個均勻多面體和它的“兄弟們”,并“調整”面以創建多面體。

我們嘗試一下創建小菱方八面體。使用在PolyhedronData中小菱方八面體的頂點和共同邊的數據(在這個例子中是12個方形面)并使用FaceForm確保所有面都遵守右手法則:

9.png
10.png

最后以下面多面體的“殼體”結束:

11.png

與第一個模型相比,我們可以看到這個殼體缺少八邊形的面。可以通過可視化第一個模型與殼體的比較來定義這些面:

12.png

現在我們把新的八邊形面加入殼體中:

13.png

    

這樣就創建了一個新的小菱方八面體!

但是,這個模型有翻轉面。創建多面體的時候,通常不會考慮到有些面可以從兩邊被看到,不然就會產生翻轉面。修復這個問題的一個方法是把多邊形分割并遵守右手法則。在這個范例中,八邊形就變成了三角形和矩形。

14.png

15.png

這個小菱方八面體就完成了!使用FaceForm,我們可以檢查知道這個模型的面朝向正確。

16.png

模型中不再有面朝向的問題,這樣這個過程可以重復于大多數均勻多面體。

更復雜的模型需要不同的方法,對這些模型,我們可以使用二叉空間分割 (BSP)樹。有了精確坐標和面之后,我們可以重新創建多面體,但是如果確保所有面的朝向都正確卻還不清楚。對于像小菱方八面體這樣的多面體,可以很容易看出哪里的面應該被分割才能讓多面體保持連續性。對于其他多面體,如大二十面半十二面體(great icosihemidodecahedron),決定哪個面應該被分割這件事就不是那么容易了。所以此時需要借用BSP樹來讓我們觀察網格圖形的哪個面應該被分割。

這里我們有一個使用從其凸包而來的精確坐標所得的沒有變形體的大二十面半十二面體( icosihemidodecahedron),二十面體和與其有相同邊結構的大三十二面體( icosidodecahedron )(三角面)和(great dodecahemidodecahedron)大十二面半十二面體(十字形面):

17.png

18.png

19.png

使用FaceForm,我們可以看到這個模型有翻轉面:

20.png

這個問題可以按照小菱方八面體的類似方法解決。但是,很難能看出哪里的面需要被分割。這就是BSP樹派上用場的地方了,因為它可以更近距離更清楚地看到應該在哪里分割多面體的面,并提供需要有新分割的坐標。

使用BSP樹,網格圖被轉化成了網格分區,然后可以用來了提取必要的信息。
網格圖被分區后,可使用Graphics3D來看當前的面朝向,并集合需要做分割的地方:
21.png

一旦決定了哪里的面可以被分割,可以從BSP樹方法中得到的網格中提取坐標。

切割角?

雖然我們有所有均勻多面體的精確坐標,有些多面體中相交的面使得很難決定在哪里分割多邊形,尤其是在非凸多邊形中。

很難分割的多面體范例包括扭棱十二合十二面體(snub dodecadodecahedron)、大后扭棱二十合三十二面體(great retrosnubicosidodecahedron)和大雙斜方三十二面體(great dirhombicosidodecahedron)等。從可視化和計算兩個方面考慮,很難找到哪里的面需要被分割才能生成有精確坐標和正確面朝向的原模型副本。這個過程即使在BSP樹分析后,如果在存在很難分辨大量重疊面、星形多面體的孔洞等的情況下還是會非常困難。

2.jpg

所以這時候我決定回到基本,手動生成這些多面體。我想要避免打印出之前制作的多面體網。如果我使用了網,之前計算的時候遇到的問題不一定會出現。為了做到這一點,我切割了一些多邊形以生成多面體。對于小菱方八面體,我用了一個兩英寸的比例標尺生成了必要的正方形和八邊形。

然后我馬上就遇到了之前計算時碰見的問題:相交的多面體。這個問題可以用在多面體中制造割口的方式解決。但是我立刻意識到,八邊形面可能會需要多次切割。在數次多邊形切割后,我終于生成了小菱方八面體的八邊形架構。最后一步就是應用那些方形面,最終生成了小菱方八面體。
3.jpg


使用這個用切割新生成的小菱方八面體,我還可以三維打印這個模型,以和紙面模型做一個對比。

4.jpg

根據我們手動建構多面體的經驗,必要的操作是要分割多邊形,才能最終把多面體組合在一起。

在我們逐漸可以熟練操作某些多面體后,我們現在可以著手試一試之前在計算上欺騙了我的一些多面體,比如大斜方截半二十面體(great rhombicosidodecahedron)。在這個過程中我們還在發現新的思維方式,雖然還是有很多挑戰需要解決——即使是要生成這些多面體的紙面模型也很難,而且在哪里做切割也不是很明確。我們還會繼續研究,發現Wolfram語言中的均勻多面體——所以時刻注意我們的大反扭棱三十二面體哦!

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
1