,"> 。">

最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Houdini學習筆記035_Poincaré Disc(龐加萊圓盤)<上>

2022-09-26 16:39 作者:獨孤嘌呤  | 我要投稿

先說說我為什么會學這個,起因是下面這幅畫。這是我崇拜的荷蘭藝術(shù)家Escher的代表作之一——Circle Limit IV。Escher的畫作中充滿了數(shù)學計算和空間幾何的概念,很難想象不借助計算機單靠尺規(guī)作圖能完成這樣的作品。

M. C. Escher(Circle Limit IV)

于是我開始搜索關(guān)于這幅作品的幾何知識,發(fā)現(xiàn)這個圓叫做Poincaré Disc(龐加萊圓盤),它屬于一種羅氏幾何模型。我們熟知的幾何是歐式幾何,而羅氏幾何是非歐幾何。在這一幾何體系中,“第五公設(shè)”的表述為:過直線外一點至少有兩條直線和已知直線平行。

是不是有點懵?

與羅氏幾何對應的還有黎曼幾何,它直接認為過直線外一點不存在已知直線的平行線

其實,這三種幾何都是成立的,只是適應的體系不同。我們熟悉的歐式幾何反映的是平直空間的幾何關(guān)系,而羅氏幾何和黎曼幾何分別適用于負曲率空間和正曲率空間。愛因斯坦的廣義相對論就是受到黎曼幾何的啟發(fā)而提出的。

簡單來說,我們可以把龐加萊圓盤看作一個異空間,在這個空間中,圓心處距離為0,圓周上的點相當于無窮遠。而連接圓內(nèi)兩點(非圓心)的直線用圓弧來表示,稱之為hyperbolic line。

花了好幾天的時間終于厘清了其中的數(shù)學關(guān)系,甚至找到了幾篇相關(guān)的文獻,比如下面這篇Dunham教授1986年發(fā)表的文章。文獻中給出了類似上述Circle Limit IV圖案的畫法,分為兩個基本步驟,先畫出一個單元圖案,然后利用在空間中的變換關(guān)系拷貝得到其他的圖案。

但是文獻中給出的是變換矩陣迭代的方法,本來就是非歐幾何空間,還要不斷計算更新變換矩陣,我果斷放棄了。然后搜了下Horikawa小哥的教程,居然有這方面的介紹(點這里),然后就找到了這個網(wǎng)站http://www.malinc.se。

又花了一個周末的時間,費了一大堆稿紙,確定文獻中給的步驟是合理的。但要在Houdini中實現(xiàn),我們需要借助一個工具——Mobius Inverse(莫比烏斯變換)。具體見下圖,對于圓內(nèi)一點A,過A點作垂直于OA的弦,并與圓相交于H點。過H點作圓的切線,與OA的延長線交于M點。由相似三角形關(guān)系可知:OA · OM =?OH^2 = r^2。M就是A點相對于圓O的莫比烏斯變換點。

今天我們先學習第一步,初始單元圖案的制作。這里需要定義兩個參數(shù):pq。p是多邊形的邊數(shù),q是交點的連線數(shù)。比如下圖中,p = 4意為每個圖形都是四邊形,q = 5意為每個交點處連接有五條邊(不經(jīng)過圓心的邊在歐式幾何中<即我們在屏幕上看到的>都是弧線)。

如果初始圖案的中心點位于圓心,繪制起來相對簡單一些。但是為了賦予其更多變化,我們讓它可以是圓內(nèi)的任意一點。問題是,當中心點移動時,初始圖案并不是在歐式幾何平面內(nèi)那樣簡單的移動旋轉(zhuǎn),我們需要在新的中心點和圓心之間找到垂直平分線(也是一條弧線),然后進行莫比烏斯變換。

中垂線可由下圖得到,對于圓內(nèi)任一點B(除圓心O外),M為OB延長線上一點(圓外),A是OB在龐加萊圓盤中的中點,注意這里看上去兩端不相等,因為越靠近圓周,同樣長度的線段表示的距離就越大(www.malinc.se這里有具體的計算方法)。對于圓M來說,O和B滿足莫比烏斯反演變換關(guān)系。圓M在圓O內(nèi)的弧線就是OB的垂直平分線。

