summaryrefslogtreecommitdiff
path: root/src/GccAna/GccAna_CircLin2dBisec.cxx
blob: df5a71235c056451bedb3a02f4a2afc3b1c92343 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// File:	GccAna_CircLin2dBisec.cxx
// Created:	Fri Oct 11 08:19:14 1991
// Author:	Remi GILET
//		<reg@topsn3>

//=========================================================================
//   CREATION DE LA BISSECTICE ENTRE UN CERCLE ET UNE DROITE.             +
//=========================================================================

#include <GccAna_CircLin2dBisec.ixx>

#include <gp_XY.hxx>
#include <gp_Dir2d.hxx>
#include <gp_Ax2d.hxx>
#include <GccInt_BParab.hxx>
#include <GccInt_BLine.hxx>
#include <Standard_OutOfRange.hxx>
#include <StdFail_NotDone.hxx>
#include <gp.hxx>

//=========================================================================

GccAna_CircLin2dBisec::
   GccAna_CircLin2dBisec (const gp_Circ2d& Circle ,
		          const gp_Lin2d&  Line   ):

   circle(Circle),
   line(Line)
{

//=========================================================================
//  Initialisation des champs :                                           +
//            - circle   (Le cercle.)                                     +
//            - line     (la droite.)                                     +
//            - NbrSol   (nombre de solution.)                            +
//            - WellDone (Booleen indiquant le succes ou non de l algo.). +
//=========================================================================

   NbrSol = 2;
   WellDone = Standard_True;
 }

//=========================================================================
//  Traitement.                                                           +
//  On recupere les coordonees des origines de la droite (xloc,yloc) et   +
//  du cercle (xcencir, ycencir).                                         +
//  On recupere aussi les coordonees dela direction de la droite (xdir,   +
//  ydir) et le rayon du cercle R1.                                       +
//  On regarde de quel cote de la droite se trouve le centre du cercle    +
//  pour orienter la parabole (signe).                                    +
//  On cree l axe de chacune des paraboles (axeparab1, axeparb2), puis    +
//  les deux paraboles (biscirlin1, biscirlin1).                          +
//=========================================================================

Handle(GccInt_Bisec) GccAna_CircLin2dBisec::
   ThisSolution (const Standard_Integer Index) const 
{
  
  if (!WellDone) StdFail_NotDone::Raise();
  
  if ((Index <=0) || (Index > NbrSol)) Standard_OutOfRange::Raise();
  
  Handle(GccInt_Bisec) bissol;
  Standard_Real xdir = line.Direction().X();
  Standard_Real ydir = line.Direction().Y();
  Standard_Real xloc = line.Location().X();
  Standard_Real yloc = line.Location().Y();
  Standard_Real xcencir = circle.Location().X();
  Standard_Real ycencir = circle.Location().Y();
  Standard_Real R1 = circle.Radius();
  Standard_Real dist = line.Distance(circle.Location());
  if ((Abs(line.Distance(circle.Location())-circle.Radius()) 
       <= gp::Resolution()) && (Index == 1)) {
    gp_Lin2d biscirlin1(circle.Location(),gp_Dir2d(-ydir,xdir));
    bissol = new GccInt_BLine(biscirlin1);
    //       ==========================================================
  }
  else {
    Standard_Integer signe;
    if ((-ydir*(xcencir-xloc)+xdir*(ycencir-yloc)) > 0.0) {
      signe = 1;
    }
    else {
      signe = -1;
    }
    gp_Ax2d axeparab1;
//    gp_Ax2d axeparab2;
    gp_Parab2d biscirlin;
    if (dist != R1) {
      if (Index == 1) {
	axeparab1=gp_Ax2d(gp_Pnt2d(gp_XY(xcencir+signe*ydir*(dist+R1)/2,
					 ycencir-signe*xdir*(dist+R1)/2.)),
			  gp_Dir2d(-signe*ydir,signe*xdir));
	biscirlin = gp_Parab2d(axeparab1,(dist+R1)/2.0);
      }
      else {
	if (dist < R1) {
	  axeparab1=gp_Ax2d(gp_Pnt2d(gp_XY(xcencir+signe*ydir*(dist-R1)/2,
					   ycencir-signe*xdir*(dist-R1)/2.)),
			    gp_Dir2d(signe*ydir,-signe*xdir));
	}
	else {
	  axeparab1=gp_Ax2d(gp_Pnt2d(gp_XY(xcencir+signe*ydir*(dist-R1)/2,
					   ycencir-signe*xdir*(dist-R1)/2.)),
			    gp_Dir2d(-signe*ydir,signe*xdir));
	}
	biscirlin = gp_Parab2d(axeparab1,Abs(dist-R1)/2.0);
      }
      bissol = new GccInt_BParab(biscirlin);
      //         ==========================================================
    }
    else {
      axeparab1 = gp_Ax2d(gp_Pnt2d(gp_XY(xcencir+signe*ydir*(dist+R1)/2.,
					 ycencir-signe*xdir*(dist+R1)/2.)),
			  gp_Dir2d(signe*(-ydir),signe*xdir));
      biscirlin = gp_Parab2d(axeparab1,R1);
      bissol = new GccInt_BParab(biscirlin);
      //         ==========================================================
    }
  }

  return bissol;
}

//=========================================================================

Standard_Boolean GccAna_CircLin2dBisec::
   IsDone () const { return WellDone; }

Standard_Integer GccAna_CircLin2dBisec::
   NbSolutions () const { return NbrSol; }