明天是七夕,中國的情人節,為了應節,這一篇提供幾個心形曲面的算法.
說到心形,我想到一個笑話,有個女老師在黑板上畫了個心形圖案,問學生加:"這是什么?"學生們回答:"屁股."老師氣哭了,去找校長理論.校長來了就批評學生:"你們怎么又的把老師給氣哭了呢?"然后看到了黑板上的圖案繼續說道:"你們也太調皮了,怎么還在黑板上畫了個屁股呢!"
好笑吧,其實我也有類似的經歷,有人曾對我說:"你怎么拿個屁股做博客園的頭像呢?"我只好無奈的回答:"這不是屁股,這是心形,而且這個心形是我用程序畫出來的."關於我的心形頭像生成的算法,請看我之前發的博客:屏保:畫線圈LineFlower, 3D屏保: 線圈, WhyDemo: 畫線圈LineFlower.
我前幾天還發過一篇博客:數學圖形(1.4)心形線
關於心形曲面,我查找一些資料,但都是隱式方程的曲面,即給出一個數學方程式,然后說這個方程所表示的圖形即是一個心形曲面.對於隱式方程,我以后有機會再詳細介紹.我從網上下了一個隱式方程解析的代碼.不太好用,運算時間很長,圖形的頂點分布有些錯亂.如下圖所示:
我的軟件工具目前只能處理顯示方程的曲面.下面將發布我所寫的幾個心形曲面的算法腳本代碼:
(1)heart(圓變)
這是我在球曲面的基礎上變換出來的.
vertices = dimension1:80 dimension2:160 a = from 0 to (2*PI) dimension1 b = from (-PI*0.5) to (PI*0.5) dimension2 r = 10.0 c = sqrt(abs(a - PI))*1.5 x = r*cos(b)*sin(a)*c y = -r*cos(b)*cos(a)*c z = r*sin(b)*0.75 u = a v = b*2 y = y - array_min(y)*0.5
(2)尖尖的心形
曲線:
vertices = 1000 r = 10.0 t = from 0 to (2*PI) p = sin(t)*sqrt(abs(cos(t)))/(sin(t) + 7/5) - 2*sin(t) + 2 x = p*sin(t) y = p*cos(t)
曲面:
vertices = D1:360 D2:100 r = 10.0 u = from 0 to (2*PI) D1 v = from (-PI/2) to (PI/2) D2 p = sin(u)*sqrt(abs(cos(u)))/(sin(u) + 7/5) - 2*sin(u) + 2 x = p*cos(u) y = p*sin(u) + 1.5 x = x*cos(v) y = y*cos(v) z = 0.8*sin(v)
(3)完美的心形
這是我目前生成的最完美的心形
曲線:
vertices = 360 u = from (-PI) to (PI) w = abs(u) p = w*sqrt(w/(1 + w)) x = p*sin(u) y = (p*cos(u) + 1)*0.9
平面:
vertices = D1:360 D2:100 u = from (-PI) to (PI) D1 v = from 1 to 100 D2 w = abs(u) p = w*sqrt(w/(v + w)) x = p*sin(u) y = p*cos(u)*0.9
曲面:
vertices = D1:360 D2:64 u = from (-PI) to (PI) D1 v = from (PI/2) to (-PI/2) D2 w = abs(u) p = w*sqrt(w/(1 + w)) b = 0.5 x = p*sin(u)*cos(v) y = (p*cos(u) + 0.9)*0.9*cos(v) z = b*sin(v)
如果你覺得這個心形還是像屁股,那你與下面的圖形比較下,就會發現不像了.
(4)像屁股的心形
#http://xahlee.info/surface/kuen/kuen.html vertices = D1:100 D2:100 u = from (-1.4325*PI) to (1.4325*PI) D1 v = from (-10) to (10) D2 w = (cosh[v]^2 + u^2) x = 2*cosh[v]*(cos[u] + u*sin[u]) z = 2*cosh[v]*(-u*cos[u] + sin[u]) y = v - (2*sinh[v]*cosh[v]) x = x/w y = y/w z = z/w