/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkVoronoiKernel.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
/**
 * @class   vtkVoronoiKernel
 * @brief   a Voronoi interpolation kernel
 *
 *
 * vtkVoronoiKernel is an interpolation kernel that simply returns the
 * closest point to a point to be interpolated. A single weight is returned
 * with value=1.0.
 *
 * @warning
 * In degenerate cases (where a point x is equidistance from more than one
 * point) the kernel basis arbitrarily chooses one of the equidistant points.
 *
 * @sa
 * vtkInterpolationKernel vtkGeneralizedKernel vtkProbabilisticVoronoiKernel
 */

#ifndef vtkVoronoiKernel_h
#define vtkVoronoiKernel_h

#include "vtkFiltersPointsModule.h" // For export macro
#include "vtkInterpolationKernel.h"

class vtkIdList;
class vtkDoubleArray;

class VTKFILTERSPOINTS_EXPORT vtkVoronoiKernel : public vtkInterpolationKernel
{
public:
  ///@{
  /**
   * Standard methods for instantiation, obtaining type information, and printing.
   */
  static vtkVoronoiKernel* New();
  vtkTypeMacro(vtkVoronoiKernel, vtkInterpolationKernel);
  void PrintSelf(ostream& os, vtkIndent indent) override;
  ///@}

  /**
   * Given a point x (and optional associated ptId), determine the points
   * around x which form an interpolation basis. The user must provide the
   * vtkIdList pIds, which will be dynamically resized as necessary. The
   * method returns the number of points in the basis. Typically this method
   * is called before ComputeWeights().
   */
  vtkIdType ComputeBasis(double x[3], vtkIdList* pIds, vtkIdType ptId = 0) override;

  /**
   * Given a point x, and a list of basis points pIds, compute interpolation
   * weights associated with these basis points.  Note that both the nearby
   * basis points list pIds and the weights array are provided by the caller
   * of the method, and may be dynamically resized as necessary. Typically
   * this method is called after ComputeBasis(), although advanced users can
   * invoke ComputeWeights() and provide the interpolation basis points pIds
   * directly.
   */
  vtkIdType ComputeWeights(double x[3], vtkIdList* pIds, vtkDoubleArray* weights) override;

protected:
  vtkVoronoiKernel();
  ~vtkVoronoiKernel() override;

private:
  vtkVoronoiKernel(const vtkVoronoiKernel&) = delete;
  void operator=(const vtkVoronoiKernel&) = delete;
};

#endif
