標籤:style blog http color 使用 os 資料 2014
(轉)本文將展示幾種基本圖形的產生演算法,包括:圓面,圓球,圓柱,圓錐,圓環,圓管,螺旋環,圓螺,五角環,金字塔,正8面體.使用自己定義文法的指令碼代碼產生數學圖形.相關軟體參見:數學圖形視覺化檢視,該軟體免費開源.
之前一篇文章:數學圖形之將曲線(curve)轉化成曲面管,寫完之後,意識到這種產生曲面管的指令碼代碼太過複雜了.本來其輸入為曲線+管的半徑,那麼完全可以將其改成一句話的形式.我需要在產生曲線的代碼後面加上一句話就可以將其轉化成曲面管.pipe = radius[0.5], type[0]
實現了由"pipe"指令碼解析後,我想到曲線是可以通過旋轉,縮放,平移,這三種基礎的圖形變換,轉化成曲面的.OK,於是又實現了如下的文法:
(1)繞空間中任意一條直線進行旋轉, 可以產生旋轉面
rotate = anchor[0, 0, 0], axis[0,1, 0], angle[0, 2*PI]
(2)沿著一個任意朝向移動頂點, 可以產生柱面
translate = dir[0, 1, 0], dis[0, 5]
(3)以空間中任意一點為基點,對曲線上的頂點進行縮放
scale = anchor[0, 0, 0], x[1, 0], z[1, 0]
最後,由曲線到曲面會增加一個維度資料,需要設定其資料大小:surface_slices = 72
下面將展示使用這幾種新加的語句產生的圖形與指令碼代碼:
圓面
vertices = 360u = from 0 to (2*PI)r = 5.0x = r*sin(u)y = r*cos(u)scale = anchor[0, 0, 0], x[1, 0], y[1, 0]
圓球
常規產生球面的演算法參見:數學圖形之球面
vertices = 360u = from 0 to (PI)r = 2.0x = r*sin(u)y = r*cos(u)rotate = anchor[0, 0, 0], axis[0,1, 0], angle[0, 2*PI]
圓柱
常規產生圓柱的演算法參見:數學圖形之圓柱面
vertices = 360u = from 0 to (2*PI)r = 2.0x = r*sin(u)z = r*cos(u)translate = dir[0, 1, 0], dis[0, 5]
圓錐
常規產生圓錐的演算法參見:數學圖形之錐體
vertices = 360u = from 0 to (2*PI)r = 2.0x = r*sin(u)z = r*cos(u)translate = dir[0, 1, 0], dis[0, 5]scale = anchor[0, 0, 0], x[1, 0], z[1, 0]
圓環
常規產生圓環的演算法參見:數學圖形之圓環
vertices = 360u = from 0 to (2*PI)r = 2.0x = r*sin(u) + 5y = r*cos(u)surface_slices = 72rotate = anchor[0, 0, 0], axis[0,1, 0], angle[0, 2*PI]
圓管
vertices = 360u = from 0 to (2*PI)r = 5.0x = r*sin(u)z = r*cos(u)pipe = radius[0.5], type[0]
螺旋環
常規產生螺旋環的演算法參見:數學圖形之螺旋管
vertices = 100u = from 0 to (2*PI)r = 1.0x = r*sin(u) + 5y = r*cos(u)surface_slices = 200rotate = anchor[0, 0, 0], axis[0, 1, 0], angle[0, 8*PI]translate = dir[0, 1, 0], dis[0, 9]
圓螺
vertices = 100u = from 0 to (2*PI)r = 1.0x = r*sin(u) + 5y = r*cos(u)surface_slices = 200scale = anchor[0, 0, 0], x[1, 0], y[1, 0]rotate = anchor[0, 0, 0], axis[0, 1, 0], angle[0, 8*PI]translate = dir[0, 1, 0], dis[0,6]
五角環
vertices =6u = from 0 to (2*PI)r = 2.0x = r*sin(u) + 5y = r*cos(u)surface_slices = 6rotate = anchor[0, 0, 0], axis[0,1, 0], angle[0, 2*PI]
金字塔
vertices =5u = from 0 to (2*PI)r = 2.0x = r*sin(u)z = r*cos(u)surface_slices = 3translate = dir[0, 1, 0], dis[0, 2]scale = anchor[0, 0, 0], x[1, 0], z[1, 0]
正8面體
vertices =3u = from 0 to (PI)r = 2.0x = r*sin(u)y = r*cos(u)surface_slices = 5rotate = anchor[0, 0, 0], axis[0,1, 0], angle[0, 2*PI]