Цилиндр с заполненным верхом и дном в матлабе

Я пытаюсь создать «твердый» цилиндр с заполненным верхом и дном. Я знаю, что есть функция цилиндр (r), которая создает его, хотя у него нет верхнего и нижнего круга, чтобы «закрыть его».

Я провел некоторое исследование и не могу найти функцию, которая делает это. Я нашел это: http://www.mathworks.com/help/symbolic/mupad_ref/plot-cylinder.html, хотя это код mupad, и я не знаю, как вызвать эту функцию из Matlab (из моего файла .m). Еще раз, я провел некоторое исследование, и вот что я нашел, хотя, похоже, это не работает: http://www.mathworks.com/help/symbolic/create-matlab-functions-from-mupad-expressions.html . Возможно ли это, и если да, то как? Если нет, то как я могу сделать свой «твердый» цилиндр в Matlab?

Спасибо


person Choub890    schedule 11.11.2013    source источник
comment
Что для вас значит твердый цилиндр? Вы пытаетесь нарисовать 3D-объект сверху и снизу? Разве вы не можете использовать patch для рисования верхней и нижней поверхностей, которые вы хотите (определив два круга, нарисуйте их как многоугольники, а затем заполните их)?   -  person Floris    schedule 11.11.2013


Ответы (2)


Предположим, что цилиндр выровнен по оси z, а радиусы R линейно разнесены по единичной высоте над плоскостью XY (те же предположения, что и для встроенного 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

Чтобы проверить, находятся ли точки внутри цилиндра высотой L (примечание: предполагается, что настоящий «цилиндр», созданный с помощью [R R], а НЕ какой-то составной объект (конусы с цилиндрами), созданный с помощью [R1 R2 ... RN], по крайней мере с двумя разными значениями):

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
person Rody Oldenhuis    schedule 11.11.2013

Вот как сделать крышки:

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)
person Alex Byasse    schedule 11.11.2013