function boundary = p15_boundary_nearest ( m, n, point )

%*****************************************************************************80
%
%% P15_BOUNDARY_NEAREST returns a nearest boundary point in problem 15.
%
%  Discussion:
%
%    The nearest boundary point assignment is incorrect for regions
%    14 and 16, and for regions 21 and 23.  The boundary between each
%    of these pairs of regions is actually a parabola, but we have not
%    bothered to model these exactly.
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    12 April 2009
%
%  Author:
%
%    John Burkardt
%
%  Parameters:
%
%    Input, integer M, the spatial dimension.
%
%    Input, integer N, the number of points.
%
%    Input, real POINT(M,N), the coordinates of the points.
%
%    Output, real BOUNDARY(M,N), points on the boundary
%    that are nearest to each point.
%
  for j = 1 : n

    x = point(1,j);
    y = point(2,j);
%
%  INTERIOR REGIONS.
%
%  Region 1
%
    if ( -8.0 <=     x              && ...
         -9.0 <= y + x              && ...
                     y - x <= 8.0 )

      boundary(1,j) = -8.0;
      boundary(2,j) = y;
%
%  Region 2
%
    elseif (             y + x <= -9.0 && ...
              -1.0 <=     y             && ...
                          y - x <= -3.0 && ...
                              y <=  0.5 )

      boundary(1,j) = x;
      boundary(2,j) = -1.0;
%
%  Region 3
%
    elseif ( -3.0 <= y - x             && ...
                              x <=  2.0 && ...
                          y     <=  0.0 && ...
               0.0 <=     x             )

      boundary(1,j) = 2.0;
      boundary(2,j) = y;

%
%  Region 4
%
    elseif (  0.0 <= y                  && ...
                               x <=  2.0 && ...
                           y     <=  0.5 && ...
                0.0 <=     x             )

      boundary(1,j) = 2.0;
      boundary(2,j) = 0.0;
%
%  Region 5
%
    elseif (  2.0 <=      x             && ...
               0.0 <=  y                 && ...
                           y - x <= -8.0 && ...
                           y     <=  0.5 )
      boundary(1,j) = x;
      boundary(2,j) = 0.0;
%
%  Region 6
%
    elseif ( -8.0 <= y - x             && ...
                              x <=  8.0 && ...
                          y + x <=  9.0 )
      boundary(1,j) = 8.0;
      boundary(2,j) = y;
%
%  Region 7
%
    elseif (  9.0 <= y + x             && ...
                          y     <=  1.0 && ...
               3.0 <= y - x             && ...
               0.5 <= y                 )

      boundary(1,j) = x;
      boundary(2,j) = 1.0;
%
%  Region 8
%
    elseif (             y - x <=  3.0 && ...
              -2.0 <=     x             && ...
               0.0 <= y                 && ...
                              x <=  0.0 )

      boundary(1,j) = -2.0;
      boundary(2,j) = y;
%
%  Region 9
%
    elseif (              y     <=  0.0 && ...
               -2.0 <=     x             && ...
               -0.5 <= y                 && ...
                               x <=  0.0 )

      boundary(1,j) = -2.0;
      boundary(2,j) =  0.0;
%
%  Region 10
%
    elseif (                  x <= -2.0 && ...
                           y     <=  0.0 && ...
                8.0 <= y - x             && ...
                0.5 <= y                 )

      boundary(1,j) = x;
      boundary(2,j) = 0.0;
%
%  EXTERIOR REGIONS.
%
%  Region 11
%
    elseif (  -1.0 <= y                 && ...
                               x <= -8.0 && ...
                           y     <=  0.0 )

      boundary(1,j) = -8.0;
      boundary(2,j) = y;
%
%  Region 12
%
    elseif (              y     <= -1.0 && ...
                               x <= -8.0 )

      boundary(1,j) = -8.0;
      boundary(2,j) = -1.0;
%
%  Region 13
%
    elseif (                  x <=  2.0 && ...
                           y     <= -1.0 && ...
               -8.0 <=     x             )

      boundary(1,j) = x;
      boundary(2,j) = -1.0;
%
%  Region 14
%  The boundary between regions 14 and 16 is only set approximately.
%
    elseif (                  x <=  3.0 && ...
                           y     <= -1.0 && ...
                2.0 <=     x             )

      boundary(1,j) =  2.0;
      boundary(2,j) = -1.0;
%
%  Region 15
%
    elseif (   2.0 <=     x             && ...
               -1.0 <= y                 && ...
                           y - x <= -2.0 )

      boundary(1,j) =  2.0;
      boundary(2,j) = y;
%
%  Region 16
%  The boundary between regions 14 and 16 is only set approximately.
%
    elseif ( (                 x <= 3.0 && ...
                            y     <= 0.0 && ...
                -2.0 <= y - x            )     ...
            |                                   ...
              (                 x <= 8.0 && ...
                            y     <= 0.0 && ...
                 3.0 <=     x            ) )

      boundary(1,j) = x;
      boundary(2,j) = 0.0;
%
%  Region 17
%
    elseif (   8.0 <=     x             && ...
                           y     <=  0.0 )

      boundary(1,j) = 8.0;
      boundary(2,j) = 0.0;
%
%  Region 18
%
    elseif (              y     <= 1.0  && ...
                8.0 <=     x             && ...
                0.0 <= y                 )

      boundary(1,j) = 8.0;
      boundary(2,j) = y;
%
%  Region 19
%
    elseif (   8.0 <=     x             && ...
                1.0 <= y                 )

      boundary(1,j) = 8.0;
      boundary(2,j) = 1.0;
%
%  Region 20
%
    elseif (  -2.0 <=     x             && ...
                1.0 <= y                 && ...
                               x <= 8.0 )

      boundary(1,j) = x;
      boundary(2,j) = 1.0;
%
%  Region 21
%  The boundary between regions 21 and 23 is only set approximately.
%
    elseif (                  x <= -2.0 && ...
                1.0 <= y                && ...
               -3.0 <=     x             )

      boundary(1,j) = -2.0;
      boundary(2,j) = 1.0;
%
%  Region 22
%
    elseif (                  x <= -2.0 && ...
                           y     <=  1.0 && ...
                2.0 <= y - x             )

      boundary(1,j) = -2.0;
      boundary(2,j) = y;
%
%  Region 23
%  The boundary between regions 21 and 23 is only set approximately.
%
    elseif ( (             y - x <=  2.0 && ...
                 0.0 <= y                 && ...
                -3.0 <=     x                   ...
              ) | (                              ...
                                x <= -3.0 && ...
                 0.0 <= y                 && ...
                -8.0 <=     x ) )

      boundary(1,j) = x;
      boundary(2,j) = 1.0;
%
%  Region 24
%
    elseif ( x <= -8.0 && ...
              0.0 <= y )

      boundary(1,j) = -8.0;
      boundary(2,j) = 0.0;
%
%  Somehow, a point missed all the regions.
%  This should not happen.
%
    else

      fprintf ( 1, '\n' );
      fprintf ( 1, 'P15_BOUNDARY_NEAREST - Fatal error!\n' );
      fprintf ( 1, '  Orphan point = ( %f, %f )\n', point(1:2,j) );
      error ( 'P15_BOUNDARY_NEAREST - Fatal error!' );

    end

  end

  return
end
