gpt4 book ai didi

matlab - 展开/展开截锥

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:17 24 4
gpt4 key购买 nike

我想展开一个圆锥形的柱子(截锥形)。我该怎么做。

下半径=1.8506米(图中红色)上半径=1.6849 m(图中绿色)

我柱子的坐标

中心:底圈:xyz:0,0,0顶圈:xyz:0,0,24.6请看附图。

圆锥顶点:0,0,275(我刚刚计算的)角度(一半)enter image description here :0.38投影半径=1.84(我应该给什么)enter image description here

圆柱体的坐标,我可以得到

r=sqrt(x^2+y^2)
theta=atan(y,x)
z=z

如何将它们投影到平面上。

最佳答案

fileexchange 上可能有很多代码或网络上高度优化的解决方案(例如纹理投影),无论如何这是我的解决方案:

我假设支柱数据是一个大小为 [tcount x zcount] 的矩阵其中 tcount是沿角轴的扫描位置数,zcount是沿高度轴的扫描位置数。

代码如下:

%
% PURPOSE:
%
% Project cone data to plane data
%
% INPUT:
%
% thetaValues: Angular-scan values (in radians !!)
% zValues: z-scan values (whathever unit)
% coneData: Scanned data of size thetaCount-by-zCount
% zminRadius: Radius at zmin position (same unit as zValues)
% zmaxRadius: Radius at zmax position (same unit as zValues)
% xvalues: Values to have along x-axis (by default biggestRadius * thetaValues centered around theta = 0)
%
% OUTPUT:
%
% xvalues: Positions along x-axis (same unit as zValues)
% zvalues: Positions along z-axis (same values/unit as input)
% planeData: Plane data of size xcount-by-zcount
%
function [xvalues, zValues, planeData] = Cone2Plane(thetaValues, zValues, coneData, zminRadius, zmaxRadius, xvalues)
%[
% Default arguments
if (nargin < 6), xvalues = []; end

% Init
zmin = min(zValues);
zmax = max(zValues);
smallestRadius = min(zminRadius, zmaxRadius);
biggestRadius = max(zminRadius, zmaxRadius);

% Ensure thetaValues range in -pi;+pi;
thetaValues = mod(thetaValues + pi, 2*pi) - pi;
[thetaValues, si] = sort(thetaValues);
coneData = coneData(si, :);

% Intercept theorem (Thales)
%
% A-------+-------\
% /| | \
% / | | \
% D--E-------+----------\
% / | | \
% B----C-------+------------\
BC = biggestRadius - smallestRadius;
AE = zmax - zValues(:);
AC = (zmax - zmin);
DE = (BC * AE) / AC;
radiuses = smallestRadius + DE;

% Projection
if (isempty(xvalues)), xvalues = biggestRadius * thetaValues; end
xcount = length(xvalues);
zcount = length(zValues);
planeData = zeros(xcount, zcount);
for zi = 1:zcount,
localX = radiuses(zi) * thetaValues;
localValues = coneData(:, zi);
planeData(:, zi) = interp1(localX, localValues, xvalues, 'linear', 0);
end
%]
end
  • Thales theorem 的细节我就不说了。计算 radiuses对于每个 z 位置。

  • 我将角度位置重新排序为 [-180°;+180°] 以便具有对称的 x 位置(即 xLocal = radiusLocal * angularPos )。

  • 棘手的部分是重新插入 xLocal给一些xGlobal位置(我假设为 xLocal = biggestRadius * angularPos,但您当然可以提供自己的值作为 Cone2Plane 例程的参数)。

这里是一些测试用例:

function [] = TestCone2Plane()
%[
% Scanning info
zminRadius = 1.8506;
zmaxRadius = 1.6849;
zValues = linspace(0.0, 24.6, 100);
thetaValues = linspace(0, 359, 360) * pi / 180;

% Build dummy cone data
tcount = length(thetaValues);
zcount = length(zValues);
coneData = rand(tcount, zcount);

% Convert to plane data
xvalues = []; % Means automatic x-positions
[xvalues, zValues, planeData] = Cone2Plane(thetaValues, zValues, coneData, zminRadius, zmaxRadius, xvalues);

% Display
[X, Z] = ndgrid(xvalues, zValues);
pcolor(X, Z, planeData);
shading flat;
%]
end

编辑

不清楚你有什么确切的输入数据,但如果 pillar 是一组 (x,y,z, intensity) 点,你可以将数据集缩减为 coneData,如下所示:

thetas = atan2(y(:), x(:));
thetaValues = unique(thetas); tcount = length(thetaValues);
zValues = unique(z); zcount = length(zValues);
coneData = zeros(tcount, zcount);
for ti = 1:tcount,
logict = (thetas == thetaValues(ti));
for zi = 1:zcount,
logicz = (z == zValues(zi));
coneData(ti, zi) = mean(intensity(logict & logicz));
end
end

注意在实践中,你可能想使用一些 unique with tolerance (+ logic = abs(val-pos) < tol ) 以进一步减少数据,同时考虑扫描位置中的噪声。

关于matlab - 展开/展开截锥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28494924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com