function distFromLid = DistanceFromLidar(sortedAngle,LidarDist,closingInfo,closingAngle) 
%funkce pro získání vzdálenosti z lidaru
%carAngle [midHor° midVert° maxHort° maxVert°]  
 maxCar=20;
maxClosing=5;
fovLidar=22.5;
%% inicializace distCar closingCars a výstupu
    persistent distCar;
    if isempty(distCar)
        distCar = cell(1, maxCar); 
        for i = 1:maxCar
            %počet řádků určuje počet předchozích kroků
            distCar{1,i} = zeros(15,3); %[přechozí_vzdálenosti předchozí_úhly reálná=1] 
        end
    end

    persistent closingCar;
    if isempty(closingCar)
        closingCar = cell(1, maxClosing); 
        for i = 1:maxClosing
            %počet řádků určuje počet předchozích kroků
            closingCar{1,i} = zeros(15,4); %[přechozí_vzdálenosti předchozí_úhly reálná=1 kolik_kroku_chybí] 
        end
    end
    
    firstZeroCollClosing = 1;
    for i = 1:size(closingCar, 2) 
        if mean(closingCar{1,i},'all')== 0 % porovnání průměru matice s nulou 
            firstZeroCollClosing = i; % uložení indexu sloupce
            break; 
        end
    end
%% odstranění zmizelého auta a přesunutí řádků
    if ~isempty(closingInfo)
        for i=1:size(closingInfo,1) %odstranění pomocí closing
            j=closingInfo(i,1);
            l=closingInfo(i,2);
            m=closingInfo(i,3);
            n=closingInfo(i,4); %hard delete
            
            if n>0 %hard delete
                for c=1:1
                    for k=n:(maxCar-1) 
                        distCar{c,k} = distCar{c,k+1}; %posunutí buněk o jedno doleva od pozice podle closing
                    end
                end
                distCar{1,maxCar} = zeros(15,3); %nulovaní posledního
            end
            
            if j>0 %přesuň do closing a smaž exist
                closingCar{1,firstZeroCollClosing}(:,1:3)=distCar{1,j}(:,1:3);
                for k=j:(maxCar-1) 
                    distCar{1,k} = distCar{1,k+1}; %posunutí buněk o jedno doleva od pozice podle closing
                end
                distCar{1,maxCar} = zeros(15,3); %nulovaní posledního
                firstZeroCollClosing=firstZeroCollClosing+1;
            end

            if l>0 %přesuň do exist a smaž closing
                distCar{1,m}(:,1:3)= closingCar{1,l}(:,1:3);
                for c = l:(maxClosing-1)
                    closingCar{1,c} =  closingCar{1,c+1};
                end
                closingCar{1,maxClosing} = zeros(15,4); %nulovaní posledního
                firstZeroCollClosing=firstZeroCollClosing-1;
            end
        end
    end  
%% tranformace na řádek a sloupec v lidar datech

    searchAngle = zeros(size(sortedAngle, 1), 4); 

    for i = 1:size(sortedAngle, 1)        
        searchAngle(i,1) = 1 + ceil((sortedAngle(i,1)-(sortedAngle(i,3)/1.4))/360 * (size(LidarDist,2)-1));  %levej sloupec (nejbližší vyšší)
        searchAngle(i,2) = 1 + floor((sortedAngle(i,1)+(sortedAngle(i,3)/1.4))/360 * (size(LidarDist,2)-1));   %prevej sloupec (nejbližší nižší)
        searchAngle(i,3) = ceil((((sortedAngle(i,2)-(sortedAngle(i,4)/3.5))/fovLidar) * size(LidarDist,1))+(size(LidarDist,1)/2));  %horní řádek  (nejbližší vyšší)
        searchAngle(i,4) = floor((((sortedAngle(i,2)+(sortedAngle(i,4)/1.3))/fovLidar) * size(LidarDist,1))+(size(LidarDist,1)/2));   %spodní řádek    (nejbližší nizší)        
       

        %bug: fov lidaru +- 20° ale kamery 34,6°... hledání mimo pole
        %ošetření když kamera má větší FOV aby nehledal mimo pole
        if searchAngle(i,3) < 1
            searchAngle(i,3) = 1;
        elseif searchAngle(i,3) > size(LidarDist,1)
            searchAngle(i,3) = size(LidarDist,1);
        end

        if searchAngle(i,4) < 1
            searchAngle(i,4) = 1;
        elseif searchAngle(i,4) > size(LidarDist,1)
            searchAngle(i,4) = size(LidarDist,1);
        end
    end
%%
    distFromLid = zeros(size(searchAngle, 1), 2);

    % searchAngle=[leftHor rightHor topVert botVert] 

    for i = 1:size(searchAngle, 1) 
        %lidar výseč matice
        lidarBox = LidarDist(searchAngle(i,3):searchAngle(i,4), ...
            searchAngle(i,1):searchAngle(i,2));  
        %filtrace dle nejpočetnější hodnoty
        filteredPoints = CarPointsFilter(lidarBox);
        meanDist = mean(filteredPoints,"all","omitnan");
        %predikce vzdálenosti
        PredDist = carPrediction.PredictDistFromMat(distCar{1,i}(:,1)); 

        distCar{1,i}= circshift(distCar{1,i}, [1, 0]);

        cont = size(distCar{1,i}(any(distCar{1,i}(:,3),2),3),1);
        %vzdálenost když je mimo o víc jak 20% a když je víc jak 10 hodnot
        %reálných je povoleno vložit predikci
        if (meanDist < (distCar{1,i}(2,1) - (distCar{1,i}(2,1)*0.2)) || meanDist > (distCar{1,i}(2,1) + (distCar{1,i}(2,1)*0.2))) && cont>10
            distCar{1,i}(1,1) = PredDist(1,1);
            distCar{1,i}(1,2) = sortedAngle(i,1); 
            distCar{1,i}(1,3)= 0;
        else
            distCar{1,i}(1,1) = meanDist;
            distCar{1,i}(1,2) = sortedAngle(i,1);
            distCar{1,i}(1,3)= 1;
        end

        
        rowcont = size(distCar{1,i}(any(distCar{1,i}(:,1),2),1),1);
        if rowcont > 2
            distMovMenMat = distCar{1,i}(any(distCar{1,i}(:,1),2),1);
            angleMovMenMat = distCar{1,i}(any(distCar{1,i}(:,1),2),2);

            distMovMenMat = movmean(distMovMenMat,[2 2],1);
            angleMovMenMat = movmean(angleMovMenMat,[0 2],1);

            distFromLid(i,1) = distMovMenMat(1,1);
            distFromLid(i,2) = angleMovMenMat(1,1);
        else
            distFromLid(i,1) = NaN; 
            distFromLid(i,2) = NaN; 
        end
    end

    %% closing smyčka
    if firstZeroCollClosing > 1
        i=1;
        while i <= (firstZeroCollClosing-1)
            %pro včechny zmizelé přičti krok
            closingCar{1,i}(1,4)=closingCar{1,i}(2,4)+1;
            if closingCar{1,i}(1,4) > 5 
                % po překročení 5 kroku se dané vozidlo smaže
                for c = i:(maxClosing-1)
                     closingCar{1,c} =  closingCar{1,c+1};
                end
                closingCar{1,maxClosing}=zeros(15,4);
                firstZeroCollClosing=firstZeroCollClosing-1; 
            else
                %pro všechny zbylé zmizelé vytvoř predikci
                predictDist= carPrediction.PredictDistFromMat(closingCar{1,i}(:,1));
                closingCar{1,i}= circshift(closingCar{1,i}, [1, 0]);
                closingCar{1,i}(1,:)=closingCar{1,i}(2,:);
        
                closingCar{1,i}(1,1)=predictDist;
                closingCar{1,i}(1,2)=closingAngle(i,1);
                closingCar{1,i}(1,3)=0;% je to predikovaní
                i=i+1;
            end
        end
    end
end