創(chuàng)建一個null節(jié)點(取名“CONTROLLER”),自定義如下參數(shù):p和q為整數(shù),需滿足(p-2)(q-2) > 4才有解,取值范圍可分別設(shè)為3~10。r是初始圖案中心點B距圓心O的距離,范圍為0~1。theta是B點繞圓心的角度,其坐標可表示為(r*cos(theta), r*sin(theta), 0)。rotation是初始圖案繞中心點B旋轉(zhuǎn)的角度,默認為0。最后,segments是畫弧線取的分段數(shù),默認設(shè)為10。

創(chuàng)建一個Attribute Wrangle節(jié)點,用于初始圖案的繪制,Run Over方式改為Detail (only once)。全部代碼如下,我們逐一來解釋:

首先定義了兩個函數(shù),一個是mobiusInverse(莫比烏斯變換),給定圓心o和半徑r,對于點m求其變換后的坐標,返回的是一個矢量。因為所有的圖案都是在xy平面內(nèi),z方向上的坐標值為0,計算時可忽略。

第二個自定義函數(shù)getCircle是根據(jù)三個點坐標求外接圓圓心,網(wǎng)上套用的計算方法,最后返回圓心坐標center和半徑radius。

單元圖案的半徑d用如下公式計算,跟p和q的值有關(guān)。由

如果初始圖案的中心位于圓心,假設(shè)A點坐標為(d,0,0),第二個點B點坐標為(d*cos(θ), d*sin(θ), 0)。這里的θ = 2π/p。另外一個點A'的坐標為(1/d,0,0)。點A、A'、B三點在一個圓上,用getCircle函數(shù)找出這個圓的圓心和半徑。AB兩點之間的弧線就是初始圖案的其中一條邊。繞O點旋轉(zhuǎn)p-1次就可以得到完整的圖案。

如果初始圖案的中心不在O點,而是在C點(由自定義參數(shù) r 和 theta確定)。下面的代碼就是計算OC的中垂線(弧)對應的圓心cm和半徑rm。注意是r != 0時,如果r=0,表示初始圖案中心就是圓心O,無需進行莫比烏斯變換。

再后面是創(chuàng)建弧線的數(shù)學計算部分,用了兩層for循環(huán),內(nèi)層循環(huán)是在一段弧上挨個生成點,最后連成弧線;外層循環(huán)是通過旋轉(zhuǎn)分別得到其他的弧線。所以外層循環(huán)共p次,內(nèi)層循環(huán)segments+1次。

這里大家不熟悉的一個是ident(),一個是rotate函數(shù)。前者定義一個標準矩陣,后者是對矩陣進行旋轉(zhuǎn)的函數(shù)(得到的是一個旋轉(zhuǎn)矩陣)。變量4 = ZAXIS,也可以用{0,0,1}表示。

坐標乘上旋轉(zhuǎn)矩陣就會得到旋轉(zhuǎn)后的坐標:

看下最終的結(jié)果——

可以看到,當圖案遠離圓心時會越來越小。但是在羅氏空間中,其半徑和每邊的邊長都是不變的。后面我們會對這個初始形狀不斷進行莫比烏斯變換,充滿整個龐加萊圓盤。今天的內(nèi)容到此為止,不指望有幾個人能完全理解,看看就好。

Houdini學習筆記035_Poincaré Disc(龐加萊圓盤)<上>的評論 (共 條)

分享到微博請遵守國家法律
金昌市| 岱山县| 泾源县| 雅安市| 理塘县| 奉节县| 钟祥市| 威海市| 鸡西市| 海兴县| 湟源县| 渝北区| 乐陵市| 新巴尔虎右旗| 西藏| 华坪县| 蓝山县| 吉林省| 札达县| 滕州市| 深州市| 东方市| 潼南县| 乌兰察布市| 丰宁| 枣庄市| 咸丰县| 长子县| 兴宁市| 溧水县| 九寨沟县| 吉林省| 绥芬河市| 琼结县| 齐齐哈尔市| 寿光市| 易门县| 绍兴县| 潮安县| 海阳市| 福鼎市|