Cylinder with filled top and bottom in matlab

前端 未结 2 1992
悲哀的现实
悲哀的现实 2020-12-21 08:09

I am trying to create a \"solid\" cylinder that has a filled top and bottom to it. I know that there is the function cylinder(r) that creates one, though it does not have a

相关标签:
2条回答
  • 2020-12-21 08:41

    Assuming a cylinder aligned with the z-axis, radii R linearly spaced along the unit height above the XY-plane (same assumptions as built-in cylinder):

    function [x,y,z] = solidCylinder(varargin)
    
        %// Basic checks
        assert(nargin >= 1, 'Not enough input arguments.');
        assert(nargin <= 3, 'Too many input arguments.');
        assert(nargout <= 3, 'Too many output arguments.');
    
        %// Parse input
        N  = 20;
        Ax = [];
        switch nargin
            case 1 %// R
                R  = varargin{1};
            case 2  %// Ax, R  or  R, N
                if ishandle(varargin{1})
                    Ax = varargin{1};
                    R  = varargin{2};                
                else
                    R  = varargin{1};
                    N  = varargin{2};
                end
    
            case 3 %// Ax, R, N
                Ax = varargin{1};
                R  = varargin{2};
                N  = varargin{3};
        end
    
        %// Check input arguments
        if ~isempty(Ax)
            assert(ishandle(Ax) && strcmp(get(Ax, 'type'), 'axes'),...
                'Argument ''Ax'' must be a valid axis handle.');        
        else
            Ax = gca;
        end
    
        assert(isnumeric(R) && isvector(R) && all(isfinite(R)) && all(imag(R)==0) && all(R>0),...
            'Argument ''R'' must be a vector containing finite, positive, real values.');    
        assert(isnumeric(N) && isscalar(N) && isfinite(N) && imag(N)==0 && N>0 && round(N)==N,...
            'Argument ''N'' must be a finite, postive, real, scalar integer.');
    
        %// Compute cylinder coords (mostly borrowed from builtin 'cylinder')   
        theta         = 2*pi*(0:N)/N;
        sintheta      = sin(theta); 
        sintheta(N+1) = 0;
    
        M = length(R);
        if M==1 
            R = [R;R]; M = 2; end
    
        x = R(:) * cos(theta);
        y = R(:) * sintheta;
        z = (0:M-1).'/(M-1) * ones(1,N+1);  %'
    
        if nargout == 0                
            oldNextPlot = get(Ax, 'NextPlot');         
            set(Ax, 'NextPlot', 'add');
    
            %// The side of the cylinder
            surf(x,y,z, 'parent',Ax); 
            %// The bottom 
            patch(x(1,:)  , y(1,:)  , z(1,:)  , z(1,:)  );
            %// The top
            patch(x(end,:), y(end,:), z(end,:), z(end,:));
    
            set(Ax, 'NextPlot', oldNextPlot);
        end
    
    end
    

    To check whether points are inside a cylinder of height L (note: assuming a true 'cylinder' as created with [R R], and NOT some compound object (cones with cylinders) as created by [R1 R2 ... RN] with at least two different values):

    function p = pointInCylinder(x,y,z)
    
        %// These can also be passed by argument of course
        R = 10;
        L = 5;
    
        %// Basic checks
        assert(isequal(size(x),size(y),size(z)), ... 
            'Dimensions of the input arguments must be equal.');
    
        %// Points inside the circular shell? 
        Rs = sqrt(x.^2 + y.^2 + z.^2) <= R;
        %// Points inside the top and bottom? 
        Os = z>=0 & z<=L;
    
        p = Rs & Os;
    
    end
    
    0 讨论(0)
  • 2020-12-21 08:43

    heres how to make lids:

    clear all
    close all
    
    r = 1;
    
    h = 2;
    
    theta = 0:0.05:2*pi;
    
    x = r*cos(theta);
    y = r*sin(theta);
    
    y(end) = 0;
    
    z1 = 0;
    
    z2 = h;
    
    patch(x,y,z1*ones(size(x)),'b');
    
    set(gca,'NextPlot','Add');
    
    patch(x,y,z2*ones(size(x)),'b');
    
    surf([x;x],[y;y],[z1*ones(size(x));z2*ones(size(x))],'parent',gca)
    
    0 讨论(0)
提交回复
热议问题