Python + Matplotlib 繪製 Aztec Diamond 圖的隨機鋪砌

來源:互聯網
上載者:User

標籤:

一個 $n$ 階的 Aztec Diamond 圖,是指依次將 $2,4,\ldots,2n,2n,\ldots,4,2$ 個單位方格摞在一起得到的對稱圖形(於是圖中一共有 $2n(n+1)$ 個單位方格)。是 $n=5$ 時候的例子:

 

對一個 $n$ 階的 Aztec Diamond 圖,用 $1\times 2$ 的多米諾骨牌鋪砌它,總共有 $2^{n(n+1)}$ 種不同的方法。(這裡不考慮對稱性,比如全部用水平的骨牌鋪砌和全部用豎直的骨牌鋪砌,兩種方法是不同的)

一個有趣的問題是,對給定的 $n$ 階 Aztec Diamond,怎樣從它的所有 $2^{n(n+1)}$ 種鋪砌中等機率地任選一種?當 $n$ 很大時,這個事情並不好做。

下面這個圖顯示了 $n=80$ 時 Aztec Diamond 圖的一個隨機鋪砌,它使用的是 Propp 論文中的 Domino Shuffling 演算法:

 

你可以看到圖中出現了一個近似圓形的地區,在地區的內部,骨牌的排列是變化的,而地區外部則是 "凍結" 的,這就是所謂的 "北極圈" 現象。

 

這個圖是我用 Python + Matplotlib 繪製的,代碼在這裡下載:domino.py。你可以把程式最後的參數 80 改成其它的整數(最好不要超過 200)。Matplotlib 庫繪圖的效率並不高,$n$ 很大時比較吃力,用 Cairo 庫效率要高很多,但是 Cairo 的代碼不如 Matplotlib 簡潔。

 

一點注意事項:

  • Matplotlib 的參數 ‘aspect‘ 要設定為 1,否則它輸出的圖形會展開。
  • 程式中,用一個字典的資料結構儲存鋪砌,鍵 $(j,k)$ 表示以座標整點 $(j,k)$ 為左下角的單位正方形,其值 $‘n‘,‘s‘,‘w‘,‘e‘,‘x‘$ 表示骨牌的狀態,其中 $‘x‘$ 表示 "洞"。
  • 在 create 一步中,當把 $2\times2$ 的 "窟窿" 用一對骨牌填充時,一定要注意所用骨牌的狀態,它們是一對方向相反的骨牌。

 

關於這個演算法的更多故事,我會在後面的文章中介紹。

 

Python + Matplotlib 繪製 Aztec Diamond 圖的隨機鋪砌

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.