如何绘制最大内接圆柱体

时间:2015-01-07 11:35:15

标签: matlab

假设我们知道圆柱面上的“N”个数字点,那么如何找出最大内接圆柱体,即圆柱体的半径和中心线

1 个答案:

答案 0 :(得分:3)

首先让我们创建圆柱的n点。在此示例中使用带h=4r=1的柱面。圆柱体的体积为V=2 pi r^2 h,在本例中为25.1327

n = 1000;
h = 4;
r = 1;

r1 = r*rand(n/4,1);
theta1 = 2*pi*rand(n/4,1);
h1 = zeros(n/4,1);
r2 = r*rand(n/4,1);
theta2 = 2*pi*rand(n/4,1);
h2 = h.*ones(n/4,1);
r3 = r.*ones(n/2,1);
theta3 = 2*pi*rand(n/2,1);
h3 = h.*rand(n/2,1);
x = [ r1.*sin(theta1), r1.*cos(theta1), h1 ; ...    % bottom area
      r2.*sin(theta2), r2.*cos(theta2), h2 ; ...    % top area
      r3.*sin(theta3), r3.*cos(theta3), h3 ];       % side area

Cylinder

我们可以通过查找每个维度中的最小值和最大值来估算rh

x1 = max(x(:,1)) - min(x(:,1));
x2 = max(x(:,2)) - min(x(:,2));
x3 = max(x(:,3)) - min(x(:,3));

要获得半径,我们必须找到最匹配的两个维度。我们可以通过取这些的平均值来估计半径。当我们从最大值中减去最小值时我们有直径,所以我们需要除以2来得到半径。

d = [abs(x2-x1), abs(x3-x2), abs(x3-x1)];
c = find(d==min(d));
if c==1
    rhat = mean([x1,x2]) ./ 2;
    hhat = x3;
elseif c==2
    rhat = mean([x2,x3]) ./ 2;
    hhat = x1;
else
    rhat = mean([x1,x3]) ./ 2;
    hhat = x2;
end

现在我们可以轻松计算出估计量

Vhat = 2 * pi * rhat^2 * hhat

Vhat = 
     25.1318

与计算结果几乎相同。当然,这只有在圆柱体朝向坐标系的轴线时才有效,但根据评论情况就是这样。