function VC=buildMSTTree_getLevelsCoord(VERTEXES,VC)
% function VC=buildMSTTree_getLevelsCoord(VERTEXES,VC)
% Внесення в матрицю VC координат вершин рівнів 3 і вище
% Вхід:
%    VERTEXES - матриця з інформацією про вузли
%    VC - матриця координат із заповненими даними про вершини 2-го рівня
% Вихід:
%    VC - перетворена матриця з інформацією про вершини

% створюємо константи, що знадобляться при роботі програми
INDEX=1; LEVEL=2; SONS=3; PARENT=4; VALUE=5; DEPTH=6; VINDEX=7;
XCOORD=1; YCOORD=2; START_ANGLE=3; END_ANGLE=4; MIDDLE_ANGLE=5;
% знаходимо кількість вершин усього
[m,n]=size(VERTEXES);
% проходимо по усім вершинам, починаючи із 2-го рівня
for i=1:n
    % утворюємо масив індексів синів даної вершини
    iSons=find(VERTEXES(PARENT,:)==i);
    if isempty(iSons) continue; end
    tVERTEXES=[VERTEXES(:,iSons); iSons];
    % сортуємо вершини по глибині
    tVERTEXES=sortrows(tVERTEXES',DEPTH);
    tVERTEXES=reverse(tVERTEXES');
    % визначаємо розмір tVERTEXES
    % знаходимо кількість синів із синами
    cSons=1;
    while (cSons<=VERTEXES(SONS,i)) && (tVERTEXES(SONS,cSons)>0) cSons=cSons+1; end
    cSons=cSons-1;
    % якщо кількість вершин із синами >0 - заповнюємо вершини
    tVC=VC(START_ANGLE,i);
    if cSons>0
        % знаходимо розмір кута на кожного сина
        oneSonAngle=(VC(END_ANGLE,i)-VC(START_ANGLE,i))/(cSons);
        % заповнюємо значення кутів для синів
        VC(START_ANGLE,tVERTEXES(VINDEX,1))=VC(START_ANGLE,i);
        VC(END_ANGLE,tVERTEXES(VINDEX,1))=VC(START_ANGLE,tVERTEXES(VINDEX,1))+oneSonAngle;
        VC(MIDDLE_ANGLE,tVERTEXES(VINDEX,1))=(VC(END_ANGLE,tVERTEXES(VINDEX,1))+...
                                              VC(START_ANGLE,tVERTEXES(VINDEX,1)))/2;
        tVC=[tVC VC(MIDDLE_ANGLE,tVERTEXES(VINDEX,1))];
        for j=2:cSons
            VC(START_ANGLE,tVERTEXES(VINDEX,j))=VC(END_ANGLE,tVERTEXES(VINDEX,j-1));
            VC(END_ANGLE,tVERTEXES(VINDEX,j))=VC(START_ANGLE,tVERTEXES(VINDEX,j))+oneSonAngle;
            VC(MIDDLE_ANGLE,tVERTEXES(VINDEX,j))=(VC(END_ANGLE,tVERTEXES(VINDEX,j))+...
                                                  VC(START_ANGLE,tVERTEXES(VINDEX,j)))/2;
            tVC=[tVC VC(MIDDLE_ANGLE,tVERTEXES(VINDEX,j))];
        end
    end
    tVC=[tVC VC(END_ANGLE,i)];
    % якщо є сини з нульовою глибиною (без власних синів)
    if VERTEXES(SONS,i)-cSons>0
        [mtVC,ntVC]=size(tVC);
        index=cSons+1;
        itVC=2;
        while (index<=VERTEXES(SONS,i)) && (itVC<=ntVC)
           % знаходимо розмір кута на кожного сина
           oneSonAngle=(VC(END_ANGLE,i)-VC(START_ANGLE,i))/VERTEXES(SONS,i);
           % знаходимо, скільки синів поміститься у поточному куті
           howMANY=floor((tVC(1,itVC)-tVC(1,itVC-1))/oneSonAngle);
           % якщо сини поміщуються - тулимо туди
           if howMANY>0
               currSonAngle=(tVC(1,itVC)-tVC(1,itVC-1))/(howMANY+1);
               VC(MIDDLE_ANGLE,tVERTEXES(VINDEX,index))=tVC(1,itVC-1)+currSonAngle;
               index=index+1; howMANY=howMANY-1;
               while (index<=VERTEXES(SONS,i)) && (howMANY>0)
                   VC(MIDDLE_ANGLE,tVERTEXES(VINDEX,index))=VC(MIDDLE_ANGLE,tVERTEXES(VINDEX,index-1))+currSonAngle;
                   index=index+1; howMANY=howMANY-1;
               end
           end
           itVC=itVC+1;
        end
    end
end
    
% Проходимо по усіх вершинах і розраховуємо значення координат
for index=2:n
    VC(XCOORD,index)=cos(VC(MIDDLE_ANGLE,index))+...
                      VC(XCOORD,VERTEXES(PARENT,index));
    VC(YCOORD,index)=sin(VC(MIDDLE_ANGLE,index))+...
                      VC(YCOORD,VERTEXES(PARENT,index));
end
