2017-12-14 9 views
1
구멍이나 도넛 모양 등으로 실린더, 실린더 등에도 아래에 주어진 제가 enter image description here

MATLAB을 사용하여 다른 모양의 3D 행렬을 생성하려면 어떻게해야합니까?

I는 아래와 같은 코드를 사용하여 3 차원의 일부 내부 큐브의 큐브를 생성하려고 다른 모양을위한 3 차원 행렬을 생성하기 위해 애 쓰고

. enter image description here

아래로

% numbers are arbitrary 
cube=zeros(11,11,11); 
cube(3:9,3:9,3:9)=5; % Create a cube inside the region 
% Boring: faces of the cube are a different color. 
cube(3:9,3:9,3)=2; 
cube(3:9,3:9,9)=2; 
cube(3:9,3,3:9)=2; 
cube(3:9,9,3:9)=2; 
cube(3,3:9,3:9)=2; 
cube(9,3:9,3:9)=2; 
vold3d('Cdata',cube,'alpha',cube/5) 

과 내가 가진 결과는 심지어 내가 직교 좌표계에서 이러한 모양을 생성 할 수 있습니다. 하지만 매트릭스로 생성 할 수 없습니다.

어떻게 위에서 언급 한 도형을위한 3D 매트릭스를 생성 할 수 있습니까? 이 매트릭스는 128x128x128 또는 512x512x512 크기 일 수 있습니다. 누구든지 도와 줄 수 있습니까? 미리 감사드립니다.

+0

2 차원 이미지에서 3 차원 모델로 이동하려고합니까? 아니면 실린더 등의 수식을 사용할 수 있습니까? – AnonSubmitter85

+0

모양이 필요하지 않습니다 ... 내부 구조가 너무 필요합니다. 그래서 3D 매트릭스, 즉 복셀을 찾고 있습니다. 저는 실린더와 구의 방정식으로 대상을 만들려고했습니다. 그러나 데카르트 좌표계에서만 점을 찾을 수 있습니다. 각 보셀 값을 정의 할 수는 없습니다. – manoos

+0

나는 당신이 말하는 것을 완전히 따르지 않습니다. 모양에 대한 공평성에서 그렇게 할 수 있다면 문제는 무엇입니까? 예를 들어, r = sqrt (x^2 + y^2 + z^2) 인 구를 예로 들자. 그건 간단하지 미만 - 또는 - 평등에 matlab에 테스트입니다. 3 개의 좌표 큐브를 정의하십시오. 하나는 각 복셀의 x 좌표로, 다른 하나는 각 복셀의 y 좌표로, 다른 하나는 z 좌표로 정의하십시오. 위의 방정식을 평가하십시오. 실린더, 피라미드 또는 방정식 세트로 설명 할 수있는 모든 솔리드에 대해 동일한 작업을 수행 할 수 있습니다. 답장을 보내 주셔서 감사합니다. – AnonSubmitter85

답변

0

출력을 원하는 항목이 무엇인지 확실하지 않지만 다음과 같은 방법으로 모양을 정의 할 수 있습니다. 여기서 모양은 모양이 모양 안에 있는지 또는 논리 값이 반환되는지를 나타내는 함수에 의해 정의됩니다. 아니. 이렇게하면 원하는 그리드 해상도를 가질 수 있습니다.

function q47822954 
RESOLUTION = 5E-2; 
[XX,YY,ZZ] = meshgrid(-5:RESOLUTION:5); 
%% Cylinder 
% Define cylinder: 
x0 = 1; y0 = 0; 
r_min = 0.8; r_max = 1; 
h_min = -1; h_max = 1; 

cyl = inCylinder(x0,y0,r_min,r_max,h_min,h_max,[XX(:),YY(:),ZZ(:)]); 
figure(); scatter3(XX(cyl),YY(cyl),ZZ(cyl)); 
%% Torus 
% Define torus: 
R = 3; 
r = 1; 
z0 = -1; 
tor = inTorus(x0,y0,z0,R,r,[XX(:),YY(:),ZZ(:)]); 
figure(); scatter3(XX(tor),YY(tor),ZZ(tor)); 
%% Ellipsoid 
% Define ellipsoid: 
a = 1; b = 2; c = 3; 
ell = inEllipsoid(x0,y0,z0,a,b,c,[XX(:),YY(:),ZZ(:)]); 
figure(); scatter3(XX(ell),YY(ell),ZZ(ell)); 
end 

function tf = inCylinder(x0,y0,r_min,r_max,h_min,h_max,xyz) 
    % xyz is a N-by-3 vector of cartesian coordinates to test 
    [~,rho,z] = cart2pol(xyz(:,1)-x0,xyz(:,2)-y0,xyz(:,3)); 
    tf = rho >= r_min & rho <= r_max & z >= h_min & z <= h_max; 
end 

function tf = inTorus(x0,y0,z0,R,r,xyz) 
    % Torus around the z axis 
    assert(R>r); % make sure that this is a torus and not something else 
    tf = (R - sqrt((xyz(:,1)-x0).^2 + (xyz(:,2)-y0).^2)).^2 + (xyz(:,3)-z0).^2 < r^2; 
end 

function tf = inEllipsoid(x0,y0,z0,a,b,c,xyz) 
    tf = (xyz(:,1)-x0).^2/a^2 + (xyz(:,2)-y0).^2/b^2 + + (xyz(:,3)-z0).^2/c^2 <= 1; 
end 

결과 :

Cylinder

Torus

Ellipsoid

또한 3d triangulation를 사용하여 비슷한 작업을 수행 할 수 있습니다.

+0

위의 프로그램에서는 직각 좌표계에서 구형 또는 원통형을 개발했습니다. 하지만 셰프 - 로간 팬텀 같은 것을 찾고 있습니다. 즉 3D 복셀로 사용됩니다. – manoos

+0

@manoos 이것은 당신이 당신의 질문에서 언급해야 할 것입니다. –

관련 문제