1 #include <IntCurve_IConicTool.ixx>
6 #define Object_To_Abs Abs_To_Object.Inverted()
7 //======================================================================
12 #define Elips_aa (Elips_a*Elips_a)
13 #define Elips_bb (Elips_b*Elips_b)
14 #define Elips_x0 (Axis.Location().X())
15 #define Elips_y0 (Axis.Location().Y())
16 //======================================================================
19 #define Hypr_aa (Hypr_a * Hypr_a)
20 #define Hypr_bb (Hypr_b * Hypr_b)
21 //======================================================================
25 //======================================================================
27 #define Circle_x0 prm2
28 #define Circle_y0 prm3
29 //======================================================================
33 //======================================================================
34 IntCurve_IConicTool::IntCurve_IConicTool(void) {
35 //###### PLACER LE TYPE NON DEFINI ######
39 IntCurve_IConicTool::IntCurve_IConicTool(const IntCurve_IConicTool& ITool) {
44 Abs_To_Object=ITool.Abs_To_Object;
47 //======================================================================
48 //======================================================================
49 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Lin2d& Line) {
50 Line.Coefficients(Line_a,Line_b,Line_c);
51 Axis = gp_Ax22d(Line.Position(),Standard_True);
54 //======================================================================
55 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Elips2d& Elips) {
56 Elips_a = Elips.MajorRadius();
57 Elips_b = Elips.MinorRadius();
58 Elips_c = sqrt(Elips_a*Elips_a-Elips_b*Elips_b);
60 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
61 type = GeomAbs_Ellipse;
63 //======================================================================
64 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Circ2d& C) {
67 Circle_x0=Axis.Location().X();
68 Circle_y0=Axis.Location().Y();
69 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
70 type = GeomAbs_Circle;
72 //======================================================================
73 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Parab2d& P) {
77 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
78 type = GeomAbs_Parabola;
80 //======================================================================
81 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Hypr2d& H) {
82 Hypr_a = H.MajorRadius();
83 Hypr_b = H.MinorRadius();
85 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
86 type = GeomAbs_Hyperbola;
88 //----------------------------------------------------------------------
89 gp_Pnt2d IntCurve_IConicTool::Value(const Standard_Real X) const {
91 case GeomAbs_Line: return(ElCLib::LineValue(X,Axis.XAxis()));
92 case GeomAbs_Ellipse: return(ElCLib::EllipseValue(X,Axis,Elips_a,Elips_b));
93 case GeomAbs_Circle: return(ElCLib::CircleValue(X,Axis,Circle_r));
94 case GeomAbs_Parabola: return(ElCLib::ParabolaValue(X,Axis,Parab_f));
95 case GeomAbs_Hyperbola: return(ElCLib::HyperbolaValue(X,Axis,Hypr_a,Hypr_b));
96 default: { cout<<"### Erreur sur le type de la courbe ###";
97 return(gp_Pnt2d(0.0,0.0)); }
101 //----------------------------------------------------------------------
102 void IntCurve_IConicTool::D1(const Standard_Real X,
104 gp_Vec2d& Tan) const {
107 case GeomAbs_Line: ElCLib::LineD1(X,Axis.XAxis(),Pt,Tan); break;
108 case GeomAbs_Ellipse: ElCLib::EllipseD1(X,Axis,Elips_a,Elips_b,Pt,Tan); break;
109 case GeomAbs_Circle: ElCLib::CircleD1(X,Axis,Circle_r,Pt,Tan); break;
110 case GeomAbs_Parabola: ElCLib::ParabolaD1(X,Axis,Parab_f,Pt,Tan); break;
111 case GeomAbs_Hyperbola: ElCLib::HyperbolaD1(X,Axis,Hypr_a,Hypr_b,Pt,Tan); break;
112 default: { cout<<"### Erreur sur le type de la courbe ###"; }
116 //----------------------------------------------------------------------
117 void IntCurve_IConicTool::D2(const Standard_Real X,
120 gp_Vec2d& Norm) const {
123 case GeomAbs_Line: ElCLib::LineD1(X,Axis.XAxis(),Pt,Tan); Norm.SetCoord(0.0,0.0); break;
124 case GeomAbs_Ellipse: ElCLib::EllipseD2(X,Axis,Elips_a,Elips_b,Pt,Tan,Norm); break;
125 case GeomAbs_Circle: ElCLib::CircleD2(X,Axis,Circle_r,Pt,Tan,Norm); break;
126 case GeomAbs_Parabola: ElCLib::ParabolaD2(X,Axis,Parab_f,Pt,Tan,Norm); break;
127 case GeomAbs_Hyperbola: ElCLib::HyperbolaD2(X,Axis,Hypr_a,Hypr_b,Pt,Tan,Norm); break;
128 default: { cout<<"### Erreur sur le type de la courbe ###"; }
131 //----------------------------------------------------------------------
133 //----------------------------------------------------------------------
134 Standard_Real IntCurve_IConicTool::Distance(const gp_Pnt2d& ThePoint) const {
139 return(Line_a*ThePoint.X()+Line_b*ThePoint.Y()+Line_c);
142 case GeomAbs_Ellipse:
146 P.Transform(Abs_To_Object);
147 Standard_Real x=P.X();
148 Standard_Real y2=P.Y() * P.Y();
149 return(sqrt(y2+(x+Elips_c)*(x+Elips_c))
150 +sqrt(y2+(x-Elips_c)*(x-Elips_c))-Elips_a-Elips_a);
153 P.Transform(Abs_To_Object);
154 Standard_Real x=P.X();
155 Standard_Real y=P.Y()*(Elips_a/Elips_b);
156 Standard_Real d=sqrt(x*x+y*y)-Elips_a;
163 Standard_Real Dx=Circle_x0-ThePoint.X();
164 Standard_Real Dy=Circle_y0-ThePoint.Y();
165 return(sqrt(Dx*Dx+Dy*Dy)-Circle_r);
168 case GeomAbs_Parabola:
169 { //-- Distance(X,Y) = Y**2 - 2 P X
171 P.Transform(Abs_To_Object);
172 return(P.Y()*P.Y()-Parab_2p*P.X());
175 case GeomAbs_Hyperbola:
176 { //-- Distance(X,Y) = (X/a)**2 - (Y/b)**2 -1
178 //-- -(Y/b)**2 - 1 sinon ??
179 //-- avec un gradient avec x -> Abs(x)
181 P.Transform(Abs_To_Object);
183 return((P.X()*P.X())/Hypr_aa
184 -(P.Y()*P.Y())/Hypr_bb -1.0);
186 return((-P.X()*P.X())/Hypr_aa
187 -(P.Y()*P.Y())/Hypr_bb -1.0);
189 default: { cout<<"### Erreur sur le type de la courbe ###";
195 gp_Vec2d IntCurve_IConicTool::GradDistance(const gp_Pnt2d& ThePoint) const {
198 case GeomAbs_Line: return(gp_Vec2d(Line_a,Line_b));
200 case GeomAbs_Circle: {
202 P.Transform(Abs_To_Object);
203 Standard_Real Gradx=0.0;
204 Standard_Real Grady=0.0;
205 Standard_Real x=P.X();
206 Standard_Real y=P.Y();
207 Standard_Real temp1=sqrt(y*y+x*x);
212 gp_Vec2d Gradient(Gradx,Grady);
213 Gradient.Transform(Object_To_Abs);
216 case GeomAbs_Ellipse: {
219 P.Transform(Abs_To_Object);
220 Standard_Real Gradx=0.0;
221 Standard_Real Grady=0.0;
222 Standard_Real x=P.X();
223 Standard_Real y=P.Y();
224 Standard_Real xmc=x-Elips_c;
225 Standard_Real xpc=x+Elips_c;
226 Standard_Real temp1=sqrt(y*y+xmc*xmc);
227 Standard_Real temp2=sqrt(y*y+xpc*xpc);
236 gp_Vec2d Gradient(Gradx,Grady);
237 Gradient.Transform(Object_To_Abs);
241 P.Transform(Abs_To_Object);
242 Standard_Real Gradx=0.0;
243 Standard_Real Grady=0.0;
244 Standard_Real x=P.X();
245 Standard_Real y=P.Y()*(Elips_a/Elips_b);
246 Standard_Real temp1=sqrt(y*y+x*x);
249 Grady=(y*(Elips_a/Elips_b))/temp1;
251 gp_Vec2d Gradient(Gradx,Grady);
252 Gradient.Transform(Object_To_Abs);
257 case GeomAbs_Parabola: { //-- Distance(X,Y) = Y**2 - 2 P X
259 P.Transform(Abs_To_Object);
260 gp_Vec2d Gradient(-Parab_2p,P.Y()+P.Y());
261 Gradient.Transform(Object_To_Abs);
264 case GeomAbs_Hyperbola: { //-- Distance(X,Y) = (X/a)**2 - (Y/b)**2 -1
266 P.Transform(Abs_To_Object);
267 //--### la Branche a X negatif doit ramener vers les X positifs
268 gp_Vec2d Gradient(2.0*Abs(P.X())/Hypr_aa,-2.0*P.Y()/Hypr_bb);
269 Gradient.Transform(Object_To_Abs);
272 default: { cout<<"### Erreur sur le type de la courbe ###";
273 return(gp_Vec2d(0.0,0.0)); }
278 Standard_Real IntCurve_IConicTool::FindParameter(const gp_Pnt2d& P) const {
280 Standard_Real Param=0;
285 Param=ElCLib::LineParameter(Axis.XAxis(),P);
289 Param=ElCLib::CircleParameter(Axis,P);
290 if(Param<0.0) { Param+=M_PI+M_PI; }
293 case GeomAbs_Ellipse: {
294 Param=ElCLib::EllipseParameter(Axis
298 if (Param < 0.0) { Param+=M_PI+M_PI; }
302 case GeomAbs_Parabola: {
303 Param=ElCLib::ParabolaParameter(Axis,P);
306 case GeomAbs_Hyperbola: {
307 Param=ElCLib::HyperbolaParameter(Axis