數學圖形之貝塞爾(Bézier)曲面

前面章節中講了貝塞爾(Bézier)曲線,而貝塞爾曲面是對其多一個維度的擴展.其公式依然是曲線的公式:html

\mathbf{B}(t)=\mathbf{P}_0(1-t)^3+3\mathbf{P}_1t(1-t)^2+3\mathbf{P}_2t^2(1-t)+\mathbf{P}_3t^3 \mbox{ , } t \in [0,1]工具

而之因此由曲線變成曲面,是將頂點橫向連了再縱向連.post

不少計算機圖形學的教程都會有貝塞爾曲面的DEMO.而這裏,我依然是使用我制定的腳本代碼生成貝塞爾曲面.代碼中的控制頂點座標爲隨機數生成,因此每次生成的曲面圖形都不同.spa

相關軟件參見:數學圖形可視化工具,使用本身定義語法的腳本代碼生成數學圖形.該軟件免費開源.QQ交流羣: 367752815code

二次貝塞爾曲面:htm

須要生成3*3個控制頂點blog

vertices = D1:100 D2:100

u = from 0 to 1 D1
v = from 0 to 1 D2

ax0 = rand2(-10, 10)
ay0 = rand2(-10, 10)
az0 = rand2(-10, 10)
bx0 = rand2(-10, 10)
by0 = rand2(-10, 10)
bz0 = rand2(-10, 10)
cx0 = rand2(-10, 10)
cy0 = rand2(-10, 10)
cz0 = rand2(-10, 10)

ax1 = rand2(-10, 10)
ay1 = rand2(-10, 10)
az1 = rand2(-10, 10)
bx1 = rand2(-10, 10)
by1 = rand2(-10, 10)
bz1 = rand2(-10, 10)
cx1 = rand2(-10, 10)
cy1 = rand2(-10, 10)
cz1 = rand2(-10, 10)

ax2 = rand2(-10, 10)
ay2 = rand2(-10, 10)
az2 = rand2(-10, 10)
bx2 = rand2(-10, 10)
by2 = rand2(-10, 10)
bz2 = rand2(-10, 10)
cx2 = rand2(-10, 10)
cy2 = rand2(-10, 10)
cz2 = rand2(-10, 10)

ax3 = rand2(-10, 10)
ay3 = rand2(-10, 10)
az3 = rand2(-10, 10)
bx3 = rand2(-10, 10)
by3 = rand2(-10, 10)
bz3 = rand2(-10, 10)
cx3 = rand2(-10, 10)
cy3 = rand2(-10, 10)
cz3 = rand2(-10, 10)

u1 = (1-u)*(1-u)
u2 = 2*(1-u)*u  
u3 = u*u

ax = u1*ax0+u2*ax1+u3*ax2
ay = u1*ay0+u2*ay1+u3*ay2
az = u1*az0+u2*az1+u3*az2
bx = u1*bx0+u2*bx1+u3*bx2
by = u1*by0+u2*by1+u3*by2
bz = u1*bz0+u2*bz1+u3*bz2
cx = u1*cx0+u2*cx1+u3*cx2
cy = u1*cy0+u2*cy1+u3*cy2
cz = u1*cz0+u2*cz1+u3*cz2

v1 = (1-v)*(1-v)
v2 = 2*(1-v)*v  
v3 = v*v

x = v1*ax+v2*bx+v3*cx
y = v1*ay+v2*by+v3*cy
z = v1*az+v2*bz+v3*cz

u = u*10
v = v*10

三次貝塞爾曲面:教程

須要生成4*4個控制頂點get

vertices = D1:100 D2:100

u = from 0 to 1 D1
v = from 0 to 1 D2

ax0 = rand2(-10, 10)
ay0 = rand2(-10, 10)
az0 = rand2(-10, 10)
bx0 = rand2(-10, 10)
by0 = rand2(-10, 10)
bz0 = rand2(-10, 10)
cx0 = rand2(-10, 10)
cy0 = rand2(-10, 10)
cz0 = rand2(-10, 10)
dx0 = rand2(-10, 10)
dy0 = rand2(-10, 10)
dz0 = rand2(-10, 10)

ax1 = rand2(-10, 10)
ay1 = rand2(-10, 10)
az1 = rand2(-10, 10)
bx1 = rand2(-10, 10)
by1 = rand2(-10, 10)
bz1 = rand2(-10, 10)
cx1 = rand2(-10, 10)
cy1 = rand2(-10, 10)
cz1 = rand2(-10, 10)
dx1 = rand2(-10, 10)
dy1 = rand2(-10, 10)
dz1 = rand2(-10, 10)

ax2 = rand2(-10, 10)
ay2 = rand2(-10, 10)
az2 = rand2(-10, 10)
bx2 = rand2(-10, 10)
by2 = rand2(-10, 10)
bz2 = rand2(-10, 10)
cx2 = rand2(-10, 10)
cy2 = rand2(-10, 10)
cz2 = rand2(-10, 10)
dx2 = rand2(-10, 10)
dy2 = rand2(-10, 10)
dz2 = rand2(-10, 10)

ax3 = rand2(-10, 10)
ay3 = rand2(-10, 10)
az3 = rand2(-10, 10)
bx3 = rand2(-10, 10)
by3 = rand2(-10, 10)
bz3 = rand2(-10, 10)
cx3 = rand2(-10, 10)
cy3 = rand2(-10, 10)
cz3 = rand2(-10, 10)
dx3 = rand2(-10, 10)
dy3 = rand2(-10, 10)
dz3 = rand2(-10, 10)

u1 = pow((1-u),3) 
u2 = 3*pow((1-u),2)*u  
u3 = 3*u*u*(1-u)
u4 = u*u*u

ax = u1*ax0+u2*ax1+u3*ax2+u4*ax3
ay = u1*ay0+u2*ay1+u3*ay2+u4*ay3
az = u1*az0+u2*az1+u3*az2+u4*az3
bx = u1*bx0+u2*bx1+u3*bx2+u4*bx3
by = u1*by0+u2*by1+u3*by2+u4*by3
bz = u1*bz0+u2*bz1+u3*bz2+u4*bz3
cx = u1*cx0+u2*cx1+u3*cx2+u4*cx3
cy = u1*cy0+u2*cy1+u3*cy2+u4*cy3
cz = u1*cz0+u2*cz1+u3*cz2+u4*cz3
dx = u1*dx0+u2*dx1+u3*dx2+u4*dx3
dy = u1*dy0+u2*dy1+u3*dy2+u4*dy3
dz = u1*dz0+u2*dz1+u3*dz2+u4*dz3

v1 = pow((1-v),3) 
v2 = 3*pow((1-v),2)*v  
v3 = 3*v*v*(1-v)
v4 = v*v*v

x = v1*ax+v2*bx+v3*cx+v4*dx
y = v1*ay+v2*by+v3*cy+v4*dy
z = v1*az+v2*bz+v3*cz+v4*dz

u = u*10
v = v*10

相關文章
相關標籤/搜索