Mapping a periodic planar surface onto a cylinder

14 visualizaciones (últimos 30 días)
Nick K
Nick K el 9 de Dic. de 2020
Editada: Casey Bartlett el 9 de Dic. de 2020
I have a periodic rough 2D surface in an array V(x,y) which I want to map into a 3D rough surface around a cylinder radius R. (Like pictured)
My coordinate transforms are rusty and I cant work out how to do this mapping. Does somebody know how to acheive this for my generic non-analytic surface?
If possible please avoid solutions using Matlab's "cylinder" function, as I want to port this to another language.
Thanks in advance :)

Respuesta aceptada

Casey Bartlett
Casey Bartlett el 9 de Dic. de 2020
Editada: Casey Bartlett el 9 de Dic. de 2020
You are interested in mapping a set of data x,y,V(x,y) in cartesian coordinates to cylindrical coordinates (specifically avoiding the 'cylinder' function). There are many ways to do this, but here is an example that uses trigonometric functions to do the transform. Plotting is done with 'Mesh'. Its worth taking a look at the documentation for cart2pol for more information on this transformation.
1. Generate data V(x,y)
% Assumptions
% 1. The structure of points x,y in V(x,y) is consistent with meshgrid
% 2. The domain is periodic in the x direction
% 3. If the data roughly approximates a cylider, the displacement of the
% data from the surface of the cylinder \delta r, is much smaller than the
% cylinder radius R (\delta r << R).
% 4. the data is only periodic in one direction (It may be appropriate to visualize with
% a toroid if the data is periodic in both x and y).
% vector of 'x' coordinates
x = 0:0.5:10;
% vector of 'y' coordinates
y = 1:1:20;
% Create some 'noisy' data
[X,Y] = meshgrid(x,y);
V = rand(size(X))*0.5; % V(X,Y);
% To ensure the data is periodic
V(:,end) = V(:,1);
2. Transform the data to polar coordinates to obtain the desired surface R(\theta,z), then remap back to cartesian coordinates for plotting:
L = max(x);
% Map the cartesian to cylindrical coordinates R, \theta, z
Theta = X / L * 2 *pi;
radius = @(circumference) circumference / 2*pi;
R0 = radius(L);
R = V + R0;
% With the above mapping, plot in cartesian
% with Z = Y
% X = r cos(\theta)
% Y = r sin(\theta)
Xtheta = R .* cos(Theta);
Ytheta = R .* sin(Theta);
Z = Y;
mesh(Xtheta, Ytheta, Z)

Más respuestas (0)

Categorías

Más información sobre Surface and Mesh Plots en Help Center y File Exchange.

Productos


Versión

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by