2022-01-02 09:49:52 +0200 received badge ● Famous Question (source) 2017-11-20 15:01:58 +0200 received badge ● Notable Question (source) 2014-04-22 18:15:00 +0200 received badge ● Popular Question (source) 2010-12-31 05:57:45 +0200 received badge ● Student (source) 2010-12-16 13:08:54 +0200 asked a question 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 ...