z value is missing during using surf for plotting
    6 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    jarvan
 am 14 Dez. 2014
  
    
    
    
    
    Kommentiert: Star Strider
      
      
 am 14 Dez. 2014
            I have a user-program which is download on http://tinyurl.com/p4uqz4r. I have to use surf to plot a right circular cone with base R=1at r1= [0, 0, 0] and apex R=0 at r2=[1, 1, 1]. However, when I put R=0,r1= [0, 0, 0],r2=[1, 1, 1] the surf function cant go through because I dont have a z value. I don't have how can I plot with surf with above requirment, which is R=1at r1= [0, 0, 0] and apex R=0 at r2=[1, 1, 1].
function [X, Y, Z] = cylinder2P(R, N,r1,r2)
   % The parametric surface will consist of a series of N-sided
   % polygons with successive radii given by the array R. Axial
   % distance Z increases in equal sized steps from 0 to 1 along
   % the line lying between points r1 and r2. 
%  Author:     Luigi Barone
%  Date:       9 September 2001
%  Modified:   Per Sundqvist July 2004
      % Set up an array of angles for the polygon.
      theta = linspace(0,2*pi,N);
      m = length(R);                 % Number of radius values
                                     % supplied.
      if m == 1                      % Only one radius value supplied.
          R = [R; R];                % Add a duplicate radius to make
          m = 2;                     % a cylinder.
      end
      X = zeros(m, N);             % Preallocate memory.
      Y = zeros(m, N);
      Z = zeros(m, N);
      v=(r2-r1)/sqrt((r2-r1)*(r2-r1)');    %Normalized vector;
      %cylinder axis described by: r(t)=r1+v*t for 0<t<1
      R2=rand(1,3);              %linear independent vector (of v)
      x2=v-R2/(R2*v');    %orthogonal vector to v
      x2=x2/sqrt(x2*x2');     %orthonormal vector to v
      x3=cross(v,x2);     %vector orthonormal to v and x2
      x3=x3/sqrt(x3*x3');
      r1x=r1(1);r1y=r1(2);r1z=r1(3);
      r2x=r2(1);r2y=r2(2);r2z=r2(3);
      vx=v(1);vy=v(2);vz=v(3);
      x2x=x2(1);x2y=x2(2);x2z=x2(3);
      x3x=x3(1);x3y=x3(2);x3z=x3(3);
      time=linspace(0,1,m);
      for j = 1 : m
        t=time(j);
        X(j, :) = r1x+(r2x-r1x)*t+R(j)*cos(theta)*x2x+R(j)*sin(theta)*x3x; 
        Y(j, :) = r1y+(r2y-r1y)*t+R(j)*cos(theta)*x2y+R(j)*sin(theta)*x3y; 
        Z(j, :) = r1z+(r2z-r1z)*t+R(j)*cos(theta)*x2z+R(j)*sin(theta)*x3z;
      end
      %surf(X, Y, Z);
0 Kommentare
Akzeptierte Antwort
  Star Strider
      
      
 am 14 Dez. 2014
        You can do that with the built-in cylinder function, using its ability to create shapes from cylinders:
q = 0:0.1:1;
[X,Y,Z] = cylinder(q);
figure(1)
surf(X,Y,Z)
Experiment with it to get the result you want.
4 Kommentare
  Star Strider
      
      
 am 14 Dez. 2014
				My pleasure!
The cylinder2P function looks useful. I suppose it would be possible to do much the same thing with cylinder and rotate, similar to this archive ‘spilled bottle’ code:
f = @(x) x.*exp(-x);
x = linspace(0, 5, 31);
[X, Y, Z] = cylinder(f(x));
figure(1)
h = surf(X, Y, Z)
rotate(h, [0 1 0], 90)
xlabel('X')
ylabel('Y')
zlabel('Z')
axis equal
Weitere Antworten (0)
Siehe auch
Kategorien
				Mehr zu 2-D and 3-D Plots finden Sie in Help Center und File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!