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