How to form a sphere with 1's in a 3D matrix

51 views (last 30 days)
I have a matrix X=zeros(m,n,p);
If I know the radius value and matrix index for centroid position of sphere, how do I distribute 1's in the matrix such that it forms a sphere in the matrix? (Ignore part of sphere if it goes outside matrix dimensions)
Thank you.

Accepted Answer

Wan Ji
Wan Ji on 31 Aug 2021
Edited: Wan Ji on 31 Aug 2021
If there is no scale factor effect with different directions:
m = 80; n = 100; p=90;
[px,py,pz] = meshgrid(1:n, 1:m, 1:p);
radius = 20;
xc = 40; yc = 30; zc = 60; % the center of sphere
logicalSphere = (px-xc).^2 + (py-yc).^2 + (pz-zc).^2 <=radius*radius;
X = zeros(m,n,p);
X(logicalSphere) = 1; % set to zero
You can also show this sphere with isosurface and patch function
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1 1 1])
hold on
camlight; lighting phong
The sphere is shown like

More Answers (2)

Matt J
Matt J on 31 Aug 2021
Edited: Matt J on 31 Aug 2021
Using ndgridVecs from the file exchange
[dX,dY,dZ]=ndgridVecs((1:m)-cm, (1:n)-cn, (1:p)-cp); %centroid=[cm,cn,cp]
sphere3D=(dX.^2 + dY.^2 + dZ.^2<=radius^2); %the result
  1 Comment
Vinit Nagda
Vinit Nagda on 31 Aug 2021
@Matt J Thanks a lot for your response. Using ndgridVecs fucntion is actually very efficient.

Sign in to comment.

Chunru on 31 Aug 2021
Edited: Chunru on 31 Aug 2021
[m, n, p] = deal(10, 12, 14);
[xg, yg, zg] = ndgrid(1:m, 1:n, 1:p);
xc = round(m/2); yc=round(n/2); zc=round(p/2); % center
r = 3;
idx = (xg-xc).^2 + (yg-yc).^2 + (zg-zc).^2 <= r.^2;
s = false(size(xg)); % the sphere
s(idx) = true;
plot3(xg(s), yg(s), zg(s), 'o');
grid on; box on


Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!