2013-03-28 2 views
5

이것은 아마도 매우 기본적인 MATLAB이므로 용서해주세요. 명령을 사용하여 3D 구형을 만들고 서핑을 사용하여이를 생성하는 행렬 x,y,z을 만듭니다. 예를 들어matlab을 사용하여 평면에 구형 투영

[x,y,z]=sphere(64); 

I은 ​​구형의 돌출부 것이다 차원 행렬을 획득하기 위해 (예를 들면 X-Y 평면에 대해) 직교 2D 평면 중 하나에이 3D 구 프로젝트 (또는 합) 싶다. 어떻게 매트랩 것을 달성 할 수있는,

enter image description here

단순 합산 분명히 작동하지 않습니다의 모양은 출력에 imshow 또는 imagesc를 사용하십니까?

답변

1

나는 귀하의 질문을 완전히 오해 할 수도 있습니다. 그 경우에는 사과드립니다. 하지만 다음 세 가지 방법 중 하나가 실제로 필요한 것일 수 있습니다. 방법 3은 당신이 제공 한 예제와 많이 닮은 이미지를 제공합니다 ... 그러나 저는 매우 다른 경로를 가지고 있습니다 (sphere 명령을 사용하지 않고 "내부의 voxels"및 "외부의 voxels"컴퓨팅하기). 중앙에서부터 거리를두고 직접). 구면을 0으로 채우면 거의 검은 색 디스크처럼 보이게되어서 제 3의 이미지와 비교하여 두 번째 이미지를 뒤집 혔습니다.

enter image description here

%% method 1: find the coordinates, and histogram them 
[x y z]=sphere(200); 
xv = linspace(-1,1,40); 
[xh xc]=histc(x(:), xv); 
[yh yc]=histc(y(:), xv); 

% sum the occurrences of coordinates using sparse: 
sm = sparse(xc, yc, ones(size(xc))); 
sf = full(sm); 

figure; 
subplot(1,3,1); 
imagesc(sf); axis image; axis off 
caxis([0 sf(19,19)]) % add some clipping 
title 'projection of point density' 

%% method 2: fill a sphere and add its volume elements: 
xv = linspace(-1,1,100); 
[xx yy zz]=meshgrid(xv,xv,xv); 
rr = sqrt(xx.^2 + yy.^2 + zz.^2); 
vol = zeros(numel(xv)*[1 1 1]); 
vol(rr<1)=1; 
proj = sum(vol,3); 
subplot(1,3,2) 
imagesc(proj); axis image; axis off; colormap gray 
title 'projection of volume' 

%% method 3: visualize just a thin shell: 
vol2 = ones(numel(xv)*[1 1 1]); 
vol2(rr<1) = 0; 
vol2(rr<0.95)=1; 
projShell = sum(vol2,3); 
subplot(1,3,3); 
imagesc(projShell); axis image; axis off; colormap gray 
title 'projection of a shell' 
0

당신은 사용하여 matlab에의 XY 평면에 투사 할 수 있습니다 :

[x,y,z] = sphere(64); 
surf(x,y,zeros(size(z))); 

을하지만 문제는 해석이 작업을 수행 할 수 있도록 간단하기 때문에, 당신이 MATLAB을 사용하지한다고 생각합니다 ...

+0

본인은이 결과를 플롯에 관심이 아니지만, 3 차원 영역의 투사 인 2 차원 매트릭스를 가지고. 그리고 그렇게 단순하다면 왜 대답하지 않겠습니까? –

+0

그러나 구의 투영법 인 2D 매트릭스를 사용한다는 것은 무엇을 의미합니까? 어떻게 행렬이 구의 투영이 될 수 있습니까? 그것은 의미가 없습니다 ... –

+0

구체는 본질적으로 3D 오브젝트이며, 투영은 2D 오브젝트입니다. Matlab에서 2D 객체는 행렬로 표현됩니다. 그 행렬에서'imagesc'를 사용하면 첨부 된 이미지와 같은 것을 얻을 것으로 예상됩니다. "링"을 따라 점 (또는 더 높은 픽셀 값)이 누적 될 것이고, 중간에는 훨씬 적습니다. –

0

이 목적을 위해 설계된지도 투영법을 살펴 보겠습니다.

"지도 투영 matlab"을 검색하면 Matlab mapping toolbox에 대한 문서가 생성됩니다. 그러나 자신 만의 롤백을 원하거나 필요로하는 경우 wikipedia 기사뿐만 아니라 USGS 웹 사이트에서 좋은 요약을 볼 수 있습니다.

+0

지도 도구 상자가 매우 유용 할 것 같은데, 다시 말하면, 그 투영법의 2D 매트릭스를 출력하지 않을 것이고, 주로 디스플레이 목적으로 사용됩니다. 또한 관심있는 투영은 2D 평면에서 픽셀로 떨어지는 구의 모든 점을 합산하는 반면지도 도구 상자 (예를 들어 수직 투시 투영법을 볼 때)에서는 구의 절반이 누락 된 상태입니다. 그것은 단지 지구의 절반에 해당하는 절반을 보여줍니다. –

+0

투영에는 여러 가지 종류가 있습니다. 일부는 구의 절반 만 표시 할 수 있지만 나머지는 (Stereographic 또는 Mercator 투영과 같이) 본질적으로 모든 구를 보여줍니다.(적어도 하나의 특이점이없는 평면에 연속적으로 구를 매핑하는 것은 불가능합니다 ...) – comingstorm