0024923: BRepMesh_CircleTool produces bad circles
[occt.git] / src / BRepMesh / BRepMesh_CircleTool.hxx
1 // Copyright (c) 2013 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifndef _BRepMesh_CircleTool_HeaderFile
15 #define _BRepMesh_CircleTool_HeaderFile
16
17 #include <Standard.hxx>
18 #include <Standard_DefineAlloc.hxx>
19 #include <Standard_Macro.hxx>
20
21 #include <Standard_Real.hxx>
22 #include <BRepMesh_CircleInspector.hxx>
23 #include <gp_XY.hxx>
24 #include <gp_XYZ.hxx>
25 #include <Standard_Integer.hxx>
26 #include <Standard_Boolean.hxx>
27 #include <BRepMesh.hxx>
28
29 class gp_Circ2d;
30
31 //! Create sort and destroy the circles used in triangulation. <br>
32 class BRepMesh_CircleTool
33 {
34 public:
35
36   DEFINE_STANDARD_ALLOC
37   
38   //! Constructor.
39   //! @param theAllocator memory allocator to be used by internal structures.
40   Standard_EXPORT BRepMesh_CircleTool(
41   const Handle(NCollection_IncAllocator)& theAllocator);
42
43   //! Constructor.
44   //! @param theReservedSize size to be reserved for vector of circles.
45   //! @param theAllocator memory allocator to be used by internal structures.
46   Standard_EXPORT BRepMesh_CircleTool(
47     const Standard_Integer                  theReservedSize,
48     const Handle(NCollection_IncAllocator)& theAllocator);
49
50   //! Initializes the tool.
51   //! @param theReservedSize size to be reserved for vector of circles.
52   inline void Init(const Standard_Integer /*theReservedSize*/)
53   {
54     myTolerance = Precision::PConfusion() * Precision::PConfusion();
55   }
56
57   //! Sets new size for cell filter.
58   //! @param theSize cell size to be set for X and Y dimensions.
59   inline void SetCellSize(const Standard_Real theSize)
60   {
61     myCellFilter.Reset(theSize, myAllocator);
62   }
63
64   //! Sets new size for cell filter.
65   //! @param theSizeX cell size to be set for X dimension.
66   //! @param theSizeY cell size to be set for Y dimension.
67   inline void SetCellSize(const Standard_Real theSizeX,
68                           const Standard_Real theSizeY)
69   {
70     Standard_Real aCellSize[2] = { theSizeX, theSizeY };
71     myCellFilter.Reset(aCellSize, myAllocator);
72   }
73
74   //! Sets limits of inspection area.
75   //! @param theMin bottom left corner of inspection area.
76   //! @param theMax top right corner of inspection area.
77   inline void SetMinMaxSize(const gp_XY& theMin,
78                             const gp_XY& theMax)
79   {
80     myFaceMin = theMin;
81     myFaceMax = theMax;
82   }
83
84   //! Binds the circle to the tool.
85   //! @param theIndex index a circle should be bound with.
86   //! @param theCircle circle to be bound.
87   Standard_EXPORT void Bind(const Standard_Integer theIndex,
88                             const gp_Circ2d&       theCircle);
89
90   //! Computes circle on three points.
91   //! @param thePoint1 first point.
92   //! @param thePoint2 second point.
93   //! @param thePoint3 third point.
94   //! @param[out] theLocation center of computed circle.
95   //! @param[out] theRadius radius of computed circle.
96   //! @return FALSE in case of impossibility to build a circle 
97   //! on the given points, TRUE elsewhere.
98   Standard_EXPORT static Standard_Boolean MakeCircle(const gp_XY&   thePoint1,
99                                                      const gp_XY&   thePoint2,
100                                                      const gp_XY&   thePoint3,
101                                                      gp_XY&         theLocation,
102                                                      Standard_Real& theRadius);
103
104   //! Computes circle on three points and bind it to the tool.
105   //! @param theIndex index a circle should be bound with.
106   //! @param thePoint1 first point.
107   //! @param thePoint2 second point.
108   //! @param thePoint3 third point.
109   //! @return FALSE in case of impossibility to build a circle 
110   //! on the given points, TRUE elsewhere.
111   Standard_EXPORT Standard_Boolean Bind(const Standard_Integer theIndex,
112                                         const gp_XY&           thePoint1,
113                                         const gp_XY&           thePoint2,
114                                         const gp_XY&           thePoint3);
115
116   //! Binds implicit zero circle.
117   //! @param theIndex index a zero circle should be bound with.
118   Standard_EXPORT void MocBind(const Standard_Integer theIndex);
119
120   //! Deletes a circle from the tool.
121   //! @param theIndex index of a circle to be removed.
122   Standard_EXPORT void Delete(const Standard_Integer theIndex);
123
124   //! Select the circles shot by the given point.
125   //! @param thePoint bullet point.
126   Standard_EXPORT BRepMesh::ListOfInteger& Select(const gp_XY& thePoint);
127
128 private:
129
130   //! Creates circle with the given parameters and binds it to the tool.
131   //! @param theIndex index a circle should be bound with.
132   //! @param theLocation location of a circle.
133   //! @param theRadius radius of a circle.
134   void bind(const Standard_Integer theIndex,
135             const gp_XY&           theLocation,
136             const Standard_Real    theRadius);
137
138 private:
139
140   Standard_Real                     myTolerance;
141   Handle(NCollection_IncAllocator)  myAllocator;
142   BRepMesh::CircleCellFilter        myCellFilter;
143   BRepMesh_CircleInspector          mySelector;
144   gp_XY                             myFaceMax;
145   gp_XY                             myFaceMin;
146 };
147
148 #endif