// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
/**
 * @class   vtkEllipseArcSource
 * @brief   create an elliptical arc
 *
 *
 * vtkEllipseArcSource is a source object that creates an elliptical arc
 * defined by a normal, a center and the major radius vector.
 * You can define an angle to draw only a section of the ellipse. The number of
 * segments composing the polyline is controlled by setting the object
 * resolution.
 *
 * @sa
 * vtkArcSource
 */

#ifndef vtkEllipseArcSource_h
#define vtkEllipseArcSource_h

#include "vtkFiltersSourcesModule.h" // For export macro
#include "vtkPolyDataAlgorithm.h"
#include "vtkWrappingHints.h" // For VTK_MARSHALAUTO

VTK_ABI_NAMESPACE_BEGIN
class VTKFILTERSSOURCES_EXPORT VTK_MARSHALAUTO vtkEllipseArcSource : public vtkPolyDataAlgorithm
{
public:
  static vtkEllipseArcSource* New();
  vtkTypeMacro(vtkEllipseArcSource, vtkPolyDataAlgorithm);
  void PrintSelf(ostream& os, vtkIndent indent) override;

  ///@{
  /**
   * Set position of the center of the ellipse that define the arc.
   * Default is 0, 0, 0.
   */
  vtkSetVector3Macro(Center, double);
  vtkGetVectorMacro(Center, double, 3);
  ///@}

  ///@{
  /**
   * Set normal vector. Represents the plane in which the ellipse will be drawn.
   * Default 0, 0, 1.
   */
  vtkSetVector3Macro(Normal, double);
  vtkGetVectorMacro(Normal, double, 3);
  ///@}

  ///@{
  /**
   * Set Major Radius Vector. It defines the origin of polar angle and the major
   * radius size.
   * Default is 1, 0, 0.
   */
  vtkSetVector3Macro(MajorRadiusVector, double);
  vtkGetVectorMacro(MajorRadiusVector, double, 3);
  ///@}

  ///@{
  /**
   * Set the start angle. The angle where the plot begins.
   * Default is 0.
   */
  vtkSetClampMacro(StartAngle, double, -360.0, 360.0);
  vtkGetMacro(StartAngle, double);
  ///@}

  ///@{
  /**
   * Angular sector occupied by the arc, beginning at Start Angle
   * Default is 90.
   */
  vtkSetClampMacro(SegmentAngle, double, 0.0, 360.0);
  vtkGetMacro(SegmentAngle, double);
  ///@}

  ///@{
  /**
   * Divide line into resolution number of pieces.
   * Note: if Resolution is set to 1 the arc is a
   * straight line. Default is 100.
   */
  vtkSetClampMacro(Resolution, int, 1, VTK_INT_MAX);
  vtkGetMacro(Resolution, int);
  ///@}

  ///@{
  /**
   * Set/get whether to close the arc with a final line segment connecting the first
   * and last points in the arc. Off by default
   */
  vtkSetMacro(Close, bool);
  vtkGetMacro(Close, bool);
  vtkBooleanMacro(Close, bool);
  ///@}

  ///@{
  /**
   * Set/get the desired precision for the output points.
   * vtkAlgorithm::SINGLE_PRECISION - Output single-precision floating point,
   * This is the default.
   * vtkAlgorithm::DOUBLE_PRECISION - Output double-precision floating point.
   */
  vtkSetMacro(OutputPointsPrecision, int);
  vtkGetMacro(OutputPointsPrecision, int);
  ///@}

  ///@{
  /**
   * Set the ratio of the ellipse, i.e. the ratio b/a _ b: minor radius;
   * a: major radius
   * default is 1.
   */
  vtkSetClampMacro(Ratio, double, 0.001, 100.0);
  vtkGetMacro(Ratio, double);
  ///@}

protected:
  vtkEllipseArcSource();
  ~vtkEllipseArcSource() override = default;

  int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;

  double Center[3];
  double Normal[3];
  double MajorRadiusVector[3];
  double StartAngle;
  double SegmentAngle;
  int Resolution;
  double Ratio;
  bool Close;
  int OutputPointsPrecision;

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

VTK_ABI_NAMESPACE_END
#endif
