zoukankan      html  css  js  c++  java
  • 数学图形之贝塞尔(Bézier)曲面

    前面章节中讲了贝塞尔(Bézier)曲线,而贝塞尔曲面是对其多一个维度的扩展.其公式依然是曲线的公式:

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

    而之所以由曲线变成曲面,是将顶点横向连了再纵向连.

    很多计算机图形学的教程都会有贝塞尔曲面的DEMO.而这里,我依然是使用我制定的脚本代码生成贝塞尔曲面.代码中的控制顶点坐标为随机数生成,所以每次生成的曲面图形都不一样.

    相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815

    二次贝塞尔曲面:

    需要生成3*3个控制顶点

    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个控制顶点

    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

  • 相关阅读:
    python自动发邮件库yagmail
    Vmware改成bridge方式联网
    centos7 更新Firefox版本
    无法应用转换程序,请检查指定的转换程序路径是否有效
    python中list/tuple/dict/set的区别
    Python中的*arg和**kwarg
    centos7.4下搭建JDK+Tomcat+Nginx+Mysql+redis+Mongodb+maven+Git+Jenkins
    用 Apache Derby 进行 ODBC 编程
    Derby 命令
    Python与数据库
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3994158.html
Copyright © 2011-2022 走看看