surface_generator.lua


NAME
    surface_generator

FUNCTION
    surface_generator(uarr, varr, func)

NOTES
    For generating 3D surface quads.
    
    The generator can be used for any surface function with u and v
    as independent variables, i.e., x(u, v), y(u, v), and z(u, v).
    
    Example:
        see its use in moebius_strip.lua
 NPUTS
    uarr - a zeArray of double containing u data
    varr - a zeArray of double containing v data
    func - callback function returning x, y, and z for u and v

OUTPUTS
    a zeVertex objects.

SOURCE

require("register")

function surface_generator(uarr, varr, func)
    local nu, nv = uarr:size(), varr:size()
    local xyz = zeGrf.new("vertex")
    
    local x1, y1, z1, x2, y2, z2 =
          zeUtl.new("double", "double", "double",
                    "double", "double", "double")
    
    x1:resize(nv,1); y1:resize(nv,1); z1:resize(nv,1)
    x2:resize(nv,1); y2:resize(nv,1); z2:resize(nv,1)
    
    local u = uarr:getele(0,0)
    local x, y, z
    for i = 0, nv-1 do
        x, y, z = func(u, varr:getele(i, 0))
        x1:setele(i, 0, x); y1:setele(i, 0, y); z1:setele(i, 0, z)
    end
    
    for j = 1, nu-1 do
        u = uarr:getele(j,0)
        for i = 0, nv-1 do
            x, y, z = func(u, varr:getele(i, 0))
            x2:setele(i, 0, x); y2:setele(i, 0, y); z2:setele(i, 0, z)
        end
        for i = 1, nv-1 do
            xyz:add(x1:getele(i-1, 0), y1:getele(i-1, 0), z1:getele(i-1, 0))
            xyz:add(x2:getele(i-1, 0), y2:getele(i-1, 0), z2:getele(i-1, 0))
            xyz:add(x2:getele(i,   0), y2:getele(i,   0), z2:getele(i,   0))
            xyz:add(x1:getele(i,   0), y1:getele(i,   0), z1:getele(i,   0))
        end
        x2:copy(x1); y2:copy(y1); z2:copy(z1)
    end
        
    return xyz
end