function [ x, y, ierror ] = r8poly2_ex ( x1, y1, x2, y2, x3, y3 )

%*****************************************************************************80
%
%% R8POLY2_EX finds the extremal point of a parabola determined by three points.
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    30 September 2006
%
%  Author:
%
%    John Burkardt
%
%  Parameters:
%
%    Input, real X1, Y1, X2, Y2, X3, Y3, the coordinates of 
%    three points on the parabola.  X1, X2 and X3 must be distinct.
%
%    Output, real X, Y, the X coordinate of the extremal point
%    of the parabola, and the value of the parabola at that point.
%
%    Output, integer IERROR, error flag.
%    0, no error.
%    1, two of the X values are equal.
%    2, the data lies on a straight line; there is no finite extremal
%    point.
%
  ierror = 0;
  x = x1;
  y = y1;

  if ( x1 == x2 || x2 == x3 || x3 == x1 )
    ierror = 1;
    return
  end

  if ( y1 == y2 && y2 == y3 && y3 == y1 )
    return
  end

  bot = ( x2 - x3 ) * y1 - ( x1 - x3 ) * y2 + ( x1 - x2 ) * y3;

  if ( bot == 0.0 )
    ierror = 2
    return
  end

  x = 0.5 * ( ...
          x1^2 * ( y3 - y2 ) ...
        + x2^2 * ( y1 - y3 ) ...
        + x3^2 * ( y2 - y1 ) ) / bot;

  y = ( ...
         ( x - x2 ) * ( x - x3 ) * ( x2 - x3 ) * y1 ...
       - ( x - x1 ) * ( x - x3 ) * ( x1 - x3 ) * y2 ...
       + ( x - x1 ) * ( x - x2 ) * ( x1 - x2 ) * y3 ) / ...
       ( ( x1 - x2 ) * ( x2 - x3 ) * ( x1 - x3 ) );

  return
end
