在matlab中绘制球谐函数

时间:2015-03-05 07:44:55

标签: matlab computer-vision opticalflow

我想在笛卡尔坐标系中绘制零级球谐函数,但Matlab的输出不同于球形。

x11 = linspace(-1,1,100);
x22 = linspace(-1,1,100);
x33 = linspace(-1,1,100);

[x1 ,x2, x3]= meshgrid(x11,x22,x33);

G = (exp((-1)*(x1.^2 + x2.^2 + x3.^2)));
isosurface(G);

有人可以建议我错在哪里,如果可能的话,请给我如何绘制高阶球谐函数。谢谢。

3 个答案:

答案 0 :(得分:3)

使用MATLAB的球谐函数

degree=6;
order=0;
grid=40;
radius=5;

% Create the grid
delta = pi/grid;
theta = 0 : delta : pi; % altitude
phi = 0 : 2*delta : 2*pi; % azimuth
[phi,theta] = meshgrid(phi,theta)

% Calculate the harmonic
Ymn = legendre(degree,cos(theta(:,1)))
Ymn = Ymn(order+1,:)';
yy = Ymn;
for kk = 2: size(theta,1);
    yy = [yy Ymn]
end;
yy = yy.*cos(order*phi);

order = max(max(abs(yy)));
rho = radius + 2*yy/order;

% Apply spherical coordinate equations
r = rho.*sin(theta);
x = r.*cos(phi);  % spherical coordinate equations
y = r.*sin(phi);
z = rho.*cos(theta);

% Plot the surface
clf
surf(x,y,z)
light
lighting phong
axis tight equal off
view(40,30)
camzoom(1.5)

给出了:

enter image description here

答案 1 :(得分:2)

首先,我不建议您通过评估立方体内所有可能坐标的球谐函数,然后使用isosurface绘制事物(我甚至认为您将isosurface误解为切割某些半径恒定的数据(绝对不是这种情况,见documentation)。

最好绘制球面谐波,就是在球面坐标(r, phi, theta)中使用它们的公式。您可以针对几种模式here找到一些这些配方。公式仅适用于角度部分,径向部分取决于您的域。

l=1m=-1为例,您可以在(方位角,仰角)网格上生成此谐波,如下所示:

azimuths = linspace(0, 360, 361) * pi / 180;
elevations = linspace(0, 180, 181) * pi / 180;

[A, E] = ndgrid(azimuths, elevations);
H = 0.25 * sqrt(15/(2*pi)) .* exp(-1j*A) .* sin(E) .* cos(E);

然后您可以将网格转换回笛卡尔网格,如下所示:

X = cos(A) .* sin(E);
Y = sin(A) .* sin(E);
Z = cos(E);

您还可以添加一些径向变形以使事物看起来更好:

Data = abs(imag(H));
minData = min(Data(:));
maxData = max(Data(:));
Distord = (Data - minData)/(maxData-minData);

X = Distord .* cos(A) .* sin(E);
Y = Distord .* sin(A) .* sin(E);
Z = Distord .* cos(E);

surf(X, Y, Z, Data);
shading flat;

给出了:

SphericalHarmonic(l=1,m=-1)

答案 2 :(得分:0)

axis equal添加到代码的底部,它将使您的轴变得相等(以像素为单位)。现在你的表面看起来像一个球体!