// Created on: 1992-06-03
// Created by: Laurent BUCHARD
// Copyright (c) 1992-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.

#include IntCurve_TheIntersector_hxx

#include "IntRes2d_Domain.hxx"

#include "gp_Lin2d.hxx"
#include "gp_Circ2d.hxx"
#include "gp_Elips2d.hxx"
#include "gp_Hypr2d.hxx"
#include "gp_Parab2d.hxx"

#include "IntCurve_IConicTool.hxx"

//--------------------------------------------------------------------------------
inline IntCurve_IntConicCurveGen::IntCurve_IntConicCurveGen() {}

//--------------------------------------------------------------------------------
inline IntCurve_IntConicCurveGen::IntCurve_IntConicCurveGen(const gp_Lin2d&        L,
                                                            const IntRes2d_Domain& D1,
                                                            const ThePCurve&       PCurve,
                                                            const IntRes2d_Domain& D2,
                                                            const double           TolConf,
                                                            const double           Tol)
{

  Perform(IntCurve_IConicTool(L), D1, PCurve, D2, TolConf, Tol);
}

inline void IntCurve_IntConicCurveGen::Perform(const gp_Lin2d&        L,
                                               const IntRes2d_Domain& D1,
                                               const ThePCurve&       PCurve,
                                               const IntRes2d_Domain& D2,
                                               const double           TolConf,
                                               const double           Tol)
{

  Perform(IntCurve_IConicTool(L), D1, PCurve, D2, TolConf, Tol);
}

//--------------------------------------------------------------------------------
inline void IntCurve_IntConicCurveGen::Perform(const gp_Circ2d&       C,
                                               const IntRes2d_Domain& D1,
                                               const ThePCurve&       PCurve,
                                               const IntRes2d_Domain& D2,
                                               const double           TolConf,
                                               const double           Tol)
{
  if (!D1.IsClosed())
  {
    IntRes2d_Domain D(D1);
    D.SetEquivalentParameters(D1.FirstParameter(), D1.FirstParameter() + M_PI + M_PI);
    Perform(IntCurve_IConicTool(C), D, PCurve, D2, TolConf, Tol);
    //-- throw Standard_ConstructionError("Domaine incorrect");
  }
  else
  {
    Perform(IntCurve_IConicTool(C), D1, PCurve, D2, TolConf, Tol);
  }
}

//--------------------------------------------------------------------------------
inline void IntCurve_IntConicCurveGen::Perform(const gp_Elips2d&      E,
                                               const IntRes2d_Domain& D1,
                                               const ThePCurve&       PCurve,
                                               const IntRes2d_Domain& D2,
                                               const double           TolConf,
                                               const double           Tol)
{
  if (!D1.IsClosed())
  {
    IntRes2d_Domain D(D1);
    D.SetEquivalentParameters(D1.FirstParameter(), D1.FirstParameter() + M_PI + M_PI);
    Perform(IntCurve_IConicTool(E), D, PCurve, D2, TolConf, Tol);
  }
  else
  {
    Perform(IntCurve_IConicTool(E), D1, PCurve, D2, TolConf, Tol);
  }
}

//--------------------------------------------------------------------------------
inline void IntCurve_IntConicCurveGen::Perform(const gp_Parab2d&      Prb,
                                               const IntRes2d_Domain& D1,
                                               const ThePCurve&       PCurve,
                                               const IntRes2d_Domain& D2,
                                               const double           TolConf,
                                               const double           Tol)
{
  Perform(IntCurve_IConicTool(Prb), D1, PCurve, D2, TolConf, Tol);
}

//--------------------------------------------------------------------------------
inline void IntCurve_IntConicCurveGen::Perform(const gp_Hypr2d&       H,
                                               const IntRes2d_Domain& D1,
                                               const ThePCurve&       PCurve,
                                               const IntRes2d_Domain& D2,
                                               const double           TolConf,
                                               const double           Tol)
{
  Perform(IntCurve_IConicTool(H), D1, PCurve, D2, TolConf, Tol);
}

//--------------------------------------------------------------------------------
inline void IntCurve_IntConicCurveGen::Perform(const IntCurve_IConicTool& ICurve,
                                               const IntRes2d_Domain&     D1,
                                               const ThePCurve&           PCurve,
                                               const IntRes2d_Domain&     D2,
                                               const double               TolConf,
                                               const double               Tol)
{
  IntCurve_TheIntersector myintersection;
  myintersection.SetReversedParameters(ReversedParameters());
  myintersection.Perform(ICurve, D1, PCurve, D2, TolConf, Tol);
  this->SetValues(myintersection);
}

//================================================================================
