The following article is from AI 科技評論 Author 貝爽、陳大鑫
要説在《三體》這本著名的科幻小説中挑選幾個令人印象深刻、血脈膨脹的科幻元素和場景,那 水滴攻擊和 二向箔降維打擊肯定能上榜。 圖注:水滴今天我們就來講一講降維打擊——如何實現對地球 \" 從三維向二維跌落 \"。
在《三體》中,太陽系被一小片二向箔攻擊由三維降至二維的場景描述實在是太吸引人了有沒有:
\" 這是第一個跌入二維的固態行星,與海王星和土星想象比,二維地球的 \" 年輕 \" 更加清晰精緻…… \",聽起來如此有詩意的描述,激發了不少讀者的無限想象,一位重度科幻迷的 B 站 Up 主 Ele 實驗室便是其中一個,起初他想象的三體降維是這樣的:啪的一聲!三維變成二維……
啊這……有點兒草率了。那下面這樣呢?
這種剝橘子的方法顯然也不太行。其實,以上這兩種想法最大的問題就是隻考慮了地球的表面。就像我們在玩遊戲穿模時看到的那樣,目前主流的三維建模技術採用的都是三角面,組成物體的表面,而至於物體的內部則只是空的而已。
但地球其實是一個實心的球體,從內到外依次是地核、地漫、地殼和地表。 這就有點複雜了。那麼該如何實現對三維物體降維攻擊呢?
幾天前,這位 B 站 UP 主在用 threejs 框架編寫程序時,無意間發現了一個 Demo,
它大概這個樣子: 和大多數人一樣,Up 主起初也以為這個密集恐懼者看了流淚、貪吃蛇愛好者見了狂喜的線條,只是一個簡單的數學分析。但研究之後,他發現這其實是大名鼎鼎的希爾伯特曲線。
正是藉助這條曲線,Up 主成功實現了對三體的降維打擊。
希爾伯特曲線
我們先來了解一下什麼是 \" 希爾伯特曲線 \"?
早在 19 世紀時數學界就掀起了一陣用一維直線填滿二維平面的熱潮,換句話説就是找到一維和二維的一個映射,起初是意大利數學家皮亞諾,沒錯,就是時不時出現在高等數學教材裏的老夥計:
他提出了一種能夠填滿平面的曲線皮亞諾曲線,緊接着是德國數學家希爾伯特提出了另外一種希爾伯特曲線,這也就是本文要介紹的 Up 主用來完成降維打擊的工具。希爾伯特曲線是這樣的:這是一個平面正方形,先把它畫為 4 等份,可以使用這樣一條曲線遍歷所有的四個小塊,這就是一階的希爾伯特曲線。
之後每個小塊可以再劃分為 4 等份。如果還想得到一個能夠遍歷出所有小塊的曲線,可先把 4 個小區域內各自畫出一階希爾伯特曲線。 然後把下面兩個分別旋轉 90 度和 -90 度再把它們連起來,這就是二階的希爾伯特曲線。 同樣的道理我們可以得到三階、四階、五階希爾伯特曲線等等。 而當階數趨近於無窮的時候,我們就可以認為曲線 \" 填滿了 \" 整個平面: 只有當這時候才是真正意義上的希爾伯特曲線,而之前階數達不到不無窮的情況,姑且可以稱作 \" 偽希爾伯特曲線 \"。通過遍歷這個曲線我們就可以得到平面上所有的點,雖然希爾波特的曲線取無窮大的時候,在數學上還有很多爭議,但是對於離散系統的計算機來説,這已經很 Nice 了。
那麼,希爾伯特曲線如何實現降維?
舉個栗子:
這是一張 64 × 64 像素的圖片,每個像素剛好是一個小方塊。
我們可以用偽希爾伯特曲線穿過這些像素塊,然後從線的出口處像糖葫蘆一樣向外拉扯這些像素,這樣一來二維圖片就變成了一維的: 當然由於我們無法做到無窮,這只是一種近似。不過,這種降維方式的好處是希爾伯特的曲線在遍歷的時候能夠保證二維平面局部相鄰的點在被扯成一維的時候像素點還是相鄰的,從而降維後的圖案就有自然過渡的效果。
三維降維打擊
按照上面的原理,我們就可以開始着手對三維世界的物體進行二維打擊了。
此時就要讓希爾伯特的曲線的三維結構登場了,它長下面這個樣子: