2013-08-05 4 views
0

matlab 그림에서 직사각형 패치 집합을 생성 할 때 사각형 모서리 중 일부가 구부러 지거나 잘리지 않고 잘립니다. 이것은 눈금에 달려있어 이미지를 확대하면 효과가 사라집니다. 나는 이것이 앨리어싱/압축 효과와 관련이있을 것이라고 생각했다. 흥미롭게도 rectangle을 사용하면 문제가 해결되는 것 같습니다.matlab figure에서 직사각형 패치 요소에서 곡선 모서리를 피하는 방법은 무엇입니까?

enter image description here

코드는 다른 question에 응답 내지 : 여기

중간 배율 (예컨대도 분명 존재하지 않아야 점선 테두리 다른 문제)에서 문제의 예는 :
H=Hadamard(48); %# now to row-double the matrix 
A=(1+H)/2; 
B=(1-H)/2; 
C=[A; B]; %# the code below randomly permutes elements within the rows of the matrix 
[nRows,nCols] = size(C); 
[junk,idx] = sort(rand(nRows,nCols),2); %# convert column indices into linear indices 
idx = (idx-1)*nRows + ndgrid(1:nRows,1:nCols); %# rearrange whatever matrix 
E = C; 
E(:) = E(idx); 
[X Y] = find(logical(E)); 
xl = length(X); 
yl = length(Y); 
figure, hold on 
for ii=1:xl 
    patch(X(ii) + [0 0 1 1],Y(ii) + [0.15 0.9 0.9 0.1],[1 1 1],'Edgecolor',[1 1 1]) 
end 
axis([0 max(X)+1 0 max(Y)+1]) 
axis('square') 
set(gca,'color',[0 0 0]) 
set(gca,'XTickLabel',[],'YTickLabel',[],'XTick',[],'YTick',[]) 

내 질문

은 다음과 같습니다 (1) 가능 (방법) 곡선 모서리와의 예에서 볼 패치 객체의 다른 결함을 제거하는 것입니다, 화면에 전체 그림을 표시하는 데 사용 된 배율의 중간에서 중간까지 (2) 가장 중요한 점은 구부러진 모서리가없는 이미지 파일 (jpg, png, pdf ...)을 생성 할 수 있다는 것입니다. 내가 봤던 모든 형식이 원하지 않는 효과를 보전하는 것으로 보입니다. 응답 2는 대답 (1)을 본질적으로 중요하지 않게 만들고 응답 (1)은 아마도 (2)를 해결합니다.

편집

문제가 해결 rectangle 사용하는 경우 이동 때문에

,이 matlab에 렌더링 엔진에 문제가 나타 납니까? 참고 :이 예제는 R14로 생성되었지만 연결된 질문의 OP에는 비슷한 문제가 있습니다 (matlab 버전 알 수 없음).

패치 개체에 사용할 수있는 다양한 조명 및 가장자리 표현 옵션을 살펴 보았지만 개선되지 않았습니다.

+1

경험상, '패치 기반'3 -D 개체 솔루션을 제공합니다. 모든 종류의 반올림 문제가 있다는 것을 알게 될 것입니다. 동일한 치수를 지니고있는 일부 치수가 그런 식으로 끝나지 않고 크기가 다르거 나 확대되었을 때 패치가 다르게 보입니다. 벡터 그래픽은 어렵습니다. – horchler

+0

@horchler 3D 그래픽에 많은 관심을 기울이지 않아서 패치 오브젝트가 특히 3D 렌더링을위한 것이라는 것을 깨달았습니다. 다시 이것은 matlab의 버전 제한 일지 모르지만 문서를 보면 2D 폴리곤을 그릴 때 많은 선택 사항이 아닌 것으로 보이며 2D 응용 프로그램 패치는 문서 전체에 있습니다. 내가 뭔가를 놓친 건가? (다시 내 오래된 matlab 버전 때문에)? –

+0

그리고 mathworks는 힘든 회사가 아닙니다. 최근 버전에서는 패치 스타일 그래픽이 훨씬 향상 되었습니까? –

답변

0

질문은 유사한 질문인데, 예를 들어 here과 같은 반복되는 질문입니다.

대답은 직사각형을 그릴 때 patch을 명시 적으로 사용하는 것을 피하는 것 같습니다. fill 또는 rectangle을 대신 사용하십시오. 다음 그림의 생성 방법은 내가 말할 수있는 한 거의 동일한 결과를 제공합니다.

load had.mat % <-- load the data containing the matrix of interest in array E 
[X Y] = find(logical(E)); 
xl = length(X); 
yl = length(Y); 
figure, hold on 
for ii=1:xl 
     rectangle('Position',[X(ii) Y(ii)+.2 1 0.8],'facecolor',[1 1 1],'edgecolor',[1 1 1]) 
%  fill([X(ii) X(ii) X(ii)+1 X(ii)+1], [Y(ii)+0.2 Y(ii)+0.8 Y(ii)+0.8 Y(ii)+0.2],[1 1 1],'edgecolor',[1 1 1],'marker','.','markersize',1) 
end 
set(gca,'color',[0 0 0]) 
set(gca,'XTickLabel',[],'YTickLabel',[],'XTick',[],'YTick',[]) 
set(gcf,'Renderer','zbuffer') 
관련 문제