1 // Created on: 1991-12-13
2 // Created by: Remi GILET
3 // Copyright (c) 1991-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 //=========================================================================
18 // Creation d un cercle tangent a deux elements : Droite. +
22 // centre sur un troisieme : Droite. +
25 //=========================================================================
27 #include <GccAna_Circ2d3Tan.hxx>
28 #include <GccEnt_BadQualifier.hxx>
29 #include <GccEnt_QualifiedCirc.hxx>
30 #include <GccEnt_QualifiedLin.hxx>
31 #include <Geom2dGcc_Circ2d3TanIter.hxx>
32 #include <Geom2dGcc_CurveTool.hxx>
33 #include <Geom2dGcc_FunctionTanCuCuCu.hxx>
34 #include <Geom2dGcc_QCurve.hxx>
36 #include <gp_Ax2d.hxx>
37 #include <gp_Circ2d.hxx>
38 #include <gp_Dir2d.hxx>
39 #include <gp_Pnt2d.hxx>
40 #include <gp_Vec2d.hxx>
41 #include <math_FunctionSetRoot.hxx>
42 #include <math_NewtonFunctionSetRoot.hxx>
43 #include <StdFail_NotDone.hxx>
45 Geom2dGcc_Circ2d3TanIter::
46 Geom2dGcc_Circ2d3TanIter (const Geom2dGcc_QCurve& Qualified1 ,
47 const Geom2dGcc_QCurve& Qualified2 ,
48 const Geom2dGcc_QCurve& Qualified3 ,
49 const Standard_Real Param1 ,
50 const Standard_Real Param2 ,
51 const Standard_Real Param3 ,
52 const Standard_Real Tolerance ) {
54 TheSame1 = Standard_False;
55 TheSame2 = Standard_False;
56 TheSame3 = Standard_False;
64 Standard_Real Tol = Abs(Tolerance);
65 WellDone = Standard_False;
66 qualifier1 = GccEnt_noqualifier;
67 qualifier2 = GccEnt_noqualifier;
68 qualifier3 = GccEnt_noqualifier;
69 if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() ||
70 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
71 !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() ||
72 Qualified2.IsOutside() || Qualified2.IsUnqualified()) ||
73 !(Qualified3.IsEnclosed() || Qualified3.IsEnclosing() ||
74 Qualified3.IsOutside() || Qualified3.IsUnqualified())) {
75 throw GccEnt_BadQualifier();
78 Geom2dAdaptor_Curve Cu1 = Qualified1.Qualified();
79 Geom2dAdaptor_Curve Cu2 = Qualified2.Qualified();
80 Geom2dAdaptor_Curve Cu3 = Qualified3.Qualified();
81 Geom2dGcc_FunctionTanCuCuCu Func(Cu1,Cu2,Cu3);
82 math_Vector Umin(1,3);
83 math_Vector Umax(1,3);
84 math_Vector Ufirst(1,3);
86 Umin(1) = Geom2dGcc_CurveTool::FirstParameter(Cu1);
87 Umin(2) = Geom2dGcc_CurveTool::FirstParameter(Cu2);
88 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu3);
89 Umax(1) = Geom2dGcc_CurveTool::LastParameter(Cu1);
90 Umax(2) = Geom2dGcc_CurveTool::LastParameter(Cu2);
91 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu3);
95 tol(1) = Geom2dGcc_CurveTool::EpsX(Cu1,Abs(Tolerance));
96 tol(2) = Geom2dGcc_CurveTool::EpsX(Cu2,Abs(Tolerance));
97 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu3,Abs(Tolerance));
98 math_FunctionSetRoot Root(Func, tol);
99 Root.Perform(Func, Ufirst, Umin, Umax);
102 Func.Value(Ufirst,Umin);
103 gp_Pnt2d point1,point2,point3;
104 gp_Vec2d Tan1,Tan2,Tan3;
105 Geom2dGcc_CurveTool::D1(Cu1,Ufirst(1),point1,Tan1);
106 Geom2dGcc_CurveTool::D1(Cu2,Ufirst(2),point2,Tan2);
107 Geom2dGcc_CurveTool::D1(Cu3,Ufirst(3),point3,Tan3);
108 GccAna_Circ2d3Tan circ(point1,point2,point3,Tol);
110 cirsol = circ.ThisSolution(1);
111 gp_Pnt2d centre = cirsol.Location();
112 Standard_Real normetan1 = Tan1.Magnitude();
113 Standard_Real normetan2 = Tan2.Magnitude();
114 Standard_Real normetan3 = Tan3.Magnitude();
115 gp_Vec2d Vec1(point1,centre);
116 gp_Vec2d Vec2(point2,centre);
117 gp_Vec2d Vec3(point3,centre);
118 Standard_Real normevec1 = Vec1.Magnitude();
119 Standard_Real normevec2 = Vec2.Magnitude();
120 Standard_Real normevec3 = Vec3.Magnitude();
121 Standard_Real dot1,dot2,dot3;
122 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
123 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
126 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
127 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
130 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
131 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
135 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
136 Standard_Real Angle1 = Vec1.Angle(Tan1);
137 if (Qualified1.IsUnqualified()||
138 (Qualified1.IsEnclosing()&&Angle1<=0.)||
139 (Qualified1.IsOutside() && Angle1 >= 0.) ||
140 (Qualified1.IsEnclosed() && Angle1 <= 0.)) {
141 Angle1 = Vec2.Angle(Tan2);
142 if (Qualified2.IsUnqualified() ||
143 (Qualified2.IsEnclosing()&&Angle1<=0.)||
144 (Qualified2.IsOutside() && Angle1 >= 0) ||
145 (Qualified2.IsEnclosed() && Angle1 <= 0.)) {
146 Angle1 = Vec3.Angle(Tan3);
147 if (Qualified3.IsUnqualified() ||
148 (Qualified3.IsEnclosing()&&Angle1<=0.)||
149 (Qualified3.IsOutside() && Angle1 >= 0) ||
150 (Qualified3.IsEnclosed() && Angle1 <= 0.)) {
151 qualifier1 = Qualified1.Qualifier();
152 qualifier2 = Qualified2.Qualifier();
153 qualifier3 = Qualified3.Qualifier();
159 par2sol = pnttg2sol.Distance(pnttg1sol);
162 par3sol = pnttg3sol.Distance(pnttg1sol);
163 WellDone = Standard_True;
172 Geom2dGcc_Circ2d3TanIter::
173 Geom2dGcc_Circ2d3TanIter (const GccEnt_QualifiedCirc& Qualified1 ,
174 const Geom2dGcc_QCurve& Qualified2 ,
175 const Geom2dGcc_QCurve& Qualified3 ,
176 const Standard_Real Param1 ,
177 const Standard_Real Param2 ,
178 const Standard_Real Param3 ,
179 const Standard_Real Tolerance ) {
181 TheSame1 = Standard_False;
182 TheSame2 = Standard_False;
183 TheSame3 = Standard_False;
191 Standard_Real Tol = Abs(Tolerance);
192 WellDone = Standard_False;
193 qualifier1 = GccEnt_noqualifier;
194 qualifier2 = GccEnt_noqualifier;
195 qualifier3 = GccEnt_noqualifier;
196 if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() ||
197 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
198 !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() ||
199 Qualified2.IsOutside() || Qualified2.IsUnqualified()) ||
200 !(Qualified3.IsEnclosed() || Qualified3.IsEnclosing() ||
201 Qualified3.IsOutside() || Qualified3.IsUnqualified())) {
202 throw GccEnt_BadQualifier();
205 gp_Circ2d C1 = Qualified1.Qualified();
206 Geom2dAdaptor_Curve Cu2 = Qualified2.Qualified();
207 Geom2dAdaptor_Curve Cu3 = Qualified3.Qualified();
208 Geom2dGcc_FunctionTanCuCuCu Func(C1,Cu2,Cu3);
209 math_Vector Umin(1,3);
210 math_Vector Umax(1,3);
211 math_Vector Ufirst(1,3);
212 math_Vector tol(1,3);
214 Umin(2) = Geom2dGcc_CurveTool::FirstParameter(Cu2);
215 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu3);
217 Umax(2) = Geom2dGcc_CurveTool::LastParameter(Cu2);
218 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu3);
222 tol(1) = 2.e-15*M_PI;
223 tol(2) = Geom2dGcc_CurveTool::EpsX(Cu2,Abs(Tolerance));
224 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu3,Abs(Tolerance));
225 math_FunctionSetRoot Root(Func, tol);
226 Root.Perform(Func, Ufirst, Umin, Umax);
229 Func.Value(Ufirst,Umin);
230 gp_Pnt2d centre1(C1.Location());
231 Standard_Real R1 = C1.Radius();
232 gp_Pnt2d point1(centre1.XY()+R1*gp_XY(Cos(Ufirst(1)),Sin(Ufirst(1))));
233 gp_Vec2d Tan1(gp_XY(-Sin(Ufirst(1)),Cos(Ufirst(1))));
234 gp_Pnt2d point2,point3;
235 // gp_Vec2d Tan2,Tan3,Nor2,Nor3;
237 Geom2dGcc_CurveTool::D1(Cu2,Ufirst(2),point2,Tan2);
238 Geom2dGcc_CurveTool::D1(Cu3,Ufirst(3),point3,Tan3);
239 GccAna_Circ2d3Tan circ(point1,point2,point3,Tol);
241 cirsol = circ.ThisSolution(1);
242 gp_Pnt2d centre(cirsol.Location());
243 Standard_Real dist = centre1.Distance(centre);
244 Standard_Real Rsol = cirsol.Radius();
245 Standard_Real normetan1 = Tan1.Magnitude();
246 Standard_Real normetan2 = Tan2.Magnitude();
247 Standard_Real normetan3 = Tan3.Magnitude();
248 gp_Vec2d Vec1(point1,centre);
249 gp_Vec2d Vec2(point2,centre);
250 gp_Vec2d Vec3(point3,centre);
251 Standard_Real normevec1 = Vec1.Magnitude();
252 Standard_Real normevec2 = Vec2.Magnitude();
253 Standard_Real normevec3 = Vec3.Magnitude();
254 Standard_Real dot1,dot2,dot3;
255 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
256 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
259 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
260 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
263 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
264 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
268 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
269 if (Qualified1.IsUnqualified() ||
270 (Qualified1.IsEnclosing() && Rsol >= R1 && dist <= Rsol)||
271 (Qualified1.IsOutside() && dist >= Rsol) ||
272 (Qualified1.IsEnclosed() && Rsol <= R1 && dist <= Rsol)) {
273 Standard_Real Angle1 = Vec2.Angle(Tan2);
274 if (Qualified2.IsUnqualified() ||
275 (Qualified2.IsEnclosing()&&Angle1<=0.)||
276 (Qualified2.IsOutside() && Angle1 >= 0) ||
277 (Qualified2.IsEnclosed() && Angle1 <= 0.)) {
278 Angle1 = Vec3.Angle(Tan3);
279 if (Qualified3.IsUnqualified() ||
280 (Qualified3.IsEnclosing()&&Angle1<=0.)||
281 (Qualified3.IsOutside() && Angle1 >= 0) ||
282 (Qualified3.IsEnclosed() && Angle1 <= 0.)) {
283 qualifier1 = Qualified1.Qualifier();
284 qualifier2 = Qualified2.Qualifier();
285 qualifier3 = Qualified3.Qualifier();
295 WellDone = Standard_True;
304 Geom2dGcc_Circ2d3TanIter::
305 Geom2dGcc_Circ2d3TanIter (const GccEnt_QualifiedCirc& Qualified1 ,
306 const GccEnt_QualifiedCirc& Qualified2 ,
307 const Geom2dGcc_QCurve& Qualified3 ,
308 const Standard_Real Param1 ,
309 const Standard_Real Param2 ,
310 const Standard_Real Param3 ,
311 const Standard_Real Tolerance ) {
313 TheSame1 = Standard_False;
314 TheSame2 = Standard_False;
315 TheSame3 = Standard_False;
323 Standard_Real Tol = Abs(Tolerance);
324 WellDone = Standard_False;
325 qualifier1 = GccEnt_noqualifier;
326 qualifier2 = GccEnt_noqualifier;
327 qualifier3 = GccEnt_noqualifier;
328 if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() ||
329 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
330 !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() ||
331 Qualified2.IsOutside() || Qualified2.IsUnqualified()) ||
332 !(Qualified3.IsEnclosed() || Qualified3.IsEnclosing() ||
333 Qualified3.IsOutside() || Qualified3.IsUnqualified())) {
334 throw GccEnt_BadQualifier();
337 gp_Circ2d C1 = Qualified1.Qualified();
338 gp_Circ2d C2 = Qualified2.Qualified();
339 Geom2dAdaptor_Curve Cu3 = Qualified3.Qualified();
340 Geom2dGcc_FunctionTanCuCuCu Func(C1,C2,Cu3);
341 math_Vector Umin(1,3);
342 math_Vector Umax(1,3);
343 math_Vector Ufirst(1,3);
344 math_Vector tol(1,3);
347 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu3);
350 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu3);
354 tol(1) = 2.e-15*M_PI;
355 tol(2) = 2.e-15*M_PI;
356 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu3,Abs(Tolerance));
357 math_FunctionSetRoot Root(Func, tol);
358 Root.Perform(Func, Ufirst, Umin, Umax);
361 Func.Value(Ufirst,Umin);
362 gp_Pnt2d centre1(C1.Location());
363 Standard_Real R1 = C1.Radius();
364 gp_Pnt2d point1(centre1.XY()+R1*gp_XY(Cos(Ufirst(1)),Sin(Ufirst(1))));
365 gp_Vec2d Tan1(gp_XY(-Sin(Ufirst(1)),Cos(Ufirst(1))));
366 gp_Pnt2d centre2(C2.Location());
367 Standard_Real R2 = C2.Radius();
368 gp_Pnt2d point2(centre2.XY()+R2*gp_XY(Cos(Ufirst(2)),Sin(Ufirst(2))));
369 gp_Vec2d Tan2(gp_XY(-Sin(Ufirst(2)),Cos(Ufirst(2))));
372 Geom2dGcc_CurveTool::D1(Cu3,Ufirst(3),point3,Tan3);
373 GccAna_Circ2d3Tan circ(point1,point2,point3,Tol);
375 cirsol = circ.ThisSolution(1);
376 gp_Pnt2d centre(cirsol.Location());
377 Standard_Real dist = centre1.Distance(centre);
378 Standard_Real Rsol = cirsol.Radius();
379 Standard_Real normetan1 = Tan1.Magnitude();
380 Standard_Real normetan2 = Tan2.Magnitude();
381 Standard_Real normetan3 = Tan3.Magnitude();
382 gp_Vec2d Vec1(point1,centre);
383 gp_Vec2d Vec2(point2,centre);
384 gp_Vec2d Vec3(point3,centre);
385 Standard_Real normevec1 = Vec1.Magnitude();
386 Standard_Real normevec2 = Vec2.Magnitude();
387 Standard_Real normevec3 = Vec3.Magnitude();
388 Standard_Real dot1,dot2,dot3;
389 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
390 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
393 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
394 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
397 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
398 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
402 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
403 if (Qualified1.IsUnqualified() ||
404 (Qualified1.IsEnclosing() && Rsol >= R1 && dist <= Rsol)||
405 (Qualified1.IsOutside() && dist >= Rsol) ||
406 (Qualified1.IsEnclosed() && Rsol <= R1 && dist <= Rsol)) {
407 dist = centre2.Distance(centre);
408 if (Qualified1.IsUnqualified() ||
409 (Qualified1.IsEnclosing() && Rsol >= R2 && dist <= Rsol)||
410 (Qualified1.IsOutside() && dist >= Rsol) ||
411 (Qualified1.IsEnclosed() && Rsol <= R2 && dist <= Rsol)) {
412 gp_Vec2d Vec(point3,centre);
413 Standard_Real Angle1 = Vec.Angle(Tan3);
414 if (Qualified3.IsUnqualified() ||
415 (Qualified3.IsEnclosing()&&Angle1<=0.)||
416 (Qualified3.IsOutside() && Angle1 >= 0) ||
417 (Qualified3.IsEnclosed() && Angle1 <= 0.)) {
418 qualifier1 = Qualified1.Qualifier();
419 qualifier2 = Qualified2.Qualifier();
420 qualifier3 = Qualified3.Qualifier();
430 WellDone = Standard_True;
439 Geom2dGcc_Circ2d3TanIter::
440 Geom2dGcc_Circ2d3TanIter (const GccEnt_QualifiedLin& Qualified1 ,
441 const Geom2dGcc_QCurve& Qualified2 ,
442 const Geom2dGcc_QCurve& Qualified3 ,
443 const Standard_Real Param1 ,
444 const Standard_Real Param2 ,
445 const Standard_Real Param3 ,
446 const Standard_Real Tolerance ) {
448 TheSame1 = Standard_False;
449 TheSame2 = Standard_False;
450 TheSame3 = Standard_False;
458 Standard_Real Tol = Abs(Tolerance);
459 WellDone = Standard_False;
460 qualifier1 = GccEnt_noqualifier;
461 qualifier2 = GccEnt_noqualifier;
462 qualifier3 = GccEnt_noqualifier;
463 if (!(Qualified1.IsEnclosed() ||
464 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
465 !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() ||
466 Qualified2.IsOutside() || Qualified2.IsUnqualified()) ||
467 !(Qualified3.IsEnclosed() || Qualified3.IsEnclosing() ||
468 Qualified3.IsOutside() || Qualified3.IsUnqualified())) {
469 throw GccEnt_BadQualifier();
472 gp_Lin2d L1 = Qualified1.Qualified();
473 Geom2dAdaptor_Curve Cu2 = Qualified2.Qualified();
474 Geom2dAdaptor_Curve Cu3 = Qualified3.Qualified();
475 Geom2dGcc_FunctionTanCuCuCu Func(L1,Cu2,Cu3);
476 math_Vector Umin(1,3);
477 math_Vector Umax(1,3);
478 math_Vector Ufirst(1,3);
479 math_Vector tol(1,3);
480 Umin(1) = RealFirst();
481 Umin(2) = Geom2dGcc_CurveTool::FirstParameter(Cu2);
482 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu3);
483 Umax(1) = RealLast();
484 Umax(2) = Geom2dGcc_CurveTool::LastParameter(Cu2);
485 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu3);
490 tol(2) = Geom2dGcc_CurveTool::EpsX(Cu2,Abs(Tolerance));
491 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu3,Abs(Tolerance));
492 math_FunctionSetRoot Root(Func, tol);
493 Root.Perform(Func, Ufirst, Umin, Umax);
496 Func.Value(Ufirst,Umin);
497 gp_Pnt2d centre1(L1.Location());
498 gp_Pnt2d point1(centre1.XY()+Ufirst(1)*L1.Direction().XY());
499 gp_Pnt2d point2,point3;
501 Geom2dGcc_CurveTool::D1(Cu2,Ufirst(2),point2,Tan2);
502 Geom2dGcc_CurveTool::D1(Cu3,Ufirst(3),point3,Tan3);
503 GccAna_Circ2d3Tan circ(point1,point2,point3,Tol);
505 cirsol = circ.ThisSolution(1);
506 gp_Pnt2d centre(cirsol.Location());
508 // creation vaariables intermediaires pour WNT
509 gp_XY dummy1 = centre.XY()-L1.Location().XY();
510 gp_XY dummy2 (-L1.Direction().Y(),L1.Direction().X());
511 Standard_Real pscal=dummy1.Dot(dummy2);
513 gp_Vec2d Tan1(L1.Direction().XY());
514 Standard_Real normetan1 = Tan1.Magnitude();
515 Standard_Real normetan2 = Tan2.Magnitude();
516 Standard_Real normetan3 = Tan3.Magnitude();
517 gp_Vec2d Vec1(point1,centre);
518 gp_Vec2d Vec2(point2,centre);
519 gp_Vec2d Vec3(point3,centre);
520 Standard_Real normevec1 = Vec1.Magnitude();
521 Standard_Real normevec2 = Vec2.Magnitude();
522 Standard_Real normevec3 = Vec3.Magnitude();
523 Standard_Real dot1,dot2,dot3;
524 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
525 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
528 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
529 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
532 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
533 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
537 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
538 if (Qualified1.IsUnqualified() ||
539 (Qualified1.IsOutside() && pscal <= 0.) ||
540 (Qualified1.IsEnclosed() && pscal >= 0.)) {
541 gp_Vec2d Vec(point2,centre);
542 Standard_Real Angle1 = Vec.Angle(Tan2);
543 if (Qualified2.IsUnqualified() ||
544 (Qualified2.IsEnclosing()&&Angle1<=0.)||
545 (Qualified2.IsOutside() && Angle1 >= 0) ||
546 (Qualified2.IsEnclosed() && Angle1 <= 0.)) {
547 Vec = gp_Vec2d(point3,centre);
548 Angle1 = Vec.Angle(Tan3);
549 if (Qualified3.IsUnqualified() ||
550 (Qualified3.IsEnclosing()&&Angle1<=0.)||
551 (Qualified3.IsOutside() && Angle1 >= 0) ||
552 (Qualified3.IsEnclosed() && Angle1 <= 0.)) {
553 qualifier1 = Qualified1.Qualifier();
554 qualifier2 = Qualified2.Qualifier();
555 qualifier3 = Qualified3.Qualifier();
565 WellDone = Standard_True;
574 Geom2dGcc_Circ2d3TanIter::
575 Geom2dGcc_Circ2d3TanIter (const GccEnt_QualifiedLin& Qualified1 ,
576 const GccEnt_QualifiedLin& Qualified2 ,
577 const Geom2dGcc_QCurve& Qualified3 ,
578 const Standard_Real Param1 ,
579 const Standard_Real Param2 ,
580 const Standard_Real Param3 ,
581 const Standard_Real Tolerance ){
583 TheSame1 = Standard_False;
584 TheSame2 = Standard_False;
585 TheSame3 = Standard_False;
593 Standard_Real Tol = Abs(Tolerance);
594 WellDone = Standard_False;
595 qualifier1 = GccEnt_noqualifier;
596 qualifier2 = GccEnt_noqualifier;
597 qualifier3 = GccEnt_noqualifier;
598 if (!(Qualified1.IsEnclosed() ||
599 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
600 !(Qualified2.IsEnclosed() ||
601 Qualified2.IsOutside() || Qualified2.IsUnqualified()) ||
602 !(Qualified3.IsEnclosed() || Qualified3.IsEnclosing() ||
603 Qualified3.IsOutside() || Qualified3.IsUnqualified())) {
604 throw GccEnt_BadQualifier();
607 gp_Lin2d L1 = Qualified1.Qualified();
608 gp_Lin2d L2 = Qualified2.Qualified();
609 Geom2dAdaptor_Curve Cu3 = Qualified3.Qualified();
610 Geom2dGcc_FunctionTanCuCuCu Func(L1,L2,Cu3);
611 math_Vector Umin(1,3);
612 math_Vector Umax(1,3);
613 math_Vector Ufirst(1,3);
614 math_Vector tol(1,3);
615 Umin(1) = RealFirst();
616 Umin(2) = RealFirst();
617 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu3);
618 Umax(1) = RealLast();
619 Umax(2) = RealLast();
620 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu3);
626 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu3,Abs(Tolerance));
627 math_FunctionSetRoot Root(Func, tol);
628 Root.Perform(Func, Ufirst, Umin, Umax);
631 Func.Value(Ufirst,Umin);
632 gp_Pnt2d centre1(L1.Location());
633 gp_Pnt2d point1(centre1.XY()+Ufirst(1)*L1.Direction().XY());
634 gp_Pnt2d centre2(L2.Location());
635 gp_Pnt2d point2(centre2.XY()+Ufirst(2)*L2.Direction().XY());
638 Geom2dGcc_CurveTool::D1(Cu3,Ufirst(3),point3,Tan3);
639 GccAna_Circ2d3Tan circ(point1,point2,point3,Tol);
641 cirsol = circ.ThisSolution(1);
642 gp_Pnt2d centre(cirsol.Location());
643 Standard_Real pscal=centre.XY().Dot(gp_XY(-L1.Direction().Y(),
644 L1.Direction().X()));
645 if (Qualified1.IsUnqualified() ||
646 (Qualified1.IsOutside() && pscal <= 0.) ||
647 (Qualified1.IsEnclosed() && pscal >= 0.)) {
648 gp_Vec2d Tan1(L1.Direction().XY());
649 gp_Vec2d Tan2(L2.Direction().XY());
650 Standard_Real normetan1 = Tan1.Magnitude();
651 Standard_Real normetan2 = Tan2.Magnitude();
652 Standard_Real normetan3 = Tan3.Magnitude();
653 gp_Vec2d Vec1(point1,centre);
654 gp_Vec2d Vec2(point2,centre);
655 gp_Vec2d Vec3(point3,centre);
656 Standard_Real normevec1 = Vec1.Magnitude();
657 Standard_Real normevec2 = Vec2.Magnitude();
658 Standard_Real normevec3 = Vec3.Magnitude();
659 Standard_Real dot1,dot2,dot3;
660 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
661 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
664 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
665 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
668 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
669 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
673 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
674 if (Qualified2.IsUnqualified() ||
675 (Qualified2.IsOutside() && pscal <= 0.) ||
676 (Qualified2.IsEnclosed() && pscal >= 0.)) {
677 Standard_Real Angle1 = Vec3.Angle(Tan3);
678 if (Qualified3.IsUnqualified() ||
679 (Qualified3.IsEnclosing()&&Angle1<=0.)||
680 (Qualified3.IsOutside() && Angle1 >= 0) ||
681 (Qualified3.IsEnclosed() && Angle1 <= 0.)) {
682 qualifier1 = Qualified1.Qualifier();
683 qualifier2 = Qualified2.Qualifier();
684 qualifier3 = Qualified3.Qualifier();
694 WellDone = Standard_True;
703 Geom2dGcc_Circ2d3TanIter::
704 Geom2dGcc_Circ2d3TanIter (const Geom2dGcc_QCurve& Qualified1 ,
705 const Geom2dGcc_QCurve& Qualified2 ,
706 const gp_Pnt2d& Point3 ,
707 const Standard_Real Param1 ,
708 const Standard_Real Param2 ,
709 const Standard_Real Tolerance ) {
711 TheSame1 = Standard_False;
712 TheSame2 = Standard_False;
713 TheSame3 = Standard_False;
721 Standard_Real Tol = Abs(Tolerance);
722 WellDone = Standard_False;
723 qualifier1 = GccEnt_noqualifier;
724 qualifier2 = GccEnt_noqualifier;
725 qualifier3 = GccEnt_noqualifier;
726 if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() ||
727 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
728 !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() ||
729 Qualified2.IsOutside() || Qualified2.IsUnqualified())) {
730 throw GccEnt_BadQualifier();
733 gp_Circ2d C1(gp_Ax2d(Point3,gp_Dir2d(1.,0.)),0.);
734 Geom2dAdaptor_Curve Cu1 = Qualified1.Qualified();
735 Geom2dAdaptor_Curve Cu2 = Qualified2.Qualified();
736 Geom2dGcc_FunctionTanCuCuCu Func(C1,Cu1,Cu2);
737 math_Vector Umin(1,3);
738 math_Vector Umax(1,3);
739 math_Vector Ufirst(1,3);
740 math_Vector tol(1,3);
742 Umin(2) = Geom2dGcc_CurveTool::FirstParameter(Cu1);
743 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu2);
745 Umax(2) = Geom2dGcc_CurveTool::LastParameter(Cu1);
746 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu2);
750 tol(1) = 2.e-15*M_PI;
751 tol(2) = Geom2dGcc_CurveTool::EpsX(Cu1,Abs(Tolerance));
752 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu2,Abs(Tolerance));
753 math_FunctionSetRoot Root(Func, tol);
754 Root.Perform(Func, Ufirst, Umin, Umax);
757 Func.Value(Ufirst,Umin);
758 gp_Pnt2d point1,point2;
759 // gp_Vec2d Tan1,Tan2,Nor1,Nor2;
761 Geom2dGcc_CurveTool::D1(Cu1,Ufirst(2),point1,Tan1);
762 Geom2dGcc_CurveTool::D1(Cu2,Ufirst(3),point2,Tan2);
763 GccAna_Circ2d3Tan circ(Point3,point1,point2,Tol);
765 cirsol = circ.ThisSolution(1);
766 gp_Pnt2d centre(cirsol.Location());
767 gp_Vec2d Tan3(-Sin(Ufirst(1)),Cos(Ufirst(1)));
768 Standard_Real normetan1 = Tan1.Magnitude();
769 Standard_Real normetan2 = Tan2.Magnitude();
770 Standard_Real normetan3 = Tan3.Magnitude();
771 gp_Vec2d Vec1(point1,centre);
772 gp_Vec2d Vec2(point2,centre);
773 gp_Vec2d Vec3(Point3,centre);
774 Standard_Real normevec1 = Vec1.Magnitude();
775 Standard_Real normevec2 = Vec2.Magnitude();
776 Standard_Real normevec3 = Vec3.Magnitude();
777 Standard_Real dot1,dot2,dot3;
778 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
779 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
782 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
783 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
786 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
787 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
791 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
792 Standard_Real Angle1 = Vec1.Angle(Tan1);
793 if (Qualified1.IsUnqualified()||
794 (Qualified1.IsEnclosing()&&Angle1<=0.)||
795 (Qualified1.IsOutside() && Angle1 >= 0) ||
796 (Qualified1.IsEnclosed() && Angle1 <= 0.)) {
797 Angle1 = Vec2.Angle(Tan2);
798 if (Qualified1.IsUnqualified() ||
799 (Qualified1.IsEnclosing()&&Angle1<=0.)||
800 (Qualified1.IsOutside() && Angle1 >= 0) ||
801 (Qualified1.IsEnclosed() && Angle1 <= 0.)) {
802 qualifier1 = Qualified1.Qualifier();
803 qualifier2 = Qualified2.Qualifier();
804 qualifier3 = GccEnt_noqualifier;
814 WellDone = Standard_True;
822 Geom2dGcc_Circ2d3TanIter::
823 Geom2dGcc_Circ2d3TanIter (const Geom2dGcc_QCurve& Qualified1 ,
824 const gp_Pnt2d& Point2 ,
825 const gp_Pnt2d& Point3 ,
826 const Standard_Real Param1 ,
827 const Standard_Real Tolerance ) {
829 TheSame1 = Standard_False;
830 TheSame2 = Standard_False;
831 TheSame3 = Standard_False;
839 Standard_Real Tol = Abs(Tolerance);
840 WellDone = Standard_False;
841 qualifier1 = GccEnt_noqualifier;
842 qualifier2 = GccEnt_noqualifier;
843 qualifier3 = GccEnt_noqualifier;
844 if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() ||
845 Qualified1.IsOutside() || Qualified1.IsUnqualified())) {
846 throw GccEnt_BadQualifier();
849 gp_Dir2d dirx(1.,0.);
850 gp_Circ2d C1(gp_Ax2d(Point2,dirx),0.);
851 gp_Circ2d C2(gp_Ax2d(Point3,dirx),0.);
852 Geom2dAdaptor_Curve Cu1 = Qualified1.Qualified();
853 Geom2dGcc_FunctionTanCuCuCu Func(C1,C2,Cu1);
854 math_Vector Umin(1,3);
855 math_Vector Umax(1,3);
856 math_Vector Ufirst(1,3);
857 math_Vector tol(1,3);
860 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu1);
863 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu1);
867 tol(1) = 2.e-15*M_PI;
868 tol(2) = 2.e-15*M_PI;
869 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu1,Abs(Tolerance));
870 math_FunctionSetRoot Root(Func, tol);
871 Root.Perform(Func, Ufirst, Umin, Umax);
874 Func.Value(Ufirst,Umin);
876 // gp_Vec2d Tan3,Nor3;
878 Geom2dGcc_CurveTool::D1(Cu1,Ufirst(3),point3,Tan3);
879 GccAna_Circ2d3Tan circ(Point2,Point3,point3,Tol);
881 cirsol = circ.ThisSolution(1);
882 gp_Pnt2d centre(cirsol.Location());
883 gp_Vec2d Tan2(-Sin(Ufirst(2)),Cos(Ufirst(2)));
884 gp_Vec2d Tan1(-Sin(Ufirst(1)),Cos(Ufirst(1)));
885 Standard_Real normetan1 = Tan1.Magnitude();
886 Standard_Real normetan2 = Tan2.Magnitude();
887 Standard_Real normetan3 = Tan3.Magnitude();
888 gp_Vec2d Vec1(Point2,centre);
889 gp_Vec2d Vec2(Point3,centre);
890 gp_Vec2d Vec3(point3,centre);
891 Standard_Real normevec1 = Vec1.Magnitude();
892 Standard_Real normevec2 = Vec2.Magnitude();
893 Standard_Real normevec3 = Vec3.Magnitude();
894 Standard_Real dot1,dot2,dot3;
895 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
896 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
899 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
900 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
903 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
904 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
908 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
909 Standard_Real Angle1 = Vec1.Angle(Tan1);
910 if (Qualified1.IsUnqualified() ||
911 (Qualified1.IsEnclosing()&&Angle1<=0.)||
912 (Qualified1.IsOutside() && Angle1 >= 0) ||
913 (Qualified1.IsEnclosed() && Angle1 <= 0.)) {
914 qualifier1 = Qualified1.Qualifier();
915 qualifier2 = GccEnt_noqualifier;
916 qualifier3 = GccEnt_noqualifier;
926 WellDone = Standard_True;
933 Geom2dGcc_Circ2d3TanIter::
934 Geom2dGcc_Circ2d3TanIter (const GccEnt_QualifiedLin& Qualified1 ,
935 const Geom2dGcc_QCurve& Qualified2 ,
936 const gp_Pnt2d& Point3 ,
937 const Standard_Real Param1 ,
938 const Standard_Real Param2 ,
939 const Standard_Real Tolerance ) {
941 TheSame1 = Standard_False;
942 TheSame2 = Standard_False;
943 TheSame3 = Standard_False;
951 Standard_Real Tol = Abs(Tolerance);
952 WellDone = Standard_False;
953 qualifier1 = GccEnt_noqualifier;
954 qualifier2 = GccEnt_noqualifier;
955 qualifier3 = GccEnt_noqualifier;
956 if (!(Qualified1.IsEnclosed() ||
957 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
958 !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() ||
959 Qualified2.IsOutside() || Qualified2.IsUnqualified())) {
960 throw GccEnt_BadQualifier();
963 gp_Dir2d dirx(1.,0.);
964 gp_Lin2d L1 = Qualified1.Qualified();
965 Geom2dAdaptor_Curve Cu2 = Qualified2.Qualified();
966 gp_Circ2d C3(gp_Ax2d(Point3,dirx),0.);
967 Geom2dGcc_FunctionTanCuCuCu Func(C3,L1,Cu2);
968 math_Vector Umin(1,3);
969 math_Vector Umax(1,3);
970 math_Vector Ufirst(1,3);
971 math_Vector tol(1,3);
972 Umin(2) = RealFirst();
973 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu2);
975 Umax(2) = RealLast();
976 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu2);
983 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu2,Abs(Tolerance));
984 math_FunctionSetRoot Root(Func, tol);
985 Root.Perform(Func, Ufirst, Umin, Umax);
988 Func.Value(Ufirst,Umin);
989 gp_Pnt2d centre1(L1.Location());
990 gp_Pnt2d point1(centre1.XY()+Ufirst(2)*L1.Direction().XY());
993 Geom2dGcc_CurveTool::D1(Cu2,Ufirst(2),point2,Tan2);
994 GccAna_Circ2d3Tan circ(point1,point2,Point3,Tol);
996 cirsol = circ.ThisSolution(1);
997 gp_Pnt2d centre(cirsol.Location());
998 Standard_Real pscal=centre.XY().Dot(gp_XY(-L1.Direction().Y(),
999 L1.Direction().X()));
1000 gp_Vec2d Tan1(L1.Direction().XY());
1001 gp_Vec2d Tan3(-Sin(Ufirst(1)),Cos(Ufirst(1)));
1002 Standard_Real normetan1 = Tan1.Magnitude();
1003 Standard_Real normetan2 = Tan2.Magnitude();
1004 Standard_Real normetan3 = Tan3.Magnitude();
1005 gp_Vec2d Vec1(point1,centre);
1006 gp_Vec2d Vec2(point2,centre);
1007 gp_Vec2d Vec3(Point3,centre);
1008 Standard_Real normevec1 = Vec1.Magnitude();
1009 Standard_Real normevec2 = Vec2.Magnitude();
1010 Standard_Real normevec3 = Vec3.Magnitude();
1011 Standard_Real dot1,dot2,dot3;
1012 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
1013 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
1016 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
1017 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
1020 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
1021 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
1025 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
1026 if (Qualified1.IsUnqualified() ||
1027 (Qualified1.IsOutside() && pscal <= 0.) ||
1028 (Qualified1.IsEnclosed() && pscal >= 0.)) {
1029 Standard_Real Angle1 = Vec2.Angle(Tan2);
1030 if (Qualified2.IsUnqualified() ||
1031 (Qualified2.IsEnclosing()&&Angle1<=0.)||
1032 (Qualified2.IsOutside() && Angle1 >= 0) ||
1033 (Qualified2.IsEnclosed() && Angle1 <= 0.)) {
1034 qualifier1 = Qualified1.Qualifier();
1035 qualifier2 = Qualified2.Qualifier();
1036 qualifier3 = GccEnt_noqualifier;
1037 pararg1 = Ufirst(2);
1040 pararg2 = Ufirst(3);
1046 WellDone = Standard_True;
1054 Geom2dGcc_Circ2d3TanIter::
1055 Geom2dGcc_Circ2d3TanIter (const GccEnt_QualifiedCirc& Qualified1 ,
1056 const GccEnt_QualifiedLin& Qualified2 ,
1057 const Geom2dGcc_QCurve& Qualified3 ,
1058 const Standard_Real Param1 ,
1059 const Standard_Real Param2 ,
1060 const Standard_Real Param3 ,
1061 const Standard_Real Tolerance ) {
1063 TheSame1 = Standard_False;
1064 TheSame2 = Standard_False;
1065 TheSame3 = Standard_False;
1073 Standard_Real Tol = Abs(Tolerance);
1074 WellDone = Standard_False;
1075 qualifier1 = GccEnt_noqualifier;
1076 qualifier2 = GccEnt_noqualifier;
1077 qualifier3 = GccEnt_noqualifier;
1078 if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() ||
1079 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
1080 !(Qualified2.IsEnclosed() ||
1081 Qualified2.IsOutside() || Qualified2.IsUnqualified()) ||
1082 !(Qualified3.IsEnclosed() || Qualified3.IsEnclosing() ||
1083 Qualified3.IsOutside() || Qualified3.IsUnqualified())) {
1084 throw GccEnt_BadQualifier();
1087 gp_Circ2d C1 = Qualified1.Qualified();
1088 gp_Lin2d L2 = Qualified2.Qualified();
1089 Geom2dAdaptor_Curve Cu3 = Qualified3.Qualified();
1090 Geom2dGcc_FunctionTanCuCuCu Func(C1,L2,Cu3);
1091 math_Vector Umin(1,3);
1092 math_Vector Umax(1,3);
1093 math_Vector Ufirst(1,3);
1094 math_Vector tol(1,3);
1096 Umin(2) = RealFirst();
1097 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu3);
1099 Umax(2) = RealLast();
1100 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu3);
1104 tol(1) = 2.e-15*M_PI;
1106 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu3,Abs(Tolerance));
1107 math_FunctionSetRoot Root(Func, tol);
1108 Root.Perform(Func, Ufirst, Umin, Umax);
1109 if (Root.IsDone()) {
1110 Func.Value(Ufirst,Umin);
1112 gp_Pnt2d centre1(C1.Location());
1113 Standard_Real R1 = C1.Radius();
1114 gp_Pnt2d point1(centre1.XY()+R1*gp_XY(Cos(Ufirst(1)),Sin(Ufirst(1))));
1115 gp_Pnt2d centre2(L2.Location());
1116 gp_Pnt2d point2(centre2.XY()+Ufirst(2)*L2.Direction().XY());
1119 Geom2dGcc_CurveTool::D1(Cu3,Ufirst(3),point3,Tan3);
1120 GccAna_Circ2d3Tan circ(point1,point2,point3,Tol);
1121 if (circ.IsDone()) {
1122 cirsol = circ.ThisSolution(1);
1123 gp_Pnt2d centre(cirsol.Location());
1124 gp_Vec2d Tan1(-Sin(Ufirst(1)),Cos(Ufirst(1)));
1125 gp_Vec2d Tan2(L2.Direction().XY());
1126 Standard_Real normetan1 = Tan1.Magnitude();
1127 Standard_Real normetan2 = Tan2.Magnitude();
1128 Standard_Real normetan3 = Tan3.Magnitude();
1129 gp_Vec2d Vec1(point1,centre);
1130 gp_Vec2d Vec2(point2,centre);
1131 gp_Vec2d Vec3(point3,centre);
1132 Standard_Real normevec1 = Vec1.Magnitude();
1133 Standard_Real normevec2 = Vec2.Magnitude();
1134 Standard_Real normevec3 = Vec3.Magnitude();
1135 Standard_Real dot1,dot2,dot3;
1136 if (normevec1 >= gp::Resolution() && normetan1 >= gp::Resolution()) {
1137 dot1 = Vec1.Dot(Tan1)/(normevec1*normetan1);
1140 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
1141 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
1144 if (normevec3 >= gp::Resolution() && normetan3 >= gp::Resolution()) {
1145 dot3 = Vec3.Dot(Tan3)/(normevec3*normetan3);
1149 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
1150 Standard_Real dist = centre1.Distance(centre);
1151 Standard_Real Rsol = cirsol.Radius();
1152 if (Qualified1.IsUnqualified() ||
1153 (Qualified1.IsEnclosing() && Rsol >= R1 && dist <= Rsol)||
1154 (Qualified1.IsOutside() && dist >= Rsol) ||
1155 (Qualified1.IsEnclosed() && Rsol <= R1 && dist <= Rsol)) {
1156 Standard_Real pscal=centre.XY().Dot(gp_XY(-L2.Direction().Y(),
1157 L2.Direction().X()));
1158 if (Qualified2.IsUnqualified() ||
1159 (Qualified2.IsOutside() && pscal <= 0.) ||
1160 (Qualified2.IsEnclosed() && pscal >= 0.)) {
1161 Standard_Real Angle1 = Vec3.Angle(Tan3);
1162 if (Qualified3.IsUnqualified() ||
1163 (Qualified3.IsEnclosing()&&Angle1<=0.)||
1164 (Qualified3.IsOutside() && Angle1 >= 0) ||
1165 (Qualified3.IsEnclosed() && Angle1 <= 0.)) {
1166 qualifier1 = Qualified1.Qualifier();
1167 qualifier2 = Qualified2.Qualifier();
1168 qualifier3 = Qualified3.Qualifier();
1169 pararg1 = Ufirst(1);
1172 pararg2 = Ufirst(2);
1175 pararg3 = Ufirst(3);
1178 WellDone = Standard_True;
1187 Geom2dGcc_Circ2d3TanIter::
1188 Geom2dGcc_Circ2d3TanIter (const GccEnt_QualifiedCirc& Qualified1 ,
1189 const Geom2dGcc_QCurve& Qualified2 ,
1190 const gp_Pnt2d& Point3 ,
1191 const Standard_Real Param1 ,
1192 const Standard_Real Param2 ,
1193 const Standard_Real Tolerance ) {
1195 TheSame1 = Standard_False;
1196 TheSame2 = Standard_False;
1197 TheSame3 = Standard_False;
1205 Standard_Real Tol = Abs(Tolerance);
1206 WellDone = Standard_False;
1207 qualifier1 = GccEnt_noqualifier;
1208 qualifier2 = GccEnt_noqualifier;
1209 qualifier3 = GccEnt_noqualifier;
1210 if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() ||
1211 Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
1212 !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() ||
1213 Qualified2.IsOutside() || Qualified2.IsUnqualified())) {
1214 throw GccEnt_BadQualifier();
1217 gp_Circ2d C1 = Qualified1.Qualified();
1218 Geom2dAdaptor_Curve Cu2 = Qualified2.Qualified();
1219 gp_Dir2d dirx(1.,0.);
1220 gp_Circ2d C3(gp_Ax2d(Point3,dirx),0.);
1221 Geom2dGcc_FunctionTanCuCuCu Func(C1,C3,Cu2);
1222 math_Vector Umin(1,3);
1223 math_Vector Umax(1,3);
1224 math_Vector Ufirst(1,3);
1225 math_Vector tol(1,3);
1227 Umin(3) = Geom2dGcc_CurveTool::FirstParameter(Cu2);
1230 Umax(3) = Geom2dGcc_CurveTool::LastParameter(Cu2);
1235 tol(1) = 2.e-15*M_PI;
1236 tol(2) = 2.e-15*M_PI;
1237 tol(3) = Geom2dGcc_CurveTool::EpsX(Cu2,Abs(Tolerance));
1238 math_FunctionSetRoot Root(Func, tol);
1239 Root.Perform(Func, Ufirst, Umin, Umax);
1240 if (Root.IsDone()) {
1242 Func.Value(Ufirst,Umin);
1243 gp_Pnt2d centre1(C1.Location());
1244 Standard_Real R1 = C1.Radius();
1245 gp_Pnt2d point1(centre1.XY()+R1*gp_XY(Cos(Ufirst(1)),Sin(Ufirst(1))));
1247 // gp_Vec2d Tan2,Nor2;
1249 Geom2dGcc_CurveTool::D1(Cu2,Ufirst(2),point2,Tan2);
1250 GccAna_Circ2d3Tan circ(point1,point2,Point3,Tol);
1251 if (circ.IsDone()) {
1252 cirsol = circ.ThisSolution(1);
1253 gp_Pnt2d centre(cirsol.Location());
1254 gp_Vec2d Tan1(-Sin(Ufirst(1)),Cos(Ufirst(1)));
1255 gp_Vec2d Tan3(-Sin(Ufirst(3)),Cos(Ufirst(3)));
1256 Standard_Real normetan2 = Tan2.Magnitude();
1257 gp_Vec2d Vec1(point1,centre);
1258 gp_Vec2d Vec2(point2,centre);
1259 gp_Vec2d Vec3(Point3,centre);
1260 Standard_Real normevec1 = Vec1.Magnitude();
1261 Standard_Real normevec2 = Vec2.Magnitude();
1262 Standard_Real normevec3 = Vec3.Magnitude();
1263 Standard_Real dot1,dot2,dot3;
1264 if (normevec1 >= gp::Resolution()) {
1265 dot1 = Vec1.Dot(Tan1)/(normevec1);
1268 if (normevec2 >= gp::Resolution() && normetan2 >= gp::Resolution()) {
1269 dot2 = Vec2.Dot(Tan2)/(normevec2*normetan2);
1272 if (normevec3 >= gp::Resolution()) {
1273 dot3 = Vec3.Dot(Tan3)/(normevec3);
1277 if (dot1 <= Tol && dot2 <=Tol && dot3 <= Tol) {
1278 Standard_Real dist = centre1.Distance(centre);
1279 Standard_Real Rsol = cirsol.Radius();
1280 if (Qualified1.IsUnqualified() ||
1281 (Qualified1.IsEnclosing() && Rsol >= R1 && dist <= Rsol)||
1282 (Qualified1.IsOutside() && dist >= Rsol) ||
1283 (Qualified1.IsEnclosed() && Rsol <= R1 && dist <= Rsol)) {
1284 Standard_Real Angle1 = Vec2.Angle(Tan2);
1285 if (Qualified2.IsUnqualified() ||
1286 (Qualified2.IsEnclosing()&&Angle1<=0.)||
1287 (Qualified2.IsOutside() && Angle1 >= 0) ||
1288 (Qualified2.IsEnclosed() && Angle1 <= 0.)) {
1289 qualifier1 = Qualified1.Qualifier();
1290 qualifier2 = Qualified2.Qualifier();
1291 qualifier3 = GccEnt_noqualifier;
1292 pararg1 = Ufirst(1);
1295 pararg2 = Ufirst(2);
1301 WellDone = Standard_True;
1309 Standard_Boolean Geom2dGcc_Circ2d3TanIter::
1310 IsDone () const{ return WellDone; }
1312 gp_Circ2d Geom2dGcc_Circ2d3TanIter::
1313 ThisSolution () const{ return cirsol; }
1315 void Geom2dGcc_Circ2d3TanIter::
1316 WhichQualifier (GccEnt_Position& Qualif1 ,
1317 GccEnt_Position& Qualif2 ,
1318 GccEnt_Position& Qualif3 ) const
1320 if (!WellDone) { throw StdFail_NotDone(); }
1322 Qualif1 = qualifier1;
1323 Qualif2 = qualifier2;
1324 Qualif3 = qualifier3;
1328 void Geom2dGcc_Circ2d3TanIter::
1329 Tangency1 (Standard_Real& ParSol ,
1330 Standard_Real& ParArg ,
1331 gp_Pnt2d& PntSol ) const{
1332 if (!WellDone) { throw StdFail_NotDone(); }
1334 if (TheSame1 == 0) {
1339 else { throw StdFail_NotDone(); }
1343 void Geom2dGcc_Circ2d3TanIter::
1344 Tangency2 (Standard_Real& ParSol ,
1345 Standard_Real& ParArg ,
1346 gp_Pnt2d& PntSol ) const{
1347 if (!WellDone) { throw StdFail_NotDone(); }
1355 void Geom2dGcc_Circ2d3TanIter::
1356 Tangency3 (Standard_Real& ParSol ,
1357 Standard_Real& ParArg ,
1358 gp_Pnt2d& PntSol ) const{
1359 if (!WellDone) { throw StdFail_NotDone(); }
1367 Standard_Boolean Geom2dGcc_Circ2d3TanIter::
1370 if (!WellDone) throw StdFail_NotDone();
1373 return Standard_False;
1375 return Standard_True;
1379 Standard_Boolean Geom2dGcc_Circ2d3TanIter::
1382 if (!WellDone) throw StdFail_NotDone();
1385 return Standard_False;
1387 return Standard_True;
1391 Standard_Boolean Geom2dGcc_Circ2d3TanIter::
1394 if (!WellDone) throw StdFail_NotDone();
1396 return Standard_True;