0031642: Visualization - crash in Graphic3d_Structure::SetVisual() on redisplaying...
[occt.git] / src / GeomFill / GeomFill_FunctionDraft.cxx
1 // Created on: 1998-04-27
2 // Created by: Stephanie HUMEAU
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <Adaptor3d_HCurve.hxx>
19 #include <Adaptor3d_HSurface.hxx>
20 #include <GeomAdaptor_HCurve.hxx>
21 #include <GeomAdaptor_HSurface.hxx>
22 #include <GeomFill_FunctionDraft.hxx>
23 #include <GeomFill_Tensor.hxx>
24 #include <gp_Pnt.hxx>
25 #include <gp_Vec.hxx>
26 #include <math_Matrix.hxx>
27
28 //#include <Precision.hxx>
29 //*******************************************************
30 //   Calcul de la valeur de la fonction :
31 //                      G(w(t)) - S(u(t),v(t)) = 0
32 //  ou     G = generatrice   et   S = surface d'arret
33 //   et de ses derivees
34 //*******************************************************
35 //*******************************************************
36 // Function : FunctionDraft
37 // Purpose : Initialisation de la section et de la surface d'arret
38 //*******************************************************
39 GeomFill_FunctionDraft::GeomFill_FunctionDraft
40   (const Handle(Adaptor3d_HSurface)& S, const Handle(Adaptor3d_HCurve)& C)
41 {
42   TheCurve = C ;
43   TheSurface = S;
44 }
45
46 //*******************************************************
47 // Function : NbVariables (t, u, v)
48 // Purpose :
49 //*******************************************************
50  Standard_Integer GeomFill_FunctionDraft::NbVariables()const 
51 {
52   return 3;
53 }
54
55 //*******************************************************
56 // Function : NbEquations
57 // Purpose :
58 //*******************************************************
59  Standard_Integer GeomFill_FunctionDraft::NbEquations()const
60 {
61   return 3;
62 }
63
64 //*******************************************************
65 // Function : Value
66 // Purpose : calcul of the value of the function at <X>
67 //*******************************************************
68  Standard_Boolean GeomFill_FunctionDraft::Value(const math_Vector& X,
69                                                 math_Vector& F) 
70 {
71   gp_Pnt P,P1;
72   TheCurve->D0(X(1), P);
73   TheSurface->D0(X(2), X(3), P1);
74
75   F(1) = P.Coord(1) - P1.Coord(1);
76   F(2) = P.Coord(2) - P1.Coord(2);
77   F(3) = P.Coord(3) - P1.Coord(3);
78
79   return Standard_True;
80 }
81
82 //*******************************************************
83 // Function : Derivatives
84 // Purpose :calcul of the derivative of the function
85 //*******************************************************
86  Standard_Boolean GeomFill_FunctionDraft::Derivatives(const math_Vector& X,
87                                                       math_Matrix& D) 
88 {
89   Standard_Integer i;
90   gp_Pnt P,P1;
91   gp_Vec DP,DP1U,DP1V;
92   TheCurve->D1(X(1),P,DP);
93   TheSurface->D1(X(2),X(3),P1,DP1U,DP1V);
94
95   for (i=1;i<=3;i++)
96     {
97       D(i,1) = DP.Coord(i);  
98       D(i,2) = -DP1U.Coord(i);
99       D(i,3) = -DP1V.Coord(i);
100     }
101   return Standard_True;
102 }
103
104 //*******************************************************
105 // Function : Values
106 // Purpose : calcul of the value and the derivative of the function
107 //*******************************************************
108  Standard_Boolean GeomFill_FunctionDraft::Values(const math_Vector& X,
109                                                 math_Vector& F,
110                                                 math_Matrix& D) 
111
112   Standard_Integer i;
113   gp_Pnt P,P1;
114   gp_Vec DP,DP1U,DP1V;
115   TheCurve->D1(X(1),P,DP); //derivee de la generatrice
116   TheSurface->D1(X(2),X(3),P1,DP1U,DP1V); //derivee de la new surface
117
118   for (i=1;i<=3;i++)
119     { 
120       F(i) = P.Coord(i) - P1.Coord(i);
121
122       D(i,1) = DP.Coord(i);  
123       D(i,2) = -DP1U.Coord(i);
124       D(i,3) = -DP1V.Coord(i);
125     }
126
127   return Standard_True;
128 }
129
130 //*******************************************************
131 // Function : DerivT
132 // Purpose : calcul of the first derivative from t 
133 //*******************************************************
134  Standard_Boolean GeomFill_FunctionDraft::DerivT(const Handle(Adaptor3d_HCurve)& C,
135                                                 const Standard_Real Param,
136                                                 const Standard_Real W,
137                                                 const gp_Vec & dN,
138                                                 const Standard_Real teta,
139                                                 math_Vector& F) 
140
141
142   gp_Pnt P;
143   gp_Vec DP;
144
145   C->D1(Param, P, DP); // derivee de la section
146
147   F(1) = DP.Coord(1) + W * dN.Coord(1) * Sin(teta);
148   F(2) = DP.Coord(2) + W * dN.Coord(2) * Sin(teta);
149   F(3) = DP.Coord(3) + W * dN.Coord(3) * Sin(teta);
150   
151   return Standard_True;
152 }
153
154 //*******************************************************
155 // Function : Deriv2T
156 // Purpose : calcul of the second derivatice from t
157 //*******************************************************
158  Standard_Boolean GeomFill_FunctionDraft::Deriv2T(const Handle(Adaptor3d_HCurve)& C,
159                                                  const Standard_Real Param,
160                                                  const Standard_Real W,
161                                                  const gp_Vec & d2N,
162                                                  const Standard_Real teta,
163                                                  math_Vector& F) 
164
165   gp_Pnt P;
166   gp_Vec DP,D2P;
167
168   C->D2(Param, P, DP, D2P); // derivee de la section
169
170   F(1) = D2P.Coord(1) + W * d2N.Coord(1) * Sin(teta);
171   F(2) = D2P.Coord(2) + W * d2N.Coord(2) * Sin(teta);
172   F(3) = D2P.Coord(3) + W * d2N.Coord(3) * Sin(teta);
173   
174   return Standard_True;
175 }
176
177 //*******************************************************
178 // Function : DerivTX
179 // Purpose : calcul of the second derivative from t and x
180 //*******************************************************
181  Standard_Boolean GeomFill_FunctionDraft::DerivTX(const gp_Vec & dN,
182                                                   const Standard_Real teta,
183                                                   math_Matrix& D) 
184
185 //  gp_Pnt P;
186 //  gp_Vec DP,D2P;
187
188   Standard_Integer i;
189   for (i=1;i<=3;i++)
190     {
191       D(i,1) = dN.Coord(i)*Sin(teta); //derivee / W
192       D(i,2) = 0.;  // derivee / U
193       D(i,3) = 0.;  // derivee / V
194     }
195
196   return Standard_True;
197 }
198
199 //*******************************************************
200 // Function : Deriv2X
201 // Purpose : calcul of the second derivative from x
202 //*******************************************************
203  Standard_Boolean GeomFill_FunctionDraft::Deriv2X(const math_Vector & X,
204                                                   GeomFill_Tensor& T) 
205
206   gp_Pnt P;
207   gp_Vec DPu,DPv;
208   gp_Vec D2Pu, D2Pv, D2Puv;
209   Standard_Integer i;
210
211   TheSurface->D2(X(2), X(3), P, DPu, DPv, D2Pu, D2Pv, D2Puv);
212  
213   T.Init(0.); // tenseur
214
215   for (i=1;i<=3;i++)
216     {
217       T(i,2,2) = -D2Pu.Coord(i);
218       T(i,3,2) = T(i,2,3) = -D2Puv.Coord(i);
219       T(i,3,3) = -D2Pv.Coord(i);
220     }
221
222   return Standard_True;
223 }
224
225
226