// This file is generated by WOK (CPPExt).
// Please do not edit this file; modify original file instead.
// The copyright and license terms as defined for the original file apply to 
// this header file considered to be the "object code" form of the original source.

#ifndef _IntPolyh_Intersection_HeaderFile
#define _IntPolyh_Intersection_HeaderFile

#include <Standard.hxx>
#include <Standard_DefineAlloc.hxx>
#include <Standard_Macro.hxx>

#include <Standard_Boolean.hxx>
#include <Standard_Integer.hxx>
#include <IntPolyh_ArrayOfSectionLines.hxx>
#include <IntPolyh_ArrayOfTangentZones.hxx>
#include <Handle_Adaptor3d_HSurface.hxx>
#include <Standard_Real.hxx>
#include <IntPolyh_PMaillageAffinage.hxx>
#include <IntPolyh_ArrayOfCouples.hxx>
class Adaptor3d_HSurface;
class TColStd_Array1OfReal;


//! the main   algorithm.  Algorythm   outputs are
//! lines  and  points like   discribe   in the last
//! paragraph.  The Algorythm provides direct acces to
//! the elements of those   lines  and points. Other
//! classes  of this package  are for internal use and
//! only concern the algorithmic part.
class IntPolyh_Intersection 
{
public:

  DEFINE_STANDARD_ALLOC

  
  //! Constructor
  Standard_EXPORT IntPolyh_Intersection(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2);
  
  //! NbSU1 ... NbSV2 are used to compute the initial
  //! samples of  the  iso parametric  meshes  on the
  //! surfaces.
  Standard_EXPORT IntPolyh_Intersection(const Handle(Adaptor3d_HSurface)& S1, const Standard_Integer NbSU1, const Standard_Integer NbSV1, const Handle(Adaptor3d_HSurface)& S2, const Standard_Integer NbSU2, const Standard_Integer NbSV2);
  
  //! D1,  D2 are used to compute the initial
  //! samples of  the  iso parametric  meshes  on the
  //! surfaces.
  Standard_EXPORT IntPolyh_Intersection(const Handle(Adaptor3d_HSurface)& S1, const TColStd_Array1OfReal& anUpars1, const TColStd_Array1OfReal& aVpars1, const Handle(Adaptor3d_HSurface)& S2, const TColStd_Array1OfReal& anUpars2, const TColStd_Array1OfReal& aVpars2);
  
  //! Compute the intersection.
  Standard_EXPORT   void Perform() ;
  
  //! Compute the intersection.
  Standard_EXPORT   void Perform (const TColStd_Array1OfReal& Upars1, const TColStd_Array1OfReal& Vpars1, const TColStd_Array1OfReal& Upars2, const TColStd_Array1OfReal& Vpars2) ;
  
  Standard_EXPORT   Standard_Boolean IsDone()  const;
  
  Standard_EXPORT   Standard_Integer NbSectionLines()  const;
  
  Standard_EXPORT   Standard_Integer NbPointsInLine (const Standard_Integer IndexLine)  const;
  
  Standard_EXPORT   void GetLinePoint (const Standard_Integer IndexLine, const Standard_Integer IndexPoint, Standard_Real& x, Standard_Real& y, Standard_Real& z, Standard_Real& u1, Standard_Real& v1, Standard_Real& u2, Standard_Real& v2, Standard_Real& incidence)  const;
  
  Standard_EXPORT   Standard_Integer NbTangentZones()  const;
  
  Standard_EXPORT   Standard_Integer NbPointsInTangentZone (const Standard_Integer IndexLine)  const;
  
  Standard_EXPORT   void GetTangentZonePoint (const Standard_Integer IndexLine, const Standard_Integer IndexPoint, Standard_Real& x, Standard_Real& y, Standard_Real& z, Standard_Real& u1, Standard_Real& v1, Standard_Real& u2, Standard_Real& v2)  const;




protected:





private:

  
  //! Computes MaillageAffinage
  Standard_EXPORT   Standard_Boolean PerformMaillage (const Standard_Boolean isFirstFwd, const Standard_Boolean isSecondFwd, IntPolyh_PMaillageAffinage& MaillageS) ;
  
  //! The method PerformMaillage(..) is used to compute MaillageAffinage. It is
  //! called four times (two times for each surface) for creation of inscribed
  //! and circumscribed mesh for each surface.
  Standard_EXPORT   Standard_Boolean PerformMaillage (IntPolyh_PMaillageAffinage& MaillageS) ;
  
  //! Computes MaillageAffinage
  Standard_EXPORT   Standard_Boolean PerformMaillage (const Standard_Boolean isFirstFwd, const Standard_Boolean isSecondFwd, const TColStd_Array1OfReal& Upars1, const TColStd_Array1OfReal& Vpars1, const TColStd_Array1OfReal& Upars2, const TColStd_Array1OfReal& Vpars2, IntPolyh_PMaillageAffinage& MaillageS) ;
  
  //! The method PerformMaillage(..) is used to compute MaillageAffinage. It is
  //! called four times (two times for each surface) for creation of inscribed
  //! and circumscribed mesh for each surface.
  Standard_EXPORT   Standard_Boolean PerformMaillage (const TColStd_Array1OfReal& Upars1, const TColStd_Array1OfReal& Vpars1, const TColStd_Array1OfReal& Upars2, const TColStd_Array1OfReal& Vpars2, IntPolyh_PMaillageAffinage& MaillageS) ;
  
  //! This method analyzes arrays to find same couples. If some
  //! are detected it leaves the couple in only one array
  //! deleting from others.
  Standard_EXPORT   void MergeCouples (IntPolyh_ArrayOfCouples& anArrayFF, IntPolyh_ArrayOfCouples& anArrayFR, IntPolyh_ArrayOfCouples& anArrayRF, IntPolyh_ArrayOfCouples& anArrayRR)  const;
  
  //! Process default interference
  Standard_EXPORT   Standard_Boolean PerformStd (IntPolyh_PMaillageAffinage& MaillageS, Standard_Integer& NbCouples) ;
  
  //! Process advanced interference
  Standard_EXPORT   Standard_Boolean PerformAdv (IntPolyh_PMaillageAffinage& MaillageFF, IntPolyh_PMaillageAffinage& MaillageFR, IntPolyh_PMaillageAffinage& MaillageRF, IntPolyh_PMaillageAffinage& MaillageRR, Standard_Integer& NbCouples) ;
  
  //! Process default interference
  Standard_EXPORT   Standard_Boolean PerformStd (const TColStd_Array1OfReal& Upars1, const TColStd_Array1OfReal& Vpars1, const TColStd_Array1OfReal& Upars2, const TColStd_Array1OfReal& Vpars2, IntPolyh_PMaillageAffinage& MaillageS, Standard_Integer& NbCouples) ;
  
  //! Process advanced interference
  Standard_EXPORT   Standard_Boolean PerformAdv (const TColStd_Array1OfReal& Upars1, const TColStd_Array1OfReal& Vpars1, const TColStd_Array1OfReal& Upars2, const TColStd_Array1OfReal& Vpars2, IntPolyh_PMaillageAffinage& MaillageFF, IntPolyh_PMaillageAffinage& MaillageFR, IntPolyh_PMaillageAffinage& MaillageRF, IntPolyh_PMaillageAffinage& MaillageRR, Standard_Integer& NbCouples) ;


  Standard_Boolean done;
  Standard_Integer nbsectionlines;
  Standard_Integer nbtangentzones;
  IntPolyh_ArrayOfSectionLines TSectionLines;
  IntPolyh_ArrayOfTangentZones TTangentZones;
  Standard_Integer myNbSU1;
  Standard_Integer myNbSV1;
  Standard_Integer myNbSU2;
  Standard_Integer myNbSV2;
  Handle(Adaptor3d_HSurface) mySurf1;
  Handle(Adaptor3d_HSurface) mySurf2;


};







#endif // _IntPolyh_Intersection_HeaderFile
