怎么画最大内接圆柱

How to draw Maximum inscribed cylinder

假设我们知道圆柱表面的 "N" 个点,那么如何找出最大内切圆柱,即圆柱的半径和中心线

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

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

我们可以通过找到每个维度的最小值和最大值来估计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

与计算结果几乎一致。当然,这仅在圆柱体在坐标系的轴上定向时才有效,但根据评论,情况确实如此。