0024510: Remove unused local variables
[occt.git] / src / GccAna / GccAna_Circ2d2TanOn_2.cxx
1 // Created on: 1992-01-02
2 // Created by: Remi GILET
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
9 // under the terms of the GNU Lesser General Public 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 #include <GccAna_Circ2d2TanOn.jxx>
18
19 #include <ElCLib.hxx>
20 #include <gp_Dir2d.hxx>
21 #include <gp_Ax2d.hxx>
22 #include <IntAna2d_AnaIntersection.hxx>
23 #include <IntAna2d_IntPoint.hxx>
24 #include <GccAna_Lin2dBisec.hxx>
25 #include <gp.hxx>
26 #include <GccEnt_BadQualifier.hxx>
27
28 GccAna_Circ2d2TanOn::
29    GccAna_Circ2d2TanOn (const GccEnt_QualifiedLin&  Qualified1 , 
30                         const GccEnt_QualifiedLin&  Qualified2 , 
31                         const gp_Lin2d&             OnLine     ,
32                         const Standard_Real         Tolerance  ):
33    cirsol(1,2)     ,
34    qualifier1(1,2) ,
35    qualifier2(1,2) ,
36    TheSame1(1,2)   ,
37    TheSame2(1,2)   ,
38    pnttg1sol(1,2)  ,
39    pnttg2sol(1,2)  ,
40    pntcen(1,2)     ,
41    par1sol(1,2)    ,
42    par2sol(1,2)    ,
43    pararg1(1,2)    ,
44    pararg2(1,2)    ,
45    parcen3(1,2)
46 {
47   // initialisations
48   TheSame1.Init(0);
49   TheSame2.Init(0);
50   WellDone = Standard_False;
51   NbrSol = 0;
52
53   if (!(Qualified1.IsEnclosed() ||
54         Qualified1.IsOutside() || Qualified1.IsUnqualified()) ||
55       !(Qualified2.IsEnclosed() ||
56         Qualified2.IsOutside() || Qualified2.IsUnqualified())) {
57   GccEnt_BadQualifier::Raise();
58     return;
59   }
60
61   gp_Dir2d dirx(1.,0.);
62   Standard_Real Tol = Abs(Tolerance);
63
64   // calculation of bisectrices of L1 and L2
65   gp_Lin2d L1(Qualified1.Qualified());
66   gp_Lin2d L2(Qualified2.Qualified());
67   gp_Pnt2d originL1(L1.Location());
68   gp_Pnt2d originL2(L2.Location());
69   GccAna_Lin2dBisec Bis(L1,L2);
70   
71   if (Bis.IsDone()) {
72     
73     if (Bis.NbSolutions() == 1 || Bis.NbSolutions() == 2) {
74       // if 1 bisectrice, L1 and L2 are parallel
75       // if 2 bisectrices, L1 and L2 are intersected
76
77       for (Standard_Integer k = 1 ; k <= Bis.NbSolutions() ; k++) {
78         IntAna2d_AnaIntersection Intp(Bis.ThisSolution(k),OnLine);
79         if (Intp.IsDone()) {
80           WellDone = Standard_True;
81           // for degenerated cases, no acceptable solution
82           // (OnLine and bisectrice strictly parallel or not)
83           if (!Intp.IdenticalElements() 
84                && !Intp.ParallelElements() 
85                && !Intp.IsEmpty()) {
86             // at maximum 1 point of intersection !
87             for (Standard_Integer l = 1 ; l <= Intp.NbPoints() ; l++) {
88               gp_Pnt2d pt(Intp.Point(l).Value());
89               gp_Ax2d axe(pt,dirx);
90               Standard_Real Radius = L1.Distance(pt);
91               if (!L1.Contains(pt,Tol) && Radius<1.0/Tol && NbrSol<2) {
92                 // acceptable solution : the radius is correct
93                 NbrSol++;
94                 cirsol(NbrSol) = gp_Circ2d(axe,Radius);
95               }
96             }
97           }
98         }
99       }
100
101     }    
102
103   }
104   
105   // parce following the qualifiers NbrSol acceptable solutions
106   
107   for (Standard_Integer i=1 ; i <= NbrSol ; i++) {
108
109     gp_Pnt2d pbid(cirsol(i).Location());
110     Standard_Real Radius = cirsol(i).Radius();
111     Standard_Boolean ok = Standard_False;
112     
113     // solution Outside or Enclosed / L1
114     gp_Dir2d dc1(originL1.XY()-pbid.XY());
115     Standard_Real sign1 = dc1.Dot(gp_Dir2d(-L1.Direction().Y(),
116                                             L1.Direction().X()));
117     if (sign1>0.0) ok = (Qualified1.IsUnqualified() 
118                           || Qualified1.IsOutside());
119     else ok = (Qualified1.IsUnqualified() 
120                 || Qualified1.IsEnclosed());
121
122     // solution Outside or Enclosed / L2
123     gp_Dir2d dc2(originL2.XY()-pbid.XY());
124     Standard_Real sign2 = dc2.Dot(gp_Dir2d(-L2.Direction().Y(),
125                                             L2.Direction().X()));
126     if (sign2>0.0) ok = ok && (Qualified2.IsUnqualified() 
127                                 || Qualified2.IsOutside());
128     else ok = ok &&(Qualified2.IsUnqualified() 
129                      || Qualified2.IsEnclosed());
130
131     if (ok) {
132       // solution to be preserved
133       dc1 = gp_Dir2d(sign1*gp_XY(-L1.Direction().Y(),
134                                   L1.Direction().X()));
135       pnttg1sol(i) = gp_Pnt2d(pbid.XY()+Radius*dc1.XY());
136       if (sign1>0.0) qualifier1(i) = GccEnt_outside;
137       else qualifier1(i) = GccEnt_enclosed;
138       dc2 = gp_Dir2d(sign2*gp_XY(-L2.Direction().Y(),
139                                   L2.Direction().X()));
140       pnttg2sol(i) = gp_Pnt2d(pbid.XY()+Radius*dc2.XY());
141       if (sign2>0.0) qualifier2(i) = GccEnt_outside;
142       else qualifier2(i) = GccEnt_enclosed;
143       pntcen(i) = pbid;
144       par1sol(i)=ElCLib::Parameter(cirsol(i),pnttg1sol(i));
145       pararg1(i)=ElCLib::Parameter(L1,pnttg1sol(i));
146       par2sol(i)=ElCLib::Parameter(cirsol(i),pnttg2sol(i));
147       pararg2(i)=ElCLib::Parameter(L2,pnttg2sol(i));
148       parcen3(i)=ElCLib::Parameter(OnLine,pntcen(i));
149     }
150     else {
151       // solution to be rejected
152       if (i==NbrSol) NbrSol--;
153       else {
154         for (Standard_Integer k = i+1 ; k <= NbrSol ; k++) {
155           cirsol(k-1) = cirsol(k);
156         }
157         NbrSol--;
158         i--;
159       }
160     }
161
162   }
163
164 }
165