# Conversion from Cartesian X,Y,Z to domain-centric cylindrical coordinates

30 views (last 30 days)
saipb on 24 Jan 2020 at 17:17
Commented: Sindar on 24 Jan 2020 at 19:33
I just have a question on the conversion from Cartesian X,Y,Z to domain-centric cylindrical coordinates. I have a computed variable, an energy flux term, say F.
Currently, F is a function of x,y,z. Here, the x,y,and z are not lat-Lon values but are more like indices. For example, the grid has 480 grids in the X and Y direction with a spacing of 1km each. So I simply define X as 1000 to 480,000 in increments of 1000 (meters). Y and X are the same since the grid is uniform. I use actual Z values which are non-uniform.
What I’d like to do is to transform this variable, F into r,theta,z coordinates with reference to the domain center. What is the best way to do this in Matlab?

Show 1 older comment
saipb on 24 Jan 2020 at 18:18
Well, I did have a function with which I am able to create the data for F as a function of x,y,z. For the present purpose, please assume that I do not want to change the function but only the data from x,y,z to r,theta,z.
Thanks for the response.
Sindar on 24 Jan 2020 at 18:25
An algorithm:
• generate a cylindrical grid (decide whether you want r_max to include all xyz points, or to exclude any unknown points, or somewhere between)
• transform this grid into Cartesian (x2=r*cos(theta), etc.)
• interpolate F from your original grid to the new Cartesian grid (interp3)
• you now have F2 at your new cylindrical grid
saipb on 24 Jan 2020 at 18:35
Thank you, while your algorithm will work, I am looking for a methodology that involves the least amount of interpolation. Is it possible to transform the current dataset (x,y,z) to corresponding values of r and theta - the sense of the radius should be outward from the domain center and the sense of theta must be anticlockwise about that center (Starting from theta = 0 at the East, Increasing Y - Decreasing X - Decreasing Y - Increasing X). So that each X,Y,Z has a corresponding r,theta,z and then I find a way to plot the slices or isosurfaces?

Sindar on 24 Jan 2020 at 18:43
Edited: Sindar on 24 Jan 2020 at 18:50
% example data
X = 1000:1000:480000;
Y = X;
Z = sort(rand(size(X)));
Domain_Center = [mean(X([1 end])) mean(Y([1 end])) mean(Z([1 end]))]
% compute Cylindrical coordinates
[theta,rho,z] = cart2pol(X-Domain_Center(1),Y-Domain_Center(2),Z - Domain_Center(3));
% F = F

Sindar on 24 Jan 2020 at 19:08
I wasn't sure what you meant by domain center so I chose a harder one to calculate. If you know what it is, then define that, e.g.:
Domain_Center = [mean(X([1 end])) mean(Y([1 end])) 0]
I'm not sure that cart2pol is actually faster (if you look at the algorithm, it's the same), but it is easier to read
saipb on 24 Jan 2020 at 19:18
Thank you very much. https://www.mathworks.com/help/matlab/ref/cart2pol.html informs me that the algorithm assumes that the origin is the center. Looks like by incorporating X-x(center) and Y - y(center), we solve this issue. Finally, 1. Where can I look at the algorithm for cart2pol that you mention in your comment? 2. At present, I use a combination of slice and isosurface to generate a 3D plot of F as a function of x,y,z. Once I convert to r,theta,z - is it possible to use slices and isosurfaces even then or are there other options?
Sindar on 24 Jan 2020 at 19:33
slices and isosurfaces will treat your r,theta,z coordinates exactly like cartesian ones. For instance, visually, the slices will still be planes but they will be slices along r instead of x, etc.. I'd just try first and see what happens.