d3可視化實戰03:神奇的superformula

需求驅動實現

前文講過了D3的數據驅動機制,中間所舉的例子都很簡單。例如那個demo裏面,綁定的數據是一個簡單的數組,實現的圖元也僅僅是一堆用SVG畫的circle。可是現實世界中咱們每每會遇到複雜的需求,例如我就遇到了這樣一個需求:數據是一個複雜的對象數組,而與之綁定的圖元是一個可變圖形。該圖形能夠根據與他綁定的數據中的具體參數,在圓形、方塊、三角之間切換,而且要求過渡天然。html

面對這個需求,最直接的作法是把圓形、方塊、三角用SVG的<circle>圓形標籤,<rect>矩形標籤以及<polygon>多邊形標籤來分別實現。具體用D3實現,就是建立一個<g>集合標籤做爲數據綁定對象,根據數據參數的變化,remove裏面的原有圖形,add新的圖形,從而實現數據驅動的圖形更新。可是這種方法有一個很難解決的問題,就是圖形切換時的過渡動畫很難平滑。由於每一個圖形都是獨立的標籤,除了採用淡入淡出之類的過渡方法外,很難想到有什麼更好的過渡效果。而且出於對代碼簡化的考慮,g標籤內包裹其餘的圖形標籤的方式,也增長了複雜度。git

那麼還有其餘方案嗎?若是能有一個萬能圖形標籤來來實現各類圖形,把數據直接綁定給它,那就再好不過了。事實上SVG的<path>路徑標籤就能夠實現這一點。在我以前的文章」d3可視化實戰01:理解SVG元素特性「中已經提到,路徑功能很是強大幾乎能夠描繪任何圖形。惟一的問題是,如何指定Path的具體參數。對於通常狀況,咱們能夠本身設定參數。而在這裏,我打算用一個數學模型來指定path的具體參數,那就是superfomula超級方程式。最終實現的效果果真很是好,動畫過渡很是平滑,圖元自己也很簡單。下面讓咱們看看這個superfomula到底是何方神聖吧。github

about超級方程式

superfomula3D

咱們知道,不少數學函數均可以用解析式的方式表示,亦可根據變量和自變量的值在不一樣座標系下繪成各類圖形。Johan Gielis博士提出了一個函數,能夠描述天然界中發現的衆多複雜圖形和曲線,它就是超級方程式superfomula數組

超級方式的解析式以下:svg

r\left(\varphi\right) =<br /><br /><br /> \left[<br /><br /><br />         \left|<br /><br /><br />                 \frac{\cos\left(\frac{m\varphi}{4}\right)}{a}<br /><br /><br />         \right| ^{n_{2}}<br /><br /><br /> +<br /><br /><br />         \left|<br /><br /><br />                 \frac{\sin\left(\frac{m\varphi}{4}\right)}{b}<br /><br /><br />         \right| ^{n_{3}}<br /><br /><br /> \right] ^{-\frac{1}{n_{1}}}<br /><br /><br />

在極座標系下,r表明半徑,\varphi表明角度,a,b,m,n1,n2,n3是可變參數。經過調整參數的值,就能夠繪出各類圖形。下圖展現了a=b=1的狀況下,m,n1,n2,n3取不一樣值的時候superfomula所展現的圖形:函數

只經過控制這些參數,就能在極座標系下繪製如此不一樣的各類2D圖形,是否是很神奇?這就是數學這一天然科學的王冠學科的魅力。學習

關於superfomula的更多介紹:動畫

superfomula的發表者Johan Gielis博士(1962-)本來的研究方向是園藝工程和生物學。在他的早期研究階段他就感興趣於使用數學模型表徵生物生長性狀。1994年發表的論文中他就開始開始使用曲線描述天然形狀,在1997年的論文中他發現廣義的曲線模型適用於任何對稱形狀。在2003年發表於美國植物學雜誌上的論文A generic geometric transformation that unifies a large range of natural and abstract shapes中,他提出了superfomulasuperfomula是超級橢圓公式superellipse的擴展,但具備更普遍的實用性。此後數百篇論文都引用了superfomula,而且以superfomula爲指導的計算機繪圖程序也隨之出現。2004年johan Gielis博士收到了InterTech技術創新卓越獎,該獎主要頒發給對平面藝術及相關產業產生重大影響的技術發明。superfomula從生物技術研究中誕生,在數學領域中昇華,並最終應用到計算機、平面設計等領域。可謂是跨學科研究應用的最好案例之一。this

superfomula也能夠擴展到3維,4維甚至更多維度。例如3維狀況下,圖形能夠經過兩個superfomula r1, r2來生成。其極座標系與笛卡爾座標系之間轉換關係爲:spa

 x \,=\, r_1(\theta)\cos(\theta)r_2(\phi)\cos(\phi)
 y \,=\, r_1(\theta)\sin(\theta)r_2(\phi)\cos(\phi)
 z \,=\, r_2(\phi)\sin(\phi)

其中,\phi 變量值域爲[ -π/2 , π/2] (latitude維度), θ變量值域爲 [ -π, π] (longitude精度).

 

案例及代碼實現

在github上,已經有人用D3實現了基於superfomula的圖形繪製程序。你們請點擊這裏:http://bl.ocks.org/mbostock/1021103. 該程序的關鍵是基於D3的superfomula開源插件。本着學習的目的,這裏保存了該插件的源碼,你能夠複製它而後保存爲d3-superfomula.js來使用:

 

 

相關文章
相關標籤/搜索