ce0857a370ce8fc8e08d621a3f73dce4774c033d
[occt.git] / src / IntAna / IntAna_Quadric.cxx
1 // Created on: 1992-07-01
2 // Created by: Laurent BUCHARD
3 // Copyright (c) 1992-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 #ifndef OCCT_DEBUG
18 #define No_Standard_RangeError
19 #define No_Standard_OutOfRange
20 #endif
21
22
23 #include <gp_Ax3.hxx>
24 #include <gp_Cone.hxx>
25 #include <gp_Cylinder.hxx>
26 #include <gp_Pln.hxx>
27 #include <gp_Sphere.hxx>
28 #include <gp_Trsf.hxx>
29 #include <gp_Vec.hxx>
30 #include <IntAna_Quadric.hxx>
31
32 //----------------------------------------------------------------------
33 //-- 
34 //--  Equation generale des quadriques :  
35 //-- 
36 //--   f(x,y,z) =       CXX X**2  + CYY Y**2  + CZZ Z**2
37 //--              
38 //--             + 2 (  CXY X Y   + CXZ X Z   + CYZ Y Z )
39 //-- 
40 //--             + 2 (  CX  X     + CY  Y     + CZ  Z)
41 //-- 
42 //--             + CCte
43 //-- 
44 //-- 
45 //----------------------------------------------------------------------
46 //----------------------------------------------------------------------
47 //-- Quadric Vide
48 //----------------------------------------------------------------------
49 IntAna_Quadric::IntAna_Quadric(void) {
50   CXX=CYY=CZZ=CXY=CXZ=CYZ=CX=CY=CZ=0.0;   CCte=1.0;
51 }
52 //----------------------------------------------------------------------
53 //-- Pln  -----> Quadric
54 //-- 
55 //-- Coefficients sur gp_Pln retourne A,B,C,D 
56 //--              avec f(x,y,z)  =    A x    + B y   +  C z   + D 
57 //-- 
58 //--  que l on identifie a        2(  CX x   + CY y  +  CZ z ) + CCte
59 //----------------------------------------------------------------------
60 void IntAna_Quadric::SetQuadric(const gp_Pln& P) {
61   P.Coefficients(CX,CY,CZ,CCte);
62   CX*=0.5; 
63   CY*=0.5;
64   CZ*=0.5;
65   CXX=CYY=CZZ=CXY=CXZ=CYZ=0.0;
66 }
67
68 IntAna_Quadric::IntAna_Quadric(const gp_Pln& P) {
69   P.Coefficients(CX,CY,CZ,CCte);  
70   CX*=0.5; 
71   CY*=0.5;
72   CZ*=0.5;
73   CXX=CYY=CZZ=CXY=CXZ=CYZ=0.0;
74 }
75 //----------------------------------------------------------------------
76 //-- Cylinder -----> Quadric
77 //----------------------------------------------------------------------
78 void IntAna_Quadric::SetQuadric(const gp_Cylinder& Cyl) {
79   Cyl.Coefficients(CXX,CYY,CZZ,CXY,CXZ,CYZ,CX,CY,CZ,CCte);  
80 }
81
82 IntAna_Quadric::IntAna_Quadric(const gp_Cylinder& Cyl) {
83   Cyl.Coefficients(CXX,CYY,CZZ,CXY,CXZ,CYZ,CX,CY,CZ,CCte);  
84 }
85 //----------------------------------------------------------------------
86 //-- Cone -----> Quadric
87 //----------------------------------------------------------------------
88 IntAna_Quadric::IntAna_Quadric(const gp_Cone& Cone) {
89   Cone.Coefficients(CXX,CYY,CZZ,CXY,CXZ,CYZ,CX,CY,CZ,CCte);  
90 }
91
92 void IntAna_Quadric::SetQuadric(const gp_Cone& Cone) {
93   Cone.Coefficients(CXX,CYY,CZZ,CXY,CXZ,CYZ,CX,CY,CZ,CCte);  
94 }
95 //----------------------------------------------------------------------
96 //-- Sphere -----> Quadric
97 //----------------------------------------------------------------------
98 void IntAna_Quadric::SetQuadric(const gp_Sphere& Sph) {
99   Sph.Coefficients(CXX,CYY,CZZ,CXY,CXZ,CYZ,CX,CY,CZ,CCte);
100 }
101
102 IntAna_Quadric::IntAna_Quadric(const gp_Sphere& Sph) {
103   Sph.Coefficients(CXX,CYY,CZZ,CXY,CXZ,CYZ,CX,CY,CZ,CCte);
104 }
105 //----------------------------------------------------------------------
106 //-- Returns the Coefficients of the Quadric
107 //----------------------------------------------------------------------
108 void IntAna_Quadric::Coefficients(Standard_Real& _CXX,Standard_Real& _CYY,Standard_Real& _CZZ,
109                                   Standard_Real& _CXY,Standard_Real& _CXZ,Standard_Real& _CYZ,
110                                   Standard_Real& _CX, Standard_Real& _CY, Standard_Real& _CZ,
111                                   Standard_Real& _CCte) const 
112 {
113   _CXX=CXX; _CYY=CYY; _CZZ=CZZ;
114   _CXY=CXY; _CXZ=CXZ; _CYZ=CYZ;
115   _CX=CX;   _CY=CY;   _CZ=CZ;
116   _CCte=CCte;
117 }
118 //----------------------------------------------------------------------
119 //-- Computes the Coefficients in a new coordinate system
120 //----------------------------------------------------------------------
121 void IntAna_Quadric::NewCoefficients( Standard_Real& _CXX,Standard_Real& _CYY,Standard_Real& _CZZ
122                                      ,Standard_Real& _CXY,Standard_Real& _CXZ,Standard_Real& _CYZ
123                                      ,Standard_Real& _CX, Standard_Real& _CY, Standard_Real& _CZ
124                                      ,Standard_Real& _CCte
125                                      ,const gp_Ax3& Axis) const 
126 {
127   Standard_Real t11,t12,t13,t14;                  // x = t11 X + t12 Y + t13 Z + t14
128   Standard_Real t21,t22,t23,t24;                  // y = t21 X + t22 Y + t23 Z + t24
129   Standard_Real t31,t32,t33,t34;                  // z = t31 X + t32 Y + t33 Z + t34
130                                  
131                                                   //   = X DirX + Y DirY + Z DirZ + Loc
132   
133   Standard_Real Cxx,Cyy,Czz,Cxy,Cxz,Cyz,Cx,Cy,Cz,Ccte;            
134   
135   gp_Trsf Trans;
136   Trans.SetTransformation(Axis);
137   Trans.Invert();
138   t11=Trans.Value(1,1);  t12=Trans.Value(1,2); t13=Trans.Value(1,3); t14=Trans.Value(1,4);
139   t21=Trans.Value(2,1);  t22=Trans.Value(2,2); t23=Trans.Value(2,3); t24=Trans.Value(2,4);
140   t31=Trans.Value(3,1);  t32=Trans.Value(3,2); t33=Trans.Value(3,3); t34=Trans.Value(3,4);
141   
142   
143   //      P0(x,y,z)=_CXX x x + _CYY y y + ... + _CCte =0  (x,y,z "absolute" coordinates)
144   // and  P1(X(x,y,z),Y(x,y,z),Z(x,y,z))=P0(x,y,z)
145   //
146   // with P1(X,Y,Z)= Cxx X X + Cyy Y Y + Czz Z Z + 2 Cxy X Y ... + Ccte
147   //               = _CXX  x x + _CYY  y y  +  ...  +  _CCte
148   
149   Standard_Real t11_P2=t11*t11;  Standard_Real t21_P2=t21*t21;  Standard_Real t31_P2=t31*t31;
150   Standard_Real t12_P2=t12*t12;  Standard_Real t22_P2=t22*t22;  Standard_Real t32_P2=t32*t32;
151   Standard_Real t13_P2=t13*t13;  Standard_Real t23_P2=t23*t23;  Standard_Real t33_P2=t33*t33;
152   Standard_Real t14_P2=t14*t14;  Standard_Real t24_P2=t24*t24;  Standard_Real t34_P2=t34*t34;
153
154   Ccte = ((_CCte) 
155           + t14_P2* (_CXX) 
156           + t24_P2* (_CYY) 
157           + t34_P2* (_CZZ)
158           + 2.0 * ( t14*( (_CX) 
159                          +t24* (_CXY) 
160                          +t34* (_CXZ))
161                    +t24*( (_CY) 
162                          +t34* (_CYZ))
163                    +t34* (_CZ)));
164   
165   Cxx = (  t11_P2* (_CXX) 
166          + t21_P2* (_CYY)
167          + t31_P2* (_CZZ)
168          + 2.0*( t11*( t21* (_CXY) 
169                       +t31* (_CXZ))
170                 +t21*t31* (_CYZ)));
171   
172   Cyy = (t12_P2* (_CXX) 
173          + t22_P2* (_CYY) 
174          + t32_P2* (_CZZ)
175          + 2.0*( t12*( t22* (_CXY) 
176                       +t32* (_CXZ))
177                 +t22*t32* (_CYZ)));
178
179   Czz = (t13_P2* (_CXX) 
180          + t33_P2* (_CZZ)
181          + t23_P2* (_CYY) 
182          + 2.0*( t13*( t23* (_CXY) 
183                       +t33* (_CXZ))
184                 +t23*t33* (_CYZ)));
185
186   Cz = (t13* (_CX) 
187         + t13*( t14* (_CXX) 
188                + t24* (_CXY) 
189                + t34* (_CXZ))
190         + t14*( t23* (_CXY) 
191                +t33* (_CXZ))
192         + t23*( (_CY) 
193                +t24* (_CYY) 
194                +t34* (_CYZ))
195         + t33*( t24* (_CYZ) 
196                +(_CZ)  
197                + t34* (_CZZ)));
198
199   Cx = (t11* ((_CX) 
200               +t14* (_CXX) 
201               +t24* (_CXY) 
202               +t34* (_CXZ))
203         + t14*( t21* (_CXY) 
204                +t31* (_CXZ))
205         + t21*( (_CY) 
206                +t24* (_CYY)
207                +t34* (_CYZ))
208         + t31*( t24* (_CYZ) 
209                +(_CZ)
210                +t34* (_CZZ)));
211
212   Cxy = (t11*( t12* (_CXX) 
213               +t22* (_CXY) 
214               +t32* (_CXZ))
215          + t12*( t21* (_CXY) 
216                 +t31* (_CXZ))
217          + t21*( t22* (_CYY) 
218                 +t32* (_CYZ))
219          + t31*( t22* (_CYZ) 
220                 +t32* (_CZZ)));
221
222   Cxz = (t11*( t13* (_CXX) 
223               +t23* (_CXY) 
224               +t33* (_CXZ))
225          + t13*( t21* (_CXY) 
226                 +t31* (_CXZ))
227          + t21*( t23* (_CYY) 
228                 +t33* (_CYZ))
229          + t31*( t23* (_CYZ) 
230                 +t33* (_CZZ)));
231
232   Cy = (t12* ( (_CX) 
233               +t14* (_CXX) 
234               +t24* (_CXY) 
235               +t34* (_CXZ))
236         + t14*( t22* (_CXY) 
237                +t32* (_CXZ))
238         + t22*( (_CY) 
239                +t24* (_CYY) 
240                +t34* (_CYZ))
241         + t32*( (_CZ) 
242                + t24* (_CYZ) 
243                + t34* (_CZZ)));
244
245   Cyz = (t12*( t13* (_CXX) 
246               +t23* (_CXY) 
247               +t33* (_CXZ))
248          + t13*( t22* (_CXY) 
249                 +t32* (_CXZ))
250          + t22*( t23* (_CYY) 
251                 +t33* (_CYZ))
252          + t32*( t23* (_CYZ) 
253                 +t33* (_CZZ)));
254   
255
256   _CXX=Cxx; _CYY=Cyy; _CZZ=Czz;   _CX=Cx;   _CY=Cy;   _CZ=Cz;
257   _CXY=Cxy; _CXZ=Cxz; _CYZ=Cyz;  _CCte=Ccte; 
258
259
260 }
261