Revolving a curve about the y-axis to generate a 3D surface

69 ビュー (過去 30 日間)
Asser Abdelgawad
Asser Abdelgawad 2022 年 5 月 11 日
コメント済み: Asser Abdelgawad 2022 年 6 月 13 日 20:36
I'm aware that the cylinder() functiond does this for revolutions about the x-axis. But is there a way to do this about the y-axis?

採用された回答

John D'Errico
John D'Errico 2022 年 5 月 11 日
Certainly. Just write the code yourself. Seriously, it is not difficult.
Consider the function y = f(x).
f = @(x) x.*(1-x);
fplot(f,[0,1])
We want to rotate this around the Y axis.
n = 100;
theta = linspace(0,2*pi,n).';
x0 = linspace(0,1,n);
y0 = f(x0);
x = x0.*cos(theta);
z = x0.*sin(theta);
y = repmat(y0,[n,1]);
surf(x,y,z)
xlabel x
ylabel y
zlabel z
view(20,30)
So the y axis lives at (x,z) = (0,0). The curve drawn in the original figure has been rotated around the y axis, producing this sideways cup, with a cusp at the center.
  1 件のコメント
Asser Abdelgawad
Asser Abdelgawad 2022 年 6 月 10 日 20:20
Hello @John D'Errico. Thank you for sharing this; it helped me a lot. I have a follow-up question if you don't mind:
Is there a way to revolve the graph without using repmat? The issue is, for me, since this rotation is in the fourier domain, when i perform ifft2 to get back to spatial domain, my resultant function is essentially one-dimensional because of the repeated values from repmat. I want a 3D Gaussian from performing ifft2 on the 2D MTF here, but I get this for the PSF:
Here is my code for reference:
f = fit(freq.', MTF_fit.', 'gauss2'); %gaussian function
% rotate MTF in fourier domain
n_val = 100;
x0 = freq;
y0 = f(x0).';
theta = linspace(0,2*pi,n_val).';
x = x0.*cos(theta);
y = x0.*sin(theta);
z = repmat(y0,[n_val,1]);
MTF2 = z;
PSF2 = abs(ifftshift(ifft2(MTF2)); %back to spatial domain
surf(x,y,z) %plot top right graph
surf(PSF2) %plot bottom left graph
Ideally, the values for MTF2 wouldn't be repeated across the matrix. I've also shared what MTF2 looks like currently for refernece. What do you think?

サインインしてコメントする。

その他の回答 (1 件)

Matt J
Matt J 2022 年 5 月 11 日
編集済み: Matt J 2022 年 5 月 11 日
Why not just revole around whatever axis cylinder() acommodates and then use rotate?
Or, interchange the data when you plot, e.g.,
t = 0:pi/10:2*pi;
r = 2 + cos(t);
[X,Z,Y] = cylinder(r);
surf(X,Y,Z);
xlabel X; ylabel Y; zlabel Z;
  1 件のコメント
Asser Abdelgawad
Asser Abdelgawad 2022 年 6 月 13 日 20:36
Hi @Matt J I've tried the cylinder function with all 6 possible orderings of x,y, and z but I cannot get my gaussian function to go from left to right such as in this diagram.
This was acheived with @John D'Errico's solution, though my issue is the repeated values it produces because of repmat. How would you do it with your technique on a gaussian such as this? Is it possible with cylinder()?
Thank you so much for your help.
Asser

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by