0025547: static class mehtods not exported in BrepMesh_GeomTool
[occt.git] / src / BRepMesh / BRepMesh_GeomTool.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_GeomTool_HeaderFile
15 #define _BRepMesh_GeomTool_HeaderFile
16
17 #include <Standard.hxx>
18 #include <Standard_DefineAlloc.hxx>
19 #include <Standard_Macro.hxx>
20 #include <GCPnts_TangentialDeflection.hxx>
21 #include <GeomAbs_IsoType.hxx>
22 #include <Handle_BRepAdaptor_HSurface.hxx>
23 #include <TopoDS_Edge.hxx>
24
25 class BRepAdaptor_Curve;
26 class BRepAdaptor_HSurface;
27 class gp_Pnt;
28 class gp_Pnt2d;
29 class gp_Dir;
30
31 //! Tool class accumulating common geometrical functions as well as 
32 //! functionality using shape geometry to produce data necessary for 
33 //! tessellation.
34 //! General aim is to calculate discretization points for the given
35 //! curve or iso curve of surface according to the specified parameters.
36 class BRepMesh_GeomTool
37 {
38 public:
39
40   //! Enumerates states of segments intersection check.
41   enum IntFlag
42   {
43     NoIntersection,
44     Cross,
45     EndPointTouch,
46     PointOnSegment,
47     Glued,
48     Same
49   };
50
51 public:
52
53   DEFINE_STANDARD_ALLOC
54   
55   //! Constructor.
56   //! Initiates discretization of the given geometric curve.
57   //! @param theCurve curve to be discretized.
58   //! @param theFirstParam first parameter of the curve.
59   //! @param theLastParam last parameter of the curve.
60   //! @param theLinDeflection linear deflection.
61   //! @param theAngDeflection angular deflection.
62   //! @param theMinPointsNb minimum nuber of points to be produced.
63   Standard_EXPORT BRepMesh_GeomTool(const BRepAdaptor_Curve& theCurve,
64                                     const Standard_Real      theFirstParam,
65                                     const Standard_Real      theLastParam,
66                                     const Standard_Real      theLinDeflection,
67                                     const Standard_Real      theAngDeflection,
68                                     const Standard_Integer   theMinPointsNb = 2);
69   
70   //! Constructor.
71   //! Initiates discretization of geometric curve corresponding 
72   //! to iso curve of the given surface.
73   //! @param theSurface surface the iso curve to be taken from.
74   //! @param theIsoType type of iso curve to be used, U or V.
75   //! @param theParamIso parameter on the surface specifying the iso curve.
76   //! @param theFirstParam first parameter of the curve.
77   //! @param theLastParam last parameter of the curve.
78   //! @param theLinDeflection linear deflection.
79   //! @param theAngDeflection angular deflection.
80   //! @param theMinPointsNb minimum nuber of points to be produced.
81   Standard_EXPORT BRepMesh_GeomTool(const Handle(BRepAdaptor_HSurface)& theSurface,
82                                     const GeomAbs_IsoType               theIsoType,
83                                     const Standard_Real                 theParamIso,
84                                     const Standard_Real                 theFirstParam,
85                                     const Standard_Real                 theLastParam,
86                                     const Standard_Real                 theLinDeflection,
87                                     const Standard_Real                 theAngDeflection,
88                                     const Standard_Integer              theMinPointsNb = 2);
89
90   //! Adds point to already calculated points (or replaces existing).
91   //! @param thePoint point to be added.
92   //! @param theParam parameter on the curve corresponding to the given point.
93   //! @param theIsReplace if TRUE replaces existing point lying within 
94   //! parameteric tolerance of the given point.
95   //! @return index of new added point or found with parametric tolerance
96   inline Standard_Integer AddPoint(const gp_Pnt&           thePoint,
97                                    const Standard_Real     theParam,
98                                    const Standard_Boolean  theIsReplace = Standard_True)
99   {
100     return myDiscretTool.AddPoint(thePoint, theParam, theIsReplace);
101   }
102   
103   //! Returns number of discretization points.
104   inline Standard_Integer NbPoints() const
105   {
106     return myDiscretTool.NbPoints();
107   }
108   
109   //! Gets parameters of discretization point with the given index.
110   //! @param theIndex index of discretization point.
111   //! @param theIsoParam parameter on surface to be used as second coordinate 
112   //! of resulting 2d point.
113   //! @param theParam[out] parameter of the point on the iso curve.
114   //! @param thePoint[out] discretization point.
115   //! @param theUV[out] discretization point in parametric space of the surface.
116   //! @return TRUE on success, FALSE elsewhere.
117   Standard_EXPORT Standard_Boolean Value(const Standard_Integer theIndex,
118                                          const Standard_Real    theIsoParam,
119                                          Standard_Real&         theParam,
120                                          gp_Pnt&                thePoint,
121                                          gp_Pnt2d&              theUV) const;
122   
123   //! Gets parameters of discretization point with the given index.
124   //! @param theIndex index of discretization point.
125   //! @param theSurface surface the curve is lying onto.
126   //! @param theParam[out] parameter of the point on the curve.
127   //! @param thePoint[out] discretization point.
128   //! @param theUV[out] discretization point in parametric space of the surface.
129   //! @return TRUE on success, FALSE elsewhere.
130   Standard_EXPORT Standard_Boolean Value(const Standard_Integer              theIndex,
131                                          const Handle(BRepAdaptor_HSurface)& theSurface,
132                                          Standard_Real&                      theParam,
133                                          gp_Pnt&                             thePoint,
134                                          gp_Pnt2d&                           theUV) const;
135   
136 public: //! @name static API
137
138   //! Computes normal to the given surface at the specified
139   //! position in parametric space.
140   //! @param theSurface surface the normal should be found for.
141   //! @param theParamU U parameter in parametric space of the surface.
142   //! @param theParamV V parameter in parametric space of the surface.
143   //! @param[out] thePoint 3d point corresponding to the given parameters.
144   //! @param[out] theNormal normal vector at the point specified by the parameters.
145   //! @return FALSE if the normal can not be computed, TRUE elsewhere.
146   Standard_EXPORT static Standard_Boolean Normal(
147     const Handle(BRepAdaptor_HSurface)& theSurface,
148     const Standard_Real                 theParamU,
149     const Standard_Real                 theParamV,
150     gp_Pnt&                             thePoint,
151     gp_Dir&                             theNormal);
152
153   //! Checks intersection between two lines defined by two points.
154   //! @param theStartPnt1 start point of first line.
155   //! @param theEndPnt1 end point of first line.
156   //! @param theStartPnt2 start point of second line.
157   //! @param theEndPnt2 end point of second line.
158   //! @param[out] theIntPnt point of intersection.
159   //! @param[out] theParamOnSegment parameters of intersection point 
160   //! corresponding to first and second segment.
161   //! @return status of intersection check.
162   Standard_EXPORT static IntFlag IntLinLin(
163     const gp_XY&  theStartPnt1,
164     const gp_XY&  theEndPnt1,
165     const gp_XY&  theStartPnt2,
166     const gp_XY&  theEndPnt2,
167     gp_XY&        theIntPnt,
168     Standard_Real (&theParamOnSegment)[2]);
169
170   //! Checks intersection between the two segments. 
171   //! Checks that intersection point lies within ranges of both segments.
172   //! @param theStartPnt1 start point of first segment.
173   //! @param theEndPnt1 end point of first segment.
174   //! @param theStartPnt2 start point of second segment.
175   //! @param theEndPnt2 end point of second segment.
176   //! @param isConsiderEndPointTouch if TRUE EndPointTouch status will be
177   //! returned in case if segments are touching by end points, if FALSE
178   //! returns NoIntersection flag.
179   //! @param isConsiderPointOnSegment if TRUE PointOnSegment status will be
180   //! returned in case if end point of one segment lies onto another one, 
181   //! if FALSE returns NoIntersection flag.
182   //! @param[out] theIntPnt point of intersection.
183   //! @return status of intersection check.
184   Standard_EXPORT static IntFlag IntSegSeg(
185     const gp_XY&           theStartPnt1,
186     const gp_XY&           theEndPnt1,
187     const gp_XY&           theStartPnt2,
188     const gp_XY&           theEndPnt2,
189     const Standard_Boolean isConsiderEndPointTouch,
190     const Standard_Boolean isConsiderPointOnSegment,
191     gp_Pnt2d&              theIntPnt);
192
193 private:
194
195   //! Classifies the point in case of coincidence of two vectors.
196   //! @param thePoint1 the start point of a segment (base point).
197   //! @param thePoint2 the end point of a segment.
198   //! @param thePointToCheck the point to classify.
199   //! @return zero value if point is out of segment and non zero value 
200   //! if point is between the first and the second point of segment.
201   static Standard_Integer classifyPoint (const gp_XY& thePoint1,
202                                          const gp_XY& thePoint2,
203                                          const gp_XY& thePointToCheck);
204
205 private:
206
207   const TopoDS_Edge*                  myEdge;
208   GCPnts_TangentialDeflection         myDiscretTool;
209   GeomAbs_IsoType                     myIsoType;
210 };
211
212 #endif