2016-12-02 2 views
4

푸른 점과 빨간 점에 두 점 집합이 있고 plot 점이 있습니다. 그렇다면 voronoi(X,Y) 기능을 가진 두 세트의 보로 노이 다이어 plot 다이어그램. 각 셀의 색상을 지정하려면 사이트가 속한 설정에 따라 다릅니다.MATLAB에서 보로 노이 다이어그램의 무한한 셀

 [v,c]=voronoin(D); 
    for p=1:TheNumberOfSets 
     r=rand()/2+0.5; % random gray color 
     col=[r r r]; 
     for s=1:PointsInSet(p) 
      l=l+1; 
      patch(v(c{l},1),v(c{l},2),col); % color 
      axis([0 10 0 10]); 
     end 
    end 

D이 세트의 점의 좌표는, TheNumberOfSets은 우리가 가지고이 특정 부분에 (우리가 얼마나 많은 세트를 수행 쇼 : 나는 거의 patch 함수를 사용하여이 방법을이 일을했습니다 2 세트) col 임의의 회색 색상을 지정하면 PointsInSet은 각 세트에 얼마나 많은 포인트가 있는지 지정하고 l은 보로 노이 다이어그램의 셀을 나열하는 데 사용됩니다. (당신이 볼 수있는!) 지금 enter image description here

내 문제가 무제한의 세포에 관한 것입니다 :

는 이것은 결과입니다. 이 코드는 바운드 된 셀의 색상을 변경하기 만하고 축 상자 범위 (즉, 이미지에서 볼 수있는 상자)에서 지정된 세트의 색상으로 묶여 있지 않은 셀에 색상을 지정하려고합니다.

의견이 있으십니까?

+1

당신이'l','v','c','col' TheNumberOfSets','PointsInSet''의 샘플 정보를 추가 시겠어요을, 아무것도 내가 놓친 수 있습니다 ? 문제의 적절한 예를 만드는 방법에 대한 자세한 내용은 [mcve] (http://stackoverflow.com/help/mcve)의 도움말 파일을 참조하십시오. –

+0

몇 가지 추가 정보가 있습니다. @FranzHahn –

+0

'l'은 어떨까요? –

답변

1

예제에서는 실제로 무제한 셀에 대해 patch 개체를 만듭니다. 그러나 테두리가없는 가장자리를 나타내는 Inf 값을 가진 정점이 포함되어 있기 때문에이 개체는 표시되지 않습니다. 패치를 완료하려면이 정점을 유한 패치로 대체해야합니다.

voronoi에 의해 생성 된 정점이이 목적으로 유용합니다. 보로 노이 다이어그램 그리기 때이를 얻을 수 있습니다

h = voronoi(D); 
v1 = shiftdim(reshape([h(2).XData;h(2).YData],2,3,[]),2); % Arranged one edge per row, one vertex per slice in the third dimension 

무제한의 가장자리가 마지막으로 플롯을, 그래서 당신은 c 바운드 세포를 계산하여 이들을 분리 할 수 ​​있습니다

nUnbounded = sum(cellfun(@(ic)ismember(1,ic),c)); 
v1Unbounded = v1(end-(nUnbounded-1):end,:,:); 

이 가장자리의 첫 번째 나열된 정점을 셀의 유한 정점입니다. 이 항상 정확하게 때문에 부동 소수점 오류로 voronoin에 의해 반환 된 좌표와 일치하므로 pdist2에서 최소 페어 거리를 찾아 이들에 해당 정점을 번호를 식별하지 않습니다

[~,iBounded] = min(pdist2(v,v1Unbounded(:,:,1))); % Index of the bounded vertex 
vUnbounded = v1Unbounded(:,:,2); % Displayed coordinate of the unbounded end of the cell edge 

은 당신이 할 수있는 이러한 좌표로 대체하기를 다음과 patch(v(c{l},1),v(c{l},2),col); 대체 :

cPatch = c{l}; % List of vertex indices 
vPatch = v(cPatch,:); % Vertex coordinates which may contain Inf 
idx = find(cPatch==1); % Check if cell has unbounded edges 
if idx 
    cPatch = circshift(cPatch,-idx); % Move the 1 to the end of the list of vertex indices 
    vPatch = [vPatch(1:idx-1,:) 
       vUnbounded(iBounded == cPatch(end-1),:) 
       vUnbounded(iBounded == cPatch(1),:) 
       vPatch(idx+1:end,:)]; % Replace Inf values at idx with coordinates from the unbounded edges that meet the two adjacent finite vertices 
end 
patch(vPatch(:,1),vPatch(:,2),col); 
+0

이 위대한 답변을 주셔서 대단히 감사합니다 (한 달이 지난 후에, 당신은 첫 번째 것입니다). 코드 하나만 실행하면됩니다. 'h = voronoi (D);','h' 다음에 하나의 열만 두 개의 차트 선이 없으므로 오류가 발생합니다. ** h (2) .XData에 대한 부적절한 인덱스 행렬 참조 **. 물론 MATLAB R2014a를 사용하여 ** 참고 : h = voronoi (..)의 동작이 변경되었습니다. 새로운 비헤이비어는 두 개의 차트 선 핸들 벡터를 반환합니다. 하나는 점을 나타내고 다른 하나는 [mathworks] (https://www.mathworks.com/help/matlab/ref/voronoi.html)의 Voronoi 가장자리 **를 나타냅니다. 너는 어떤 생각을 가지고 있니? 다시 한 번 감사합니다 –

+0

오, 이런! R2014a에서와 같이 여전히 'h'로 반환 된 핸들을 통해 라인 좌표에 계속 액세스 할 수 있지만 핸들 및 라인 데이터의 구조는 위에서 설명한 것과 같지 않을 수 있으며 ' .XData'를 호출하여 액세스합니다. 명시 적으로 문서화되지 않았기 때문에 위와 같이 'patch'입력을 대체 할 올바른 값을 찾을 위치를 결정하기 위해 약간의 탐색이 필요합니다. 올바르게 호출했다면'get (h, { 'XData', 'YData'})'를 사용하여 모든 라인 데이터에 접근 할 수 있어야합니다. – Will

+0

다시 한번 감사드립니다. 나는'get (h, { 'XData', 'YData'})'를 시도하고 7 점에 대해'14x2' 셀 클래스를 받았다. 어떤이 같다 : 첫번째 라인 : '[1x7 두 [1x7 더블]' 번째 라인 : '[1 × 2 배] × 2 배]' 번째 라인 : '[1 × 2 배] × 2 배]' ... 나는 이것을 알아 내고 이것을 내 코드에 맞게 만들려고 노력할 것이며 귀하의 대답이 사실임을 알고 있습니다. 문안 인사. –

관련 문제