Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

tubeplot3d function in sage ?

Is there a function equivalent to the function tubeplot as appended below ? If not, how to use the script below in sage ? Or could such a function be defined in sage in the future ? Thanks for any reply ! @mfunction("varargout") def tubeplot(x=None, y=None, z=None, *varargin):

# TUBEPLOT - plots a tube r along the space curve x,y,z.
#
# tubeplot(x,y,z) plots the basic tube with radius 1
# tubeplot(x,y,z,r) plots the basic tube with variable radius r (either a vector or a value)
# tubeplot(x,y,z,r,v) plots the basic tube with coloring dependent on the values in the vector v
# tubeplot(x,y,z,r,v,s) plots the tube with s tangential subdivisions (default is 6)
#
# [X,Y,Z]=tubeplot(x,y,z) returns [Nx3] matrices suitable for mesh or surf
#
# Note that the tube may pinch at points where the normal and binormal 
# misbehaves. It is suitable for general space curves, not ones that 
# contain straight sections. Normally the tube is calculated using the
# Frenet frame, making the tube minimally twisted except at inflexion points.
#
# To deal with this problem there is an alternative frame:
# tubeplot(x,y,z,r,v,s,vec) calculates the tube by setting the normal to
# the cross product of the tangent and the vector vec. If it is chosen so 
# that it is always far from the tangent vector the frame will not twist unduly
#
# Example:
#
#  t=0:(2*pi/100):(2*pi);
#  x=cos(t*2).*(2+sin(t*3)*.3);
#  y=sin(t*2).*(2+sin(t*3)*.3);
#  z=cos(t*3)*.3;
#  tubeplot(x,y,z,0.14*sin(t*5)+.29,t,10)
#
# Written by Anders Sandberg, asa@nada.kth.se, 2005


subdivs = 6

N = size(x, 1)
if (N == 1):
    x = x.cT
    y = y.cT
    z = z.cT
    N = size(x, 1)
end

if (nargin == 3):
    r = x * 0 + 1
else:
    r = varargin(1)
    if (size(r, 1) == logical_and(1, size(r, 2) == 1)):
        r = r * ones(N, 1)
    end
end
if (nargin > 5):
    subdivs = varargin(3) + 1
end
if (nargin > 6):
    vec = varargin(4)
    [t, n, b] = frame(x, y, z, vec)
else:
    [t, n, b] = frenet(x, y, z)
end







X = zeros(N, subdivs)
Y = zeros(N, subdivs)
Z = zeros(N, subdivs)

theta = mslice[0:(2 * pi / (subdivs - 1)):(2 * pi)]

for i in mslice[1:N]:
    X(i, mslice[:]).lvalue = x(i) + r(i) * (n(i, 1) * cos(theta) + b(i, 1) * sin(theta))
    Y(i, mslice[:]).lvalue = y(i) + r(i) * (n(i, 2) * cos(theta) + b(i, 2) * sin(theta))
    Z(i, mslice[:]).lvalue = z(i) + r(i) * (n(i, 3) * cos(theta) + b(i, 3) * sin(theta))
end

if (nargout == 0):
    if (nargin > 4):
        V = varargin(2)
        if (size(V, 1) == 1):
            V = V.cT
        end
        V = V * ones(1, subdivs)
        surf(X, Y, Z, V)
    else:
        surf(X, Y, Z)
    end
else:
    varargout(1).lvalue = mcellarray([X])
    varargout(2).lvalue = mcellarray([Y])
    varargout(3).lvalue = mcellarray([Z])
end