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