1 // Created on: 1993-06-03
2 // Created by: Jacques GOUSSARD
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <Contap_ArcFunction.ixx>
19 #include <Contap_HContTool.hxx>
20 #include <Contap_SurfProps.hxx>
21 #include <Contap_HCurve2dTool.hxx>
23 Contap_ArcFunction::Contap_ArcFunction ():
25 myType(Contap_ContourStd),
30 void Contap_ArcFunction::Set(const Handle(Adaptor3d_HSurface)& S)
34 Standard_Integer nbs = Contap_HContTool::NbSamplePoints(S);
40 for (i = 1; i <= nbs; i++) {
41 Contap_HContTool::SamplePoint(S,i,U,V);
42 // Adaptor3d_HSurfaceTool::D1(S,U,V,solpt,d1u,d1v);
43 // myMean = myMean + d1u.Crossed(d1v).Magnitude();
44 Contap_SurfProps::Normale(S,U,V,solpt,norm);
45 myMean = myMean + norm.Magnitude();
47 myMean = myMean / ((Standard_Real)nbs);
52 Standard_Boolean Contap_ArcFunction::Value (const Standard_Real U,
56 gp_Pnt2d pt2d(Contap_HCurve2dTool::Value(myArc,U));
57 // Adaptor3d_HSurfaceTool::D1(mySurf,pt2d.X(),pt2d.Y(),solpt,d1u,d1v);
58 // gp_Vec norm(d1u.Crossed(d1v));
60 Contap_SurfProps::Normale(mySurf,pt2d.X(),pt2d.Y(),solpt,norm);
63 case Contap_ContourStd:
65 F = (norm.Dot(myDir))/myMean;
68 case Contap_ContourPrs:
70 F = (norm.Dot(gp_Vec(myEye,solpt)))/myMean;
75 F = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
87 Standard_Boolean Contap_ArcFunction::Derivative (const Standard_Real U,
92 Standard_Real dfu =0.,dfv =0.;
93 // gp_Vec d1u,d1v,d2u,d2v,d2uv;
94 Contap_HCurve2dTool::D1(myArc,U,pt2d,d2d);
95 // Adaptor3d_HSurfaceTool::D2(mySurf,pt2d.X(),pt2d.Y(),solpt,d1u,d1v,d2u,d2v,d2uv);
97 Contap_SurfProps::NormAndDn(mySurf,pt2d.X(),pt2d.Y(),solpt,norm,dnu,dnv);
100 case Contap_ContourStd:
102 // dfu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
103 // dfv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
104 dfu = (dnu.Dot(myDir))/myMean;
105 dfv = (dnv.Dot(myDir))/myMean;
108 case Contap_ContourPrs:
110 gp_Vec Ep(myEye,solpt);
111 // dfu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
112 // dfv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
113 dfu = (dnu.Dot(Ep))/myMean;
114 dfv = (dnv.Dot(Ep))/myMean;
117 case Contap_DraftStd:
120 gp_Vec norm(d1u.Crossed(d1v).Normalized());
121 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
122 dfu = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
123 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
124 dfv = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
127 dfu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
128 dfv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
131 case Contap_DraftPrs:
136 D = d2d.X()*dfu + d2d.Y()*dfv;
137 return Standard_True;
140 Standard_Boolean Contap_ArcFunction::Values (const Standard_Real U,
146 Standard_Real dfu =0.,dfv =0.;
147 // gp_Vec d1u,d1v,d2u,d2v,d2uv;
148 Contap_HCurve2dTool::D1(myArc,U,pt2d,d2d);
149 // Adaptor3d_HSurfaceTool::D2(mySurf,pt2d.X(),pt2d.Y(),solpt,d1u,d1v,d2u,d2v,d2uv);
150 // gp_Vec norm(d1u.Crossed(d1v));
152 Contap_SurfProps::NormAndDn(mySurf,pt2d.X(),pt2d.Y(),solpt,norm,dnu,dnv);
155 case Contap_ContourStd:
157 F = (norm.Dot(myDir))/myMean;
158 // dfu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
159 // dfv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
160 dfu = (dnu.Dot(myDir))/myMean;
161 dfv = (dnv.Dot(myDir))/myMean;
164 case Contap_ContourPrs:
166 gp_Vec Ep(myEye,solpt);
167 F = (norm.Dot(Ep))/myMean;
168 // dfu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
169 // dfv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
170 dfu = (dnu.Dot(Ep))/myMean;
171 dfv = (dnv.Dot(Ep))/myMean;
174 case Contap_DraftStd:
176 F = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
179 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
180 dfu = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
181 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
182 dfv = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
184 dfu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
185 dfv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
188 case Contap_DraftPrs:
194 D = d2d.X()*dfu + d2d.Y()*dfv;
195 return Standard_True;
198 Standard_Integer Contap_ArcFunction::GetStateNumber ()
201 return seqpt.Length();
204 Standard_Integer Contap_ArcFunction::NbSamples () const
206 return Max(Max(Contap_HContTool::NbSamplesU(mySurf,0.,0.),
207 Contap_HContTool::NbSamplesV(mySurf,0.,0.)),
208 Contap_HContTool::NbSamplesOnArc(myArc));
211 //modified by NIZNHY-PKV Thu Mar 29 16:53:07 2001f
212 //=======================================================================
214 //purpose : returns empty Quadric
215 //=======================================================================
216 const IntSurf_Quadric& Contap_ArcFunction::Quadric() const
220 //modified by NIZNHY-PKV Thu Mar 29 16:53:09 2001t