1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
19 #include <IntCurve_IConicTool.ixx>
24 #define Object_To_Abs Abs_To_Object.Inverted()
25 //======================================================================
30 #define Elips_aa (Elips_a*Elips_a)
31 #define Elips_bb (Elips_b*Elips_b)
32 #define Elips_x0 (Axis.Location().X())
33 #define Elips_y0 (Axis.Location().Y())
34 //======================================================================
37 #define Hypr_aa (Hypr_a * Hypr_a)
38 #define Hypr_bb (Hypr_b * Hypr_b)
39 //======================================================================
43 //======================================================================
45 #define Circle_x0 prm2
46 #define Circle_y0 prm3
47 //======================================================================
51 //======================================================================
52 IntCurve_IConicTool::IntCurve_IConicTool(void) {
53 //###### PLACER LE TYPE NON DEFINI ######
57 IntCurve_IConicTool::IntCurve_IConicTool(const IntCurve_IConicTool& ITool) {
62 Abs_To_Object=ITool.Abs_To_Object;
65 //======================================================================
66 //======================================================================
67 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Lin2d& Line) {
68 Line.Coefficients(Line_a,Line_b,Line_c);
69 Axis = gp_Ax22d(Line.Position(),Standard_True);
72 //======================================================================
73 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Elips2d& Elips) {
74 Elips_a = Elips.MajorRadius();
75 Elips_b = Elips.MinorRadius();
76 Elips_c = sqrt(Elips_a*Elips_a-Elips_b*Elips_b);
78 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
79 type = GeomAbs_Ellipse;
81 //======================================================================
82 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Circ2d& C) {
85 Circle_x0=Axis.Location().X();
86 Circle_y0=Axis.Location().Y();
87 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
88 type = GeomAbs_Circle;
90 //======================================================================
91 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Parab2d& P) {
95 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
96 type = GeomAbs_Parabola;
98 //======================================================================
99 IntCurve_IConicTool::IntCurve_IConicTool(const gp_Hypr2d& H) {
100 Hypr_a = H.MajorRadius();
101 Hypr_b = H.MinorRadius();
103 Abs_To_Object.SetTransformation(gp::OX2d(),Axis.XAxis());
104 type = GeomAbs_Hyperbola;
106 //----------------------------------------------------------------------
107 gp_Pnt2d IntCurve_IConicTool::Value(const Standard_Real X) const {
109 case GeomAbs_Line: return(ElCLib::LineValue(X,Axis.XAxis()));
110 case GeomAbs_Ellipse: return(ElCLib::EllipseValue(X,Axis,Elips_a,Elips_b));
111 case GeomAbs_Circle: return(ElCLib::CircleValue(X,Axis,Circle_r));
112 case GeomAbs_Parabola: return(ElCLib::ParabolaValue(X,Axis,Parab_f));
113 case GeomAbs_Hyperbola: return(ElCLib::HyperbolaValue(X,Axis,Hypr_a,Hypr_b));
114 default: { cout<<"### Erreur sur le type de la courbe ###";
115 return(gp_Pnt2d(0.0,0.0)); }
119 //----------------------------------------------------------------------
120 void IntCurve_IConicTool::D1(const Standard_Real X,
122 gp_Vec2d& Tan) const {
125 case GeomAbs_Line: ElCLib::LineD1(X,Axis.XAxis(),Pt,Tan); break;
126 case GeomAbs_Ellipse: ElCLib::EllipseD1(X,Axis,Elips_a,Elips_b,Pt,Tan); break;
127 case GeomAbs_Circle: ElCLib::CircleD1(X,Axis,Circle_r,Pt,Tan); break;
128 case GeomAbs_Parabola: ElCLib::ParabolaD1(X,Axis,Parab_f,Pt,Tan); break;
129 case GeomAbs_Hyperbola: ElCLib::HyperbolaD1(X,Axis,Hypr_a,Hypr_b,Pt,Tan); break;
130 default: { cout<<"### Erreur sur le type de la courbe ###"; }
134 //----------------------------------------------------------------------
135 void IntCurve_IConicTool::D2(const Standard_Real X,
138 gp_Vec2d& Norm) const {
141 case GeomAbs_Line: ElCLib::LineD1(X,Axis.XAxis(),Pt,Tan); Norm.SetCoord(0.0,0.0); break;
142 case GeomAbs_Ellipse: ElCLib::EllipseD2(X,Axis,Elips_a,Elips_b,Pt,Tan,Norm); break;
143 case GeomAbs_Circle: ElCLib::CircleD2(X,Axis,Circle_r,Pt,Tan,Norm); break;
144 case GeomAbs_Parabola: ElCLib::ParabolaD2(X,Axis,Parab_f,Pt,Tan,Norm); break;
145 case GeomAbs_Hyperbola: ElCLib::HyperbolaD2(X,Axis,Hypr_a,Hypr_b,Pt,Tan,Norm); break;
146 default: { cout<<"### Erreur sur le type de la courbe ###"; }
149 //----------------------------------------------------------------------
151 //----------------------------------------------------------------------
152 Standard_Real IntCurve_IConicTool::Distance(const gp_Pnt2d& ThePoint) const {
157 return(Line_a*ThePoint.X()+Line_b*ThePoint.Y()+Line_c);
160 case GeomAbs_Ellipse:
164 P.Transform(Abs_To_Object);
165 Standard_Real x=P.X();
166 Standard_Real y2=P.Y() * P.Y();
167 return(sqrt(y2+(x+Elips_c)*(x+Elips_c))
168 +sqrt(y2+(x-Elips_c)*(x-Elips_c))-Elips_a-Elips_a);
171 P.Transform(Abs_To_Object);
172 Standard_Real x=P.X();
173 Standard_Real y=P.Y()*(Elips_a/Elips_b);
174 Standard_Real d=sqrt(x*x+y*y)-Elips_a;
181 Standard_Real Dx=Circle_x0-ThePoint.X();
182 Standard_Real Dy=Circle_y0-ThePoint.Y();
183 return(sqrt(Dx*Dx+Dy*Dy)-Circle_r);
186 case GeomAbs_Parabola:
187 { //-- Distance(X,Y) = Y**2 - 2 P X
189 P.Transform(Abs_To_Object);
190 return(P.Y()*P.Y()-Parab_2p*P.X());
193 case GeomAbs_Hyperbola:
194 { //-- Distance(X,Y) = (X/a)**2 - (Y/b)**2 -1
196 //-- -(Y/b)**2 - 1 sinon ??
197 //-- avec un gradient avec x -> Abs(x)
199 P.Transform(Abs_To_Object);
201 return((P.X()*P.X())/Hypr_aa
202 -(P.Y()*P.Y())/Hypr_bb -1.0);
204 return((-P.X()*P.X())/Hypr_aa
205 -(P.Y()*P.Y())/Hypr_bb -1.0);
207 default: { cout<<"### Erreur sur le type de la courbe ###";
213 gp_Vec2d IntCurve_IConicTool::GradDistance(const gp_Pnt2d& ThePoint) const {
216 case GeomAbs_Line: return(gp_Vec2d(Line_a,Line_b));
218 case GeomAbs_Circle: {
220 P.Transform(Abs_To_Object);
221 Standard_Real Gradx=0.0;
222 Standard_Real Grady=0.0;
223 Standard_Real x=P.X();
224 Standard_Real y=P.Y();
225 Standard_Real temp1=sqrt(y*y+x*x);
230 gp_Vec2d Gradient(Gradx,Grady);
231 Gradient.Transform(Object_To_Abs);
234 case GeomAbs_Ellipse: {
237 P.Transform(Abs_To_Object);
238 Standard_Real Gradx=0.0;
239 Standard_Real Grady=0.0;
240 Standard_Real x=P.X();
241 Standard_Real y=P.Y();
242 Standard_Real xmc=x-Elips_c;
243 Standard_Real xpc=x+Elips_c;
244 Standard_Real temp1=sqrt(y*y+xmc*xmc);
245 Standard_Real temp2=sqrt(y*y+xpc*xpc);
254 gp_Vec2d Gradient(Gradx,Grady);
255 Gradient.Transform(Object_To_Abs);
259 P.Transform(Abs_To_Object);
260 Standard_Real Gradx=0.0;
261 Standard_Real Grady=0.0;
262 Standard_Real x=P.X();
263 Standard_Real y=P.Y()*(Elips_a/Elips_b);
264 Standard_Real temp1=sqrt(y*y+x*x);
267 Grady=(y*(Elips_a/Elips_b))/temp1;
269 gp_Vec2d Gradient(Gradx,Grady);
270 Gradient.Transform(Object_To_Abs);
275 case GeomAbs_Parabola: { //-- Distance(X,Y) = Y**2 - 2 P X
277 P.Transform(Abs_To_Object);
278 gp_Vec2d Gradient(-Parab_2p,P.Y()+P.Y());
279 Gradient.Transform(Object_To_Abs);
282 case GeomAbs_Hyperbola: { //-- Distance(X,Y) = (X/a)**2 - (Y/b)**2 -1
284 P.Transform(Abs_To_Object);
285 //--### la Branche a X negatif doit ramener vers les X positifs
286 gp_Vec2d Gradient(2.0*Abs(P.X())/Hypr_aa,-2.0*P.Y()/Hypr_bb);
287 Gradient.Transform(Object_To_Abs);
290 default: { cout<<"### Erreur sur le type de la courbe ###";
291 return(gp_Vec2d(0.0,0.0)); }
296 Standard_Real IntCurve_IConicTool::FindParameter(const gp_Pnt2d& P) const {
298 Standard_Real Param=0;
303 Param=ElCLib::LineParameter(Axis.XAxis(),P);
307 Param=ElCLib::CircleParameter(Axis,P);
308 if(Param<0.0) { Param+=M_PI+M_PI; }
311 case GeomAbs_Ellipse: {
312 Param=ElCLib::EllipseParameter(Axis
316 if (Param < 0.0) { Param+=M_PI+M_PI; }
320 case GeomAbs_Parabola: {
321 Param=ElCLib::ParabolaParameter(Axis,P);
324 case GeomAbs_Hyperbola: {
325 Param=ElCLib::HyperbolaParameter(Axis