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

조회 수: 48(최근 30일)
Vinit Nagda 2021년 8월 31일
댓글: Vinit Nagda 2021년 8월 31일
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.

댓글을 달려면 로그인하십시오.

### 채택된 답변

Wan Ji 2021년 8월 31일
편집: Wan Ji 2021년 8월 31일
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);
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
axis([0,n,0,m,0,p])
p=patch(isosurface(px,py,pz,X,0));
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1 1 1])
view(3)
hold on
scatter3(px(:),py(:),pz(:),1,X(:),'filled')
camlight; lighting phong
The sphere is shown like 댓글을 달려면 로그인하십시오.

### 추가 답변(2개)

Matt J 2021년 8월 31일
편집: Matt J 2021년 8월 31일
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표시숨기기 없음
Vinit Nagda 2021년 8월 31일
@Matt J Thanks a lot for your response. Using ndgridVecs fucntion is actually very efficient.

댓글을 달려면 로그인하십시오.

Chunru 2021년 8월 31일
편집: Chunru 2021년 8월 31일
[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 댓글을 달려면 로그인하십시오.

R2020b

### Community Treasure Hunt

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

Start Hunting!