0023258: Missing parenthesis
[occt.git] / src / IGESGeom / IGESGeom_ConicArc.cxx
CommitLineData
b311480e 1// Created by: CKY / Contract Toubro-Larsen
2// Copyright (c) 1993-1999 Matra Datavision
3// Copyright (c) 1999-2012 OPEN CASCADE SAS
4//
5// The content of this file is subject to the Open CASCADE Technology Public
6// License Version 6.5 (the "License"). You may not use the content of this file
7// except in compliance with the License. Please obtain a copy of the License
8// at http://www.opencascade.org and read it completely before using this file.
7fd59977 9//
b311480e 10// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
7fd59977 12//
b311480e 13// The Original Code and all software distributed under the License is
14// distributed on an "AS IS" basis, without warranty of any kind, and the
15// Initial Developer hereby disclaims all such warranties, including without
16// limitation, any warranties of merchantability, fitness for a particular
17// purpose or non-infringement. Please see the License for the specific terms
18// and conditions governing the rights and limitations under the License.
19
20//--------------------------------------------------------------------
7fd59977 21//--------------------------------------------------------------------
22//#59 rln 29.12.98 PRO17015
23
24#include <IGESGeom_ConicArc.ixx>
25#include <gp_Dir2d.hxx>
26#include <gp_GTrsf.hxx>
27
28
b311480e 29IGESGeom_ConicArc::IGESGeom_ConicArc () { }
7fd59977 30
31
32 void IGESGeom_ConicArc::Init
33 (const Standard_Real A, const Standard_Real B,
34 const Standard_Real C, const Standard_Real D, const Standard_Real E,
35 const Standard_Real F, const Standard_Real ZT, const gp_XY& aStart,
36 const gp_XY& anEnd)
37{
38 theA = A;
39 theB = B;
40 theC = C;
41 theD = D;
42 theE = E;
43 theF = F;
44 theZT = ZT;
45 theStart = aStart;
46 theEnd = anEnd;
47
48 Standard_Integer fn = FormNumber();
49 if (fn == 0) fn = ComputedFormNumber();
50 InitTypeAndForm(104,fn);
51}
52
53 Standard_Boolean IGESGeom_ConicArc::OwnCorrect ()
54{
55 Standard_Integer cfn = ComputedFormNumber();
56 if (FormNumber() == cfn) return Standard_False;
57 InitTypeAndForm(104,cfn);
58 return Standard_True;
59}
60
61 void IGESGeom_ConicArc::Equation
62 (Standard_Real& A, Standard_Real& B, Standard_Real& C, Standard_Real& D,
63 Standard_Real& E, Standard_Real& F) const
64{
65 A = theA;
66 B = theB;
67 C = theC;
68 D = theD;
69 E = theE;
70 F = theF;
71}
72
73 Standard_Real IGESGeom_ConicArc::ZPlane () const
74{
75 return theZT;
76}
77
78 gp_Pnt2d IGESGeom_ConicArc::StartPoint () const
79{
80 gp_Pnt2d start(theStart.X(), theStart.Y());
81 return start;
82}
83
84 gp_Pnt IGESGeom_ConicArc::TransformedStartPoint () const
85{
86 gp_XYZ start(theStart.X(), theStart.Y(), theZT);
87 if (HasTransf()) Location().Transforms(start);
88 gp_Pnt transStart(start);
89 return transStart;
90}
91
92 gp_Pnt2d IGESGeom_ConicArc::EndPoint () const
93{
94 gp_Pnt2d end(theEnd.X(), theEnd.Y());
95 return end;
96}
97
98 gp_Pnt IGESGeom_ConicArc::TransformedEndPoint () const
99{
100 gp_XYZ end(theEnd.X(), theEnd.Y(), theZT);
101 if (HasTransf()) Location().Transforms(end);
102 gp_Pnt transEnd(end);
103 return transEnd;
104}
105
106 Standard_Integer IGESGeom_ConicArc::ComputedFormNumber () const
107{
108 Standard_Real eps,eps2,eps4;
109 eps = 1.E-08; eps2 = eps*eps; eps4 = eps2*eps2;//#59 rln
110 Standard_Real Q1 = theA * (theC*theF - theE*theE/4.)
111 + theB/2. * (theE*theD/4. - theB*theF/2.)
112 + theD/2. * (theB*theE/4. - theC*theD/2.);
113 Standard_Real Q2 = theA*theC - theB*theB/4;
114 Standard_Real Q3 = theA + theC;
115
116// Resultats
117 //#59 rln 29.12.98 PRO17015 face#67, ellipse
118 //each Qi has its own dimension:
119 //[Q1] = L^-4, [Q2]=L^-4, [Q3]=L^-2
120 if (Q2 > eps4 && Q1*Q3 < 0 ) return 1; // Ellipse
121 if (Q2 < -eps4 && Abs (Q1) > eps4) return 2; // Hyperbola
122 if (Abs (Q2) <= eps4 && Abs (Q1) > eps4) return 3; // Parabola
123 return 0;
124}
125
126 Standard_Boolean IGESGeom_ConicArc::IsFromParabola () const
127{
128 Standard_Integer fn = FormNumber();
129 if (fn == 0) fn = ComputedFormNumber();
130 return (fn == 3);
131}
132
133 Standard_Boolean IGESGeom_ConicArc::IsFromEllipse () const
134{
135 Standard_Integer fn = FormNumber();
136 if (fn == 0) fn = ComputedFormNumber();
137 return (fn == 1);
138}
139
140 Standard_Boolean IGESGeom_ConicArc::IsFromHyperbola () const
141{
142 Standard_Integer fn = FormNumber();
143 if (fn == 0) fn = ComputedFormNumber();
144 return (fn == 2);
145}
146
147 Standard_Boolean IGESGeom_ConicArc::IsClosed () const
148{
149 return ((theStart.X() == theEnd.X()) && (theStart.Y() == theEnd.Y()));
150}
151
152 gp_Dir IGESGeom_ConicArc::Axis () const
153{
154 gp_Dir axis(0.0 , 0.0, 1.0);
155 return axis;
156}
157
158// Valeurs calculees
159
160 gp_Dir IGESGeom_ConicArc::TransformedAxis () const
161{
162 gp_XYZ axis(0.0 , 0.0, 1.0);
163 if (!HasTransf()) return gp_Dir(axis);
164 gp_GTrsf loc = Location();
165 loc.SetTranslationPart (gp_XYZ(0.,0.,0.));
166 loc.Transforms(axis);
167 return gp_Dir(axis);
168}
169
170
171 void IGESGeom_ConicArc::Definition
172 (gp_Pnt& Center, gp_Dir& MainAxis,
173 Standard_Real& Rmin, Standard_Real& Rmax) const
174{
175 Standard_Real Xcen,Ycen, Xax,Yax;
176 ComputedDefinition (Xcen,Ycen, Xax,Yax, Rmin,Rmax);
177 Center.SetCoord (Xcen,Ycen,theZT);
178 MainAxis.SetCoord (Xax,Yax,0.);
179}
180
181 void IGESGeom_ConicArc::TransformedDefinition
182 (gp_Pnt& Center, gp_Dir& MainAxis,
183 Standard_Real& Rmin, Standard_Real& Rmax) const
184{
185 if (!HasTransf()) {
186 Definition (Center,MainAxis,Rmin,Rmax);
187 return;
188 }
189 Standard_Real Xcen,Ycen, Xax,Yax;
190 ComputedDefinition (Xcen,Ycen, Xax,Yax, Rmin,Rmax);
191 gp_GTrsf loc = Location();
192 gp_XYZ cen (Xcen,Ycen,theZT);
193 gp_XYZ axis (Xax, Yax, 0.);
194 loc.Transforms (cen);
195 loc.SetTranslationPart (gp_XYZ(0.,0.,0.));
196 loc.Transforms (axis);
197 Center.SetCoord (cen.X(), cen.Y(), cen.Z() );
198 MainAxis.SetCoord (axis.X(),axis.Y(),axis.Z());
199}
200
201
202 void IGESGeom_ConicArc::ComputedDefinition
203 (Standard_Real& Xcen, Standard_Real& Ycen,
204 Standard_Real& Xax, Standard_Real& Yax,
205 Standard_Real& Rmin, Standard_Real& Rmax) const
206{
207 Standard_Real a,b,c,d,e,f;
208 // conic : a*x2 + 2*b*x*y + c*y2 + 2*d*x + 2*e*y + f = 0.
209 Equation (a,b,c,d,e,f);
210 b = b/2.; d = d/2.; e = e/2.; // chgt de variable
211
212 Standard_Real eps = 1.E-08; // ?? comme ComputedForm
213
214 if (IsFromParabola()) {
215 Rmin = Rmax = -1.; // rayons : yena pas
216 if ( (Abs(a) <= eps) && (Abs(b) <= eps)) {
217 Xcen = (f*c - e*e) /c /d /2.;
218 Ycen = e/c;
219 Standard_Real focal = -d/c;
220 Xax = (focal >= 0 ? 1. : -1.);
221 Yax = 0.;
222 Rmin = Rmax = Abs(focal);
223 }
224 else {
225 Standard_Real ss = a+c;
226 Standard_Real cc = - (a*d+b*e) / ss;
227 Standard_Real dd = d + (c*d - b*e) / ss;
228 Standard_Real fc = (a*e - b*d) / ss;
229 Standard_Real ee = e + fc;
230
231 Standard_Real dn = a*ee - dd*b;
232 Xcen = ( cc*ee + f*b) / dn;
233 Ycen = (-cc*dd - f*a) / dn;
234
c6541a0c 235 Standard_Real teta = M_PI/2.;
7fd59977 236 if (Abs(b) > eps) teta = ATan (-a/b);
c6541a0c 237 if (fc < 0) teta += M_PI;
7fd59977 238 Xax = Cos(teta);
239 Yax = Sin(teta);
240
241 Rmin = Rmax = Abs(fc)/sqrt(a*a+b*b)/2.;
242 }
243 }
244
245 else {
246 // -> Conique a centre, cas general
247 // On utilise les Determinants des matrices :
248 // | a b d |
249 // gdet (3x3) = | b c e | et pdet (2X2) = | a b |
250 // | d e f | | b c |
251
252 Standard_Real gdet = a*c*f + 2*b*d*e - c*d*d - a*e*e - b*b*f;
253 Standard_Real pdet = a*c - b*b;
254
255 Xcen = (b*e - c*d) / pdet;
256 Ycen = (b*d - a*e) / pdet;
257
258 Standard_Real term1 = a-c;
259 Standard_Real term2 = 2*b;
260 Standard_Real cos2t;
261 Standard_Real auxil;
262
263 if (Abs(term2)<= eps && Abs(term1)<= eps) {
264 cos2t = 1.;
265 auxil = 0.;
266 }
267 else {
268 Standard_Real t2d = term2/term1; //skl 28.12.2001
269 cos2t = 1./sqrt(1+t2d*t2d);
270 auxil = sqrt (term1*term1 + term2*term2);
271 }
272
273 Standard_Real cost = sqrt ( (1+cos2t)/2. );
274 Standard_Real sint = sqrt ( (1-cos2t)/2. );
275
276 Standard_Real aprim = (a+c+auxil)/2.;
277 Standard_Real cprim = (a+c-auxil)/2.;
278
279 term1 = -gdet/(aprim*pdet);
280 term2 = -gdet/(cprim*pdet);
281
282 if (IsFromEllipse()) {
283 Xax = cost;
284 Yax = sint;
285 Rmin = sqrt ( term1);
286 Rmax = sqrt ( term2);
287 if(Rmax<Rmin){ //skl 28.12.2001
288 Rmax = sqrt ( term1);
289 Rmin = sqrt ( term2);
290 }
291 }
292 else if (term1 <= eps){
293 Xax = -sint;
294 Yax = cost;
295 Rmin = sqrt (-term1);
296 Rmax = sqrt (term2);
297 }
298 else {
299 Xax = cost;
300 Yax = sint;
301 Rmin = sqrt (-term2);
302 Rmax = sqrt (term1);
303 }
304 }
305}