2013-01-22 2 views
2

기하학적 모양으로 구성된 원시 체적 데이터의 데이터 세트를 만들려고합니다. 중요한 것은 볼륨 레이 캐스팅을 사용하여 2D로 투영하지만 먼저 볼륨을 수동으로 만들고 싶습니다.3D 체적 데이터에서 실린더 만들기

지오메트리는 볼륨 중간에있는 하나의 실린더와 Z 축을 따라 이루어지며 첫 번째 축의 둘레에있는 두 개의 작은 실린더는 축을 중심으로 회전합니다.

function cyl= createCylinders(a, b, c, rad1, h1, rad2, h2) 

% a : data width 
% b : data height 
% c : data depth 
% rad1: radius of the big center cylinder 
% rad2: radius of the smaller cylinders 
% h1: height of the big center cylinder 
% h2: height of the smaller cylinders 

[Y X Z] =meshgrid(1:a,1:b,1:c); %matlab saves in a different order so X must be Y 
centerX = a/2; 
centerY = b/2; 
centerZ = c/2; 

theta = 0; %around y 
fi = pi/4; %around x 

% First cylinder 
cyl = zeros(a,b,c); 

% create for infinite height 
R = sqrt((X-centerX).^2 + (Y-centerY).^2); 

startZ = ceil(c/2) - floor(h1/2); 
endZ = startZ + h1 - 1; 

% then trim it to height = h1 
temp = zeros(a,b,h1); 
temp(R(:,:,startZ:endZ)<rad1) = 255; 
cyl(:,:,startZ:endZ) = temp; 

% Second cylinder 

cyl2 = zeros(a,b,c); 

A = (X-centerX)*cos(theta) + (Y-centerY)*sin(theta)*sin(fi) + (Z-centerZ)*cos(fi)*sin(theta); 
B = (Y-centerY)*cos(fi) - (Z-centerZ)*sin(fi); 

% create again for infinite height 
R2 = sqrt(A.^2+B.^2); 
cyl2(R2<rad2) = 255; 

%then use 2 planes to trim outside of the limits 
N = [ cos(fi)*sin(theta) -sin(fi) cos(fi)*cos(theta) ]; 

P = (rad2).*N + [ centerX centerY centerZ]; 
T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3); 
cyl2(T<0) = 0; 

P = (rad2+h2).*N + [ centerX centerY centerZ]; 
T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3); 
cyl2(T>0) = 0; 

% Third cylinder 
% ... 

cyl = cyl + cyl2; 

cyl = uint8(round(cyl)); 

% ... 

개념은 제 1 실린더가 생성되도록 한 후 그 높이를 정의하기 위해, z 축 값에 따라 "절단"

여기서 지금까지 내 함수이다. 다른 실린더의 관계를 이용하여 A 및 B에만 (X) 주위의 회전 행렬 를 사용하여 그에 따라 회전되는 2 + B 2 = R 2 생성 및 Y R 를 사용 축된다 Y (θ) R x (φ)은 here으로 기재되어있다.

지금까지 모든 것이 제대로 작동하는 것처럼 보였습니다. (잘 작동하는지 테스트 한) 코드를 구현했기 때문에 돌출부가 표시되고 실린더가 무한 높이에서 "자르지"않을 때 올바른 회전이있는 것처럼 보입니다.

나는 실린더와 같은 방법으로 z 축을 회전시킨 벡터 [0 0 1] 인 벡터 N을 계산합니다. 그런 다음 나는 실린더의 모서리가되고 그 점과 법선 벡터에 따라 평면 방정식 T을 계산할 동일한 거리의 두 점 P을 찾습니다. 마지막으로, 나는 그 평등에 따라 준비한다. 아니면 적어도 그게 내가 무엇입니까 트리밍 후에 나는 보통 아무것도 얻지 못하기 때문에 (모든 값이 0 임) 내가하고있다. 또는 제가 실험 할 때 얻을 수있는 가장 좋은 점은 실린더가 잘린 것이었지만 위아래 평면은 잘 위치하지 않았습니다.

내 기하학 방정식을보고 있었으므로 실수가있는 곳을 찾을 수 없으므로 코드에 도움이나 수정을 부탁드립니다.

편집 : 작성하려는 개체의 빠른 스크린 샷입니다. 실린더가 볼륨 데이터에서 불투명하다는 것을 유의하십시오. 내부는 모두 균질 한 재료로 간주됩니다.

set of cylinders

+0

아마도 스케치가 도움이 될 것입니다. – ja72

+0

내가 만드는 것을 캡쳐 한 스크린 샷을 추가했습니다. –

+0

실린더가 병합되었거나 실린더가 틈이 있습니까? – ja72

답변

1

내가 대신 생각 :

T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3); 

당신이 두 곳에서 다음을 시도해야합니다 :

N에 의해 배가가의 축 방향을 설명하는 것입니다
T = (X-P(1)) + (Y-P(2)) + (Z-P(3)); 

당신이 이미 그 단계의 바로 위에 두 번째 실린더.

+0

나는 당신의 제안을 시도했지만 효과가없는 것 같습니다. 그것은 이해할 수없는 결과를 만듭니다. 나는 'cyl2 (T <0) = 0;과 같은 명령문의 정확성에 대해서도 확신하지 못합니다. 방정식이 맞지만 트리밍이 잘못되었을 수 있습니까? 어쨌든 도와 주셔서 감사합니다. –