Цилиндр с заполненным верхом и низом в Matlab
Я пытаюсь создать "твердый" цилиндр, у которого есть заполненная вершина и основание к этому. Я знаю, что есть функциональный цилиндр (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?
Спасибо
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
Вот как сделать крышки:
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)