Function smoothPath

Description: Shortens a path by repeatedly attempting to connect two randomly selected points along the path together.

function smoothPath(nsmooth,dodraw,path)
global obs
final_path=path;

% Perform path smoothing
for i=1:nsmooth
    % Randomly select two path segments
    path_length=size(final_path,1);
    p1=ceil((path_length-1)*rand);
    p2=ceil((path_length-1)*rand);
    while (p2==p1); p2=ceil((path_length-1)*rand); end;
    pt=p1; if p1>p2; p1=p2; p2=pt; end;

    % Randomly select two points from the two path segments
    r1=rand;
    if final_path(p1,1)>final_path(p1+1,1); pnt1(1)=final_path(p1,1)-abs(final_path(p1,1)-final_path(p1+1,1))*r1; else pnt1(1)=final_path(p1,1)+abs(final_path(p1,1)-final_path(p1+1,1))*r1; end
    if final_path(p1,2)>final_path(p1+1,2); pnt1(2)=final_path(p1,2)-abs(final_path(p1,2)-final_path(p1+1,2))*r1; else pnt1(2)=final_path(p1,2)+abs(final_path(p1,2)-final_path(p1+1,2))*r1; end
    if final_path(p1,3)>final_path(p1+1,3); pnt1(3)=final_path(p1,3)-abs(final_path(p1,3)-final_path(p1+1,3))*r1; else pnt1(3)=final_path(p1,3)+abs(final_path(p1,3)-final_path(p1+1,3))*r1; end
    r2=rand;
    if final_path(p2,1)>final_path(p2+1,1); pnt2(1)=final_path(p2,1)-abs(final_path(p2,1)-final_path(p2+1,1))*r2; else pnt2(1)=final_path(p2,1)+abs(final_path(p2,1)-final_path(p2+1,1))*r2; end
    if final_path(p2,2)>final_path(p2+1,2); pnt2(2)=final_path(p2,2)-abs(final_path(p2,2)-final_path(p2+1,2))*r2; else pnt2(2)=final_path(p2,2)+abs(final_path(p2,2)-final_path(p2+1,2))*r2; end
    if final_path(p2,3)>final_path(p2+1,3); pnt2(3)=final_path(p2,3)-abs(final_path(p2,3)-final_path(p2+1,3))*r2; else pnt2(3)=final_path(p2,3)+abs(final_path(p2,3)-final_path(p2+1,3))*r2; end

    % Connect the two points
    if ~collisionCheck(pnt1,pnt2,obs);
        % Update Path
        path1=final_path(1:p1,:);
        path2=[pnt1;pnt2];
        path3=final_path(p2+1:end,:);
        final_path=[path1;path2;path3];
        % Plot path
        %if dodraw; line(final_path(:,1),final_path(:,2),final_path(:,3),'Color','y'); end;
    end
end

% Plot final path
if dodraw
    plot3(final_path(:,1),final_path(:,2),final_path(:,3),'LineWidth',2,'Color','g');
    axisH=get(gca,'title');
    title_string=get(axisH,'String');
    title_string=[title_string,'. Initial(Red), Smoothed(Green)'];
    set(axisH,'String',title_string)
end