1 // Created on: 1991-09-09
2 // Created by: Michel Chauvat
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 // Evolutions JCV Dec 1991 ajout de calculs de derivees et traitement
19 // JCV Mars 1992 ajout method SetLinearForm
21 #define No_Standard_OutOfRange
28 #include <gp_Ax2d.hxx>
29 #include <gp_Ax22d.hxx>
30 #include <gp_Circ.hxx>
31 #include <gp_Circ2d.hxx>
33 #include <gp_Dir2d.hxx>
34 #include <gp_Elips.hxx>
35 #include <gp_Elips2d.hxx>
36 #include <gp_Hypr.hxx>
37 #include <gp_Hypr2d.hxx>
39 #include <gp_Lin2d.hxx>
40 #include <gp_Parab.hxx>
41 #include <gp_Parab2d.hxx>
43 #include <gp_Pnt2d.hxx>
45 #include <gp_Vec2d.hxx>
47 static Standard_Real PIPI = M_PI + M_PI;
49 //=======================================================================
51 //purpose : Value theULast is never returned.
52 // Example of some case (checked on WIN64 platform)
53 // with some surface having period 2*PI = 6.2831853071795862.
54 // Let theUFirst be equal to 6.1645624650899675. Then,
55 // theULast must be equal to
56 // 6.1645624650899675+6.2831853071795862=12.4477477722695537.
58 // However, real result is 12.447747772269555.
59 // Therefore, new period value to adjust will be equal to
60 // 12.447747772269555-6.1645624650899675=6.2831853071795871.
62 // As we can see, (6.2831853071795871 != 6.2831853071795862).
64 // According to above said, this method should be used carefully.
65 // In order to increase reliability of this method, input arguments
66 // needs to be replaced with following:
67 // (theU, theUFirst, thePeriod). theULast parameter is excess.
68 //=======================================================================
69 Standard_Real ElCLib::InPeriod(const Standard_Real theU,
70 const Standard_Real theUFirst,
71 const Standard_Real theULast)
73 if( Precision::IsInfinite(theU) ||
74 Precision::IsInfinite(theUFirst) ||
75 Precision::IsInfinite(theULast))
76 {//In order to avoid FLT_Overflow exception
80 const Standard_Real aPeriod = theULast - theUFirst;
82 if(aPeriod < Epsilon(theULast))
85 return Max(theUFirst, theU + aPeriod*Ceiling((theUFirst-theU)/aPeriod));
88 //=======================================================================
89 //function : AdjustPeriodic
91 //=======================================================================
93 void ElCLib::AdjustPeriodic(const Standard_Real UFirst,
94 const Standard_Real ULast,
95 const Standard_Real Preci,
99 if (Precision::IsInfinite(UFirst) ||
100 Precision::IsInfinite(ULast))
107 Standard_Real period = ULast - UFirst;
109 if (period < Epsilon(ULast))
111 // In order to avoid FLT_Overflow exception
112 // (test bugs moddata_1 bug22757)
118 U1 -= Floor((U1-UFirst)/period) * period;
119 if (ULast - U1 < Preci) U1 -= period;
120 U2 -= Floor((U2-U1)/period) * period;
121 if (U2 - U1 < Preci) U2 += period;
124 //=======================================================================
125 //function : LineValue
127 //=======================================================================
129 gp_Pnt ElCLib::LineValue (const Standard_Real U,
132 const gp_XYZ& ZDir = Pos.Direction().XYZ();
133 const gp_XYZ& PLoc = Pos.Location ().XYZ();
134 return gp_Pnt(U * ZDir.X() + PLoc.X(),
135 U * ZDir.Y() + PLoc.Y(),
136 U * ZDir.Z() + PLoc.Z());
139 //=======================================================================
140 //function : CircleValue
142 //=======================================================================
144 gp_Pnt ElCLib::CircleValue (const Standard_Real U,
146 const Standard_Real Radius)
148 const gp_XYZ& XDir = Pos.XDirection().XYZ();
149 const gp_XYZ& YDir = Pos.YDirection().XYZ();
150 const gp_XYZ& PLoc = Pos.Location ().XYZ();
151 Standard_Real A1 = Radius * cos(U);
152 Standard_Real A2 = Radius * sin(U);
153 return gp_Pnt(A1 * XDir.X() + A2 * YDir.X() + PLoc.X(),
154 A1 * XDir.Y() + A2 * YDir.Y() + PLoc.Y(),
155 A1 * XDir.Z() + A2 * YDir.Z() + PLoc.Z());
158 //=======================================================================
159 //function : EllipseValue
161 //=======================================================================
163 gp_Pnt ElCLib::EllipseValue (const Standard_Real U,
165 const Standard_Real MajorRadius,
166 const Standard_Real MinorRadius)
168 const gp_XYZ& XDir = Pos.XDirection().XYZ();
169 const gp_XYZ& YDir = Pos.YDirection().XYZ();
170 const gp_XYZ& PLoc = Pos.Location ().XYZ();
171 Standard_Real A1 = MajorRadius * cos(U);
172 Standard_Real A2 = MinorRadius * sin(U);
173 return gp_Pnt(A1 * XDir.X() + A2 * YDir.X() + PLoc.X(),
174 A1 * XDir.Y() + A2 * YDir.Y() + PLoc.Y(),
175 A1 * XDir.Z() + A2 * YDir.Z() + PLoc.Z());
178 //=======================================================================
179 //function : HyperbolaValue
181 //=======================================================================
183 gp_Pnt ElCLib::HyperbolaValue (const Standard_Real U,
185 const Standard_Real MajorRadius,
186 const Standard_Real MinorRadius)
188 const gp_XYZ& XDir = Pos.XDirection().XYZ();
189 const gp_XYZ& YDir = Pos.YDirection().XYZ();
190 const gp_XYZ& PLoc = Pos.Location ().XYZ();
191 Standard_Real A1 = MajorRadius * Cosh(U);
192 Standard_Real A2 = MinorRadius * Sinh(U);
193 return gp_Pnt(A1 * XDir.X() + A2 * YDir.X() + PLoc.X(),
194 A1 * XDir.Y() + A2 * YDir.Y() + PLoc.Y(),
195 A1 * XDir.Z() + A2 * YDir.Z() + PLoc.Z());
198 //=======================================================================
199 //function : ParabolaValue
201 //=======================================================================
203 gp_Pnt ElCLib::ParabolaValue (const Standard_Real U,
205 const Standard_Real Focal)
208 const gp_XYZ& XDir = Pos.XDirection().XYZ();
209 const gp_XYZ& PLoc = Pos.Location ().XYZ();
210 return gp_Pnt(U * XDir.X() + PLoc.X(),
211 U * XDir.Y() + PLoc.Y(),
212 U * XDir.Z() + PLoc.Z());
214 const gp_XYZ& XDir = Pos.XDirection().XYZ();
215 const gp_XYZ& YDir = Pos.YDirection().XYZ();
216 const gp_XYZ& PLoc = Pos.Location ().XYZ();
217 Standard_Real A1 = U * U / (4.0 * Focal);
218 return gp_Pnt(A1 * XDir.X() + U * YDir.X() + PLoc.X(),
219 A1 * XDir.Y() + U * YDir.Y() + PLoc.Y(),
220 A1 * XDir.Z() + U * YDir.Z() + PLoc.Z());
223 //=======================================================================
226 //=======================================================================
228 void ElCLib::LineD1 (const Standard_Real U,
233 gp_XYZ Coord = Pos.Direction().XYZ();
235 Coord.SetLinearForm (U, Coord, Pos.Location().XYZ());
239 //=======================================================================
240 //function : CircleD1
242 //=======================================================================
244 void ElCLib::CircleD1 (const Standard_Real U,
246 const Standard_Real Radius,
250 Standard_Real Xc = Radius * Cos (U);
251 Standard_Real Yc = Radius * Sin (U);
253 gp_XYZ Coord1 (Pos.XDirection().XYZ());
254 gp_XYZ Coord2 (Pos.YDirection().XYZ());
256 Coord0.SetLinearForm (Xc, Coord1, Yc, Coord2, Pos.Location().XYZ());
259 Coord0.SetLinearForm (-Yc, Coord1, Xc, Coord2);
263 //=======================================================================
264 //function : EllipseD1
266 //=======================================================================
268 void ElCLib::EllipseD1 (const Standard_Real U,
270 const Standard_Real MajorRadius,
271 const Standard_Real MinorRadius,
275 Standard_Real Xc = Cos (U);
276 Standard_Real Yc = Sin (U);
278 gp_XYZ Coord1 (Pos.XDirection().XYZ());
279 gp_XYZ Coord2 (Pos.YDirection().XYZ());
281 Coord0.SetLinearForm (Xc*MajorRadius, Coord1,
282 Yc*MinorRadius, Coord2,
283 Pos.Location().XYZ());
286 Coord0.SetLinearForm (-Yc*MajorRadius, Coord1, Xc*MinorRadius, Coord2);
290 //=======================================================================
291 //function : HyperbolaD1
293 //=======================================================================
295 void ElCLib::HyperbolaD1 (const Standard_Real U,
297 const Standard_Real MajorRadius,
298 const Standard_Real MinorRadius,
302 Standard_Real Xc = Cosh (U);
303 Standard_Real Yc = Sinh (U);
305 gp_XYZ Coord1 (Pos.XDirection().XYZ());
306 gp_XYZ Coord2 (Pos.YDirection().XYZ());
308 Coord0.SetLinearForm (Xc*MajorRadius, Coord1,
309 Yc*MinorRadius, Coord2,
310 Pos.Location().XYZ());
313 Coord0.SetLinearForm (Yc*MajorRadius, Coord1, Xc*MinorRadius, Coord2);
317 //=======================================================================
318 //function : ParabolaD1
320 //=======================================================================
322 void ElCLib::ParabolaD1 (const Standard_Real U,
324 const Standard_Real Focal,
329 gp_XYZ Coord1 (Pos.XDirection().XYZ());
330 if (Focal == 0.0) { //Parabole degenere en une droite
333 Coord1.Add (Pos.Location().XYZ());
337 gp_XYZ Coord2 (Pos.YDirection().XYZ());
338 Coord0.SetLinearForm (U / (2.0 * Focal), Coord1, Coord2);
340 Coord0.SetLinearForm ((U * U) / (4.0 * Focal), Coord1,
342 Pos.Location().XYZ());
347 //=======================================================================
348 //function : CircleD2
350 //=======================================================================
352 void ElCLib::CircleD2 (const Standard_Real U,
354 const Standard_Real Radius,
359 Standard_Real Xc = Radius * cos(U);
360 Standard_Real Yc = Radius * sin(U);
362 gp_XYZ Coord1 (Pos.XDirection().XYZ());
363 gp_XYZ Coord2 (Pos.YDirection().XYZ());
365 Coord0.SetLinearForm (Xc, Coord1, Yc, Coord2, Pos.Location().XYZ());
368 Coord0.SetLinearForm (-Yc, Coord1, Xc, Coord2);
371 Coord0.SetLinearForm (-Xc, Coord1, -Yc, Coord2);
375 //=======================================================================
376 //function : EllipseD2
378 //=======================================================================
380 void ElCLib::EllipseD2 (const Standard_Real U,
382 const Standard_Real MajorRadius,
383 const Standard_Real MinorRadius,
388 Standard_Real Xc = cos(U);
389 Standard_Real Yc = sin(U);
391 gp_XYZ Coord1 (Pos.XDirection().XYZ());
392 gp_XYZ Coord2 (Pos.YDirection().XYZ());
394 Coord0.SetLinearForm (Xc*MajorRadius, Coord1,
395 Yc*MinorRadius, Coord2,
396 Pos.Location().XYZ());
399 Coord0.SetLinearForm (-Yc*MajorRadius, Coord1, Xc*MinorRadius, Coord2);
402 Coord0.SetLinearForm (-Xc*MajorRadius, Coord1, -Yc*MinorRadius, Coord2);
406 //=======================================================================
407 //function : HyperbolaD2
409 //=======================================================================
411 void ElCLib::HyperbolaD2 (const Standard_Real U,
413 const Standard_Real MajorRadius,
414 const Standard_Real MinorRadius,
419 Standard_Real Xc = Cosh(U);
420 Standard_Real Yc = Sinh(U);
422 gp_XYZ Coord1 (Pos.XDirection().XYZ());
423 gp_XYZ Coord2 (Pos.YDirection().XYZ());
425 //Point courant et D2:
426 Coord0.SetLinearForm (Xc*MajorRadius, Coord1, Yc*MinorRadius, Coord2);
428 Coord0.Add (Pos.Location().XYZ());
431 Coord0.SetLinearForm (Yc*MajorRadius, Coord1, Xc*MinorRadius, Coord2);
435 //=======================================================================
436 //function : ParabolaD2
438 //=======================================================================
440 void ElCLib::ParabolaD2 (const Standard_Real U,
442 const Standard_Real Focal,
447 gp_XYZ Coord0(0.0, 0.0, 0.0);
448 gp_XYZ Coord1 (Pos.XDirection().XYZ());
450 V2.SetCoord (0.0, 0.0, 0.0);
453 Coord1.Add (Pos.Location().XYZ());
454 P.SetXYZ (Coord1);//was: P.SetXYZ (Coord0);
458 gp_XYZ Coord2 (Pos.YDirection().XYZ());
459 Coord0.SetLinearForm ((U * U) / (4.0 * Focal), Coord1,
461 Pos.Location().XYZ());
463 Coord0.SetLinearForm (U / (2.0 * Focal), Coord1, Coord2);
465 Coord1.Multiply (1.0 / (2.0 * Focal));
470 //=======================================================================
471 //function : CircleD3
473 //=======================================================================
475 void ElCLib::CircleD3 (const Standard_Real U,
477 const Standard_Real Radius,
483 Standard_Real Xc = Radius * cos(U);
484 Standard_Real Yc = Radius * sin(U);
486 gp_XYZ Coord1 (Pos.XDirection().XYZ());
487 gp_XYZ Coord2 (Pos.YDirection().XYZ());
489 Coord0.SetLinearForm (Xc, Coord1, Yc, Coord2, Pos.Location().XYZ());
492 Coord0.SetLinearForm (-Yc, Coord1, Xc, Coord2);
495 Coord0.SetLinearForm (-Xc, Coord1, -Yc, Coord2);
498 Coord0.SetLinearForm (Yc, Coord1, -Xc, Coord2);
502 //=======================================================================
503 //function : EllipseD3
505 //=======================================================================
507 void ElCLib::EllipseD3 (const Standard_Real U,
509 const Standard_Real MajorRadius,
510 const Standard_Real MinorRadius,
516 Standard_Real Xc = cos(U);
517 Standard_Real Yc = sin(U);
519 gp_XYZ Coord1 (Pos.XDirection().XYZ());
520 gp_XYZ Coord2 (Pos.YDirection().XYZ());
522 Coord0.SetLinearForm (Xc*MajorRadius, Coord1,
523 Yc*MinorRadius, Coord2,
524 Pos.Location().XYZ());
527 Coord0.SetLinearForm (-Yc*MajorRadius, Coord1, Xc*MinorRadius, Coord2);
530 Coord0.SetLinearForm (-Xc*MajorRadius, Coord1, -Yc*MinorRadius, Coord2);
533 Coord0.SetLinearForm (Yc*MajorRadius, Coord1, -Xc*MinorRadius, Coord2);
537 //=======================================================================
538 //function : HyperbolaD3
540 //=======================================================================
542 void ElCLib::HyperbolaD3 (const Standard_Real U,
544 const Standard_Real MajorRadius,
545 const Standard_Real MinorRadius,
551 Standard_Real Xc = Cosh(U);
552 Standard_Real Yc = Sinh(U);
554 gp_XYZ Coord1 (Pos.XDirection().XYZ());
555 gp_XYZ Coord2 (Pos.YDirection().XYZ());
556 //Point courant et D2 :
557 Coord0.SetLinearForm (Xc*MajorRadius, Coord1, Yc*MinorRadius, Coord2);
559 Coord0.Add (Pos.Location().XYZ());
562 Coord0.SetLinearForm (Yc*MajorRadius, Coord1, Xc*MinorRadius, Coord2);
567 //=======================================================================
568 //function : LineValue
570 //=======================================================================
572 gp_Pnt2d ElCLib::LineValue (const Standard_Real U,
575 const gp_XY& ZDir = Pos.Direction().XY();
576 const gp_XY& PLoc = Pos.Location ().XY();
577 return gp_Pnt2d(U * ZDir.X() + PLoc.X(),
578 U * ZDir.Y() + PLoc.Y());
581 //=======================================================================
582 //function : CircleValue
584 //=======================================================================
586 gp_Pnt2d ElCLib::CircleValue (const Standard_Real U,
588 const Standard_Real Radius)
590 const gp_XY& XDir = Pos.XDirection().XY();
591 const gp_XY& YDir = Pos.YDirection().XY();
592 const gp_XY& PLoc = Pos.Location ().XY();
593 Standard_Real A1 = Radius * cos(U);
594 Standard_Real A2 = Radius * sin(U);
595 return gp_Pnt2d(A1 * XDir.X() + A2 * YDir.X() + PLoc.X(),
596 A1 * XDir.Y() + A2 * YDir.Y() + PLoc.Y());
599 //=======================================================================
600 //function : EllipseValue
602 //=======================================================================
604 gp_Pnt2d ElCLib::EllipseValue (const Standard_Real U,
606 const Standard_Real MajorRadius,
607 const Standard_Real MinorRadius)
609 const gp_XY& XDir = Pos.XDirection().XY();
610 const gp_XY& YDir = Pos.YDirection().XY();
611 const gp_XY& PLoc = Pos.Location ().XY();
612 Standard_Real A1 = MajorRadius * cos(U);
613 Standard_Real A2 = MinorRadius * sin(U);
614 return gp_Pnt2d(A1 * XDir.X() + A2 * YDir.X() + PLoc.X(),
615 A1 * XDir.Y() + A2 * YDir.Y() + PLoc.Y());
618 //=======================================================================
619 //function : HyperbolaValue
621 //=======================================================================
623 gp_Pnt2d ElCLib::HyperbolaValue (const Standard_Real U,
625 const Standard_Real MajorRadius,
626 const Standard_Real MinorRadius)
628 const gp_XY& XDir = Pos.XDirection().XY();
629 const gp_XY& YDir = Pos.YDirection().XY();
630 const gp_XY& PLoc = Pos.Location ().XY();
631 Standard_Real A1 = MajorRadius * Cosh(U);
632 Standard_Real A2 = MinorRadius * Sinh(U);
633 return gp_Pnt2d(A1 * XDir.X() + A2 * YDir.X() + PLoc.X(),
634 A1 * XDir.Y() + A2 * YDir.Y() + PLoc.Y());
637 //=======================================================================
638 //function : ParabolaValue
640 //=======================================================================
642 gp_Pnt2d ElCLib::ParabolaValue (const Standard_Real U,
644 const Standard_Real Focal)
647 const gp_XY& XDir = Pos.XDirection().XY();
648 const gp_XY& PLoc = Pos.Location ().XY();
649 return gp_Pnt2d(U * XDir.X() + PLoc.X(),
650 U * XDir.Y() + PLoc.Y());
652 const gp_XY& XDir = Pos.XDirection().XY();
653 const gp_XY& YDir = Pos.YDirection().XY();
654 const gp_XY& PLoc = Pos.Location ().XY();
655 Standard_Real A1 = U * U / (4.0 * Focal);
656 return gp_Pnt2d(A1 * XDir.X() + U * YDir.X() + PLoc.X(),
657 A1 * XDir.Y() + U * YDir.Y() + PLoc.Y());
660 //=======================================================================
663 //=======================================================================
665 void ElCLib::LineD1(const Standard_Real U,
670 gp_XY Coord = Pos.Direction().XY();
672 Coord.SetLinearForm (U, Coord, Pos.Location().XY());
676 //=======================================================================
677 //function : CircleD1
679 //=======================================================================
681 void ElCLib::CircleD1 (const Standard_Real U,
683 const Standard_Real Radius,
688 gp_XY Xdir (Pos.XDirection().XY());
689 gp_XY Ydir (Pos.YDirection().XY());
690 Standard_Real Xc = Radius * cos(U);
691 Standard_Real Yc = Radius * sin(U);
693 Vxy.SetLinearForm (Xc, Xdir, Yc, Ydir, Pos.Location().XY());
696 Vxy.SetLinearForm (-Yc, Xdir, Xc, Ydir);
700 //=======================================================================
701 //function : EllipseD1
703 //=======================================================================
705 void ElCLib::EllipseD1 (const Standard_Real U,
707 const Standard_Real MajorRadius,
708 const Standard_Real MinorRadius,
713 gp_XY Xdir ((Pos.XDirection()).XY());
714 gp_XY Ydir ((Pos.YDirection()).XY());
715 Standard_Real Xc = cos(U);
716 Standard_Real Yc = sin(U);
718 Vxy.SetLinearForm (Xc*MajorRadius, Xdir,
719 Yc*MinorRadius, Ydir,
720 Pos.Location().XY());
724 Vxy.SetLinearForm (-Yc*MajorRadius, Xdir, Xc*MinorRadius, Ydir);
728 //=======================================================================
729 //function : HyperbolaD1
731 //=======================================================================
733 void ElCLib::HyperbolaD1 (const Standard_Real U,
735 const Standard_Real MajorRadius,
736 const Standard_Real MinorRadius,
741 gp_XY Xdir ((Pos.XDirection()).XY());
742 gp_XY Ydir ((Pos.YDirection()).XY());
743 Standard_Real Xc = Cosh(U);
744 Standard_Real Yc = Sinh(U);
746 Vxy.SetLinearForm (Xc*MajorRadius, Xdir,
747 Yc*MinorRadius, Ydir,
748 Pos.Location().XY());
752 Vxy.SetLinearForm (Yc*MajorRadius, Xdir, Xc*MinorRadius, Ydir);
756 //=======================================================================
757 //function : ParabolaD1
759 //=======================================================================
761 void ElCLib::ParabolaD1 (const Standard_Real U,
763 const Standard_Real Focal,
768 gp_XY Xdir (Pos.XDirection().XY());
769 if (Focal == 0.0) { //Parabole degenere en une droite
771 Vxy.SetLinearForm (U, Xdir, Pos.Location().XY());
774 gp_XY Ydir (Pos.YDirection().XY());
775 Vxy.SetLinearForm (U / (2.0 * Focal), Xdir, Ydir);
777 Vxy.SetLinearForm ((U * U) / (4.0 * Focal), Xdir,
779 Pos.Location().XY());
784 //=======================================================================
785 //function : CircleD2
787 //=======================================================================
789 void ElCLib::CircleD2 (const Standard_Real U,
791 const Standard_Real Radius,
797 gp_XY Xdir (Pos.XDirection().XY());
798 gp_XY Ydir (Pos.YDirection().XY());
799 Standard_Real Xc = Radius * cos(U);
800 Standard_Real Yc = Radius * sin(U);
802 Vxy.SetLinearForm (Xc, Xdir, Yc, Ydir);
805 Vxy.Add (Pos.Location().XY());
809 Vxy.SetLinearForm (-Yc, Xdir, Xc, Ydir);
813 //=======================================================================
814 //function : EllipseD2
816 //=======================================================================
818 void ElCLib::EllipseD2 (const Standard_Real U,
820 const Standard_Real MajorRadius,
821 const Standard_Real MinorRadius,
827 gp_XY Xdir (Pos.XDirection().XY());
828 gp_XY Ydir (Pos.YDirection().XY());
829 Standard_Real Xc = cos(U);
830 Standard_Real Yc = sin(U);
833 Vxy.SetLinearForm (Xc*MajorRadius, Xdir, Yc*MinorRadius, Ydir);
838 Vxy.Add (Pos.Location().XY());
842 Vxy.SetLinearForm (-Yc*MajorRadius, Xdir, Xc*MinorRadius, Ydir);
846 //=======================================================================
847 //function : HyperbolaD2
849 //=======================================================================
851 void ElCLib::HyperbolaD2 (const Standard_Real U,
853 const Standard_Real MajorRadius,
854 const Standard_Real MinorRadius,
860 gp_XY Xdir (Pos.XDirection().XY());
861 gp_XY Ydir (Pos.YDirection().XY());
862 Standard_Real Xc = Cosh(U);
863 Standard_Real Yc = Sinh(U);
866 Vxy.SetLinearForm (Xc*MajorRadius, Xdir, Yc*MinorRadius, Ydir);
870 Vxy.Add (Pos.Location().XY());
874 Vxy.SetLinearForm (Yc*MajorRadius, Xdir, Xc*MinorRadius, Ydir);
878 //=======================================================================
879 //function : ParabolaD2
881 //=======================================================================
883 void ElCLib::ParabolaD2 (const Standard_Real U,
885 const Standard_Real Focal,
891 gp_XY Xdir (Pos.XDirection().XY());
893 V2.SetCoord (0.0, 0.0);
895 Vxy.SetLinearForm (U, Xdir, Pos.Location().XY());
898 gp_XY Ydir (Pos.YDirection().XY());
899 Vxy = Xdir.Multiplied (1.0 / (2.0 * Focal));
901 Vxy.SetLinearForm (U, Vxy, Ydir);
903 Vxy.SetLinearForm (U * U / (4.0 * Focal), Xdir, U, Ydir);
904 Vxy.Add (Pos.Location().XY());
909 //=======================================================================
910 //function : CircleD3
912 //=======================================================================
914 void ElCLib::CircleD3 (const Standard_Real U,
916 const Standard_Real Radius,
923 gp_XY Xdir (Pos.XDirection().XY());
924 gp_XY Ydir (Pos.YDirection().XY());
925 Standard_Real Xc = Radius * cos(U);
926 Standard_Real Yc = Radius * sin(U);
929 Vxy.SetLinearForm (Xc, Xdir, Yc, Ydir);
934 Vxy.Add (Pos.Location().XY());
938 Vxy.SetLinearForm (-Yc, Xdir, Xc, Ydir);
946 //=======================================================================
947 //function : EllipseD3
949 //=======================================================================
951 void ElCLib::EllipseD3 (const Standard_Real U,
953 const Standard_Real MajorRadius,
954 const Standard_Real MinorRadius,
961 gp_XY Xdir (Pos.XDirection().XY());
962 gp_XY Ydir (Pos.YDirection().XY());
963 Standard_Real Xc = cos(U);
964 Standard_Real Yc = sin(U);
967 Vxy.SetLinearForm (Xc*MajorRadius, Xdir, Yc*MinorRadius, Ydir);
972 Vxy.Add (Pos.Location().XY());
976 Vxy.SetLinearForm (-Yc*MajorRadius, Xdir, Xc*MinorRadius, Ydir);
984 //=======================================================================
985 //function : HyperbolaD3
987 //=======================================================================
989 void ElCLib::HyperbolaD3 (const Standard_Real U,
991 const Standard_Real MajorRadius,
992 const Standard_Real MinorRadius,
999 gp_XY Xdir (Pos.XDirection().XY());
1000 gp_XY Ydir (Pos.YDirection().XY());
1001 Standard_Real Xc = Cosh(U);
1002 Standard_Real Yc = Sinh(U);
1005 Vxy.SetLinearForm (Xc*MajorRadius, Xdir, Yc*MinorRadius, Ydir);
1009 Vxy.Add (Pos.Location().XY());
1013 Vxy.SetLinearForm (Yc*MajorRadius, Xdir, Xc*MinorRadius, Ydir);
1020 //=======================================================================
1023 //=======================================================================
1025 gp_Vec ElCLib::LineDN (const Standard_Real,
1027 const Standard_Integer N)
1029 if (N == 1) { return gp_Vec(Pos.Direction()); }
1030 return gp_Vec (0., 0., 0.);
1033 //=======================================================================
1034 //function : CircleDN
1036 //=======================================================================
1038 gp_Vec ElCLib::CircleDN (const Standard_Real U,
1040 const Standard_Real Radius,
1041 const Standard_Integer N)
1043 Standard_Real Xc=0, Yc=0;
1045 Xc = Radius * -sin(U);
1046 Yc = Radius * cos(U);
1048 else if ((N + 2) % 4 == 0) {
1049 Xc = Radius * -cos(U);
1050 Yc = Radius * -sin(U);
1052 else if ((N + 1) % 4 == 0) {
1053 Xc = Radius * sin(U);
1054 Yc = Radius * -cos(U);
1056 else if (N % 4 == 0) {
1057 Xc = Radius * cos(U);
1058 Yc = Radius * sin(U);
1060 else if ((N-1) % 4 == 0) {
1061 Xc = Radius * -sin(U);
1062 Yc = Radius * cos(U);
1064 gp_XYZ Coord1 (Pos.XDirection().XYZ());
1065 Coord1.SetLinearForm (Xc, Coord1, Yc, Pos.YDirection().XYZ());
1066 return gp_Vec (Coord1);
1069 //=======================================================================
1070 //function : EllipseDN
1072 //=======================================================================
1074 gp_Vec ElCLib::EllipseDN (const Standard_Real U,
1076 const Standard_Real MajorRadius,
1077 const Standard_Real MinorRadius,
1078 const Standard_Integer N)
1080 Standard_Real Xc=0, Yc=0;
1082 Xc = MajorRadius * -sin(U);
1083 Yc = MinorRadius * cos(U);
1085 else if ((N + 2) % 4 == 0) {
1086 Xc = MajorRadius * -cos(U);
1087 Yc = MinorRadius * -sin(U);
1089 else if ((N + 1) % 4 == 0) {
1090 Xc = MajorRadius * sin(U);
1091 Yc = MinorRadius * -cos(U);
1093 else if (N % 4 == 0) {
1094 Xc = MajorRadius * cos(U);
1095 Yc = MinorRadius * sin(U);
1097 else if ((N-1) % 4 == 0) {
1098 Xc = MajorRadius * -sin(U);
1099 Yc = MinorRadius * cos(U);
1101 gp_XYZ Coord1 (Pos.XDirection().XYZ());
1102 Coord1.SetLinearForm (Xc, Coord1, Yc, Pos.YDirection().XYZ());
1103 return gp_Vec (Coord1);
1106 //=======================================================================
1107 //function : HyperbolaDN
1109 //=======================================================================
1111 gp_Vec ElCLib::HyperbolaDN (const Standard_Real U,
1113 const Standard_Real MajorRadius,
1114 const Standard_Real MinorRadius,
1115 const Standard_Integer N)
1117 Standard_Real Xc=0, Yc=0;
1119 Xc = MajorRadius * Sinh(U);
1120 Yc = MinorRadius * Cosh(U);
1122 else if (IsEven (N)) {
1123 Xc = MajorRadius * Cosh(U);
1124 Yc = MinorRadius * Sinh(U);
1126 gp_XYZ Coord1 (Pos.XDirection().XYZ());
1127 Coord1.SetLinearForm (Xc, Coord1, Yc, Pos.YDirection().XYZ());
1128 return gp_Vec (Coord1);
1131 //=======================================================================
1132 //function : ParabolaDN
1134 //=======================================================================
1136 gp_Vec ElCLib::ParabolaDN (const Standard_Real U,
1138 const Standard_Real Focal,
1139 const Standard_Integer N)
1142 gp_XYZ Coord1 (Pos.XDirection().XYZ());
1145 return gp_Vec(Coord1);
1148 Coord1.SetLinearForm
1149 (U / (2.0 * Focal), Coord1, Pos.YDirection().XYZ());
1150 return gp_Vec (Coord1);
1155 return gp_Vec(0.0, 0.0, 0.0);
1158 Coord1.Multiply ( 1.0 / (2.0 * Focal));
1159 return gp_Vec (Coord1);
1163 return gp_Vec (0.,0.,0.);
1166 //=======================================================================
1169 //=======================================================================
1171 gp_Vec2d ElCLib::LineDN (const Standard_Real,
1173 const Standard_Integer N)
1175 if (N == 1) { return gp_Vec2d (Pos.Direction ()); }
1176 return gp_Vec2d (0.0, 0.0);
1179 //=======================================================================
1180 //function : CircleDN
1182 //=======================================================================
1184 gp_Vec2d ElCLib::CircleDN (const Standard_Real U,
1185 const gp_Ax22d& Pos,
1186 const Standard_Real Radius,
1187 const Standard_Integer N)
1189 Standard_Real Xc=0, Yc=0;
1191 Xc = Radius * -sin(U);
1192 Yc = Radius * cos(U);
1194 else if ((N + 2) % 4 == 0) {
1195 Xc = Radius * -cos(U);
1196 Yc = Radius * -sin(U);
1198 else if ((N + 1) % 4 == 0) {
1199 Xc = Radius * sin(U);
1200 Yc = Radius * -cos(U);
1202 else if (N % 4 == 0) {
1203 Xc = Radius * cos(U);
1204 Yc = Radius * sin(U);
1206 else if ((N-1) % 4 == 0) {
1207 Xc = Radius * -sin(U);
1208 Yc = Radius * cos(U);
1210 gp_XY Xdir (Pos.XDirection().XY());
1211 gp_XY Ydir (Pos.YDirection().XY());
1212 Xdir.SetLinearForm (Xc, Xdir, Yc, Ydir);
1213 return gp_Vec2d (Xdir);
1216 //=======================================================================
1217 //function : EllipseDN
1219 //=======================================================================
1221 gp_Vec2d ElCLib::EllipseDN (const Standard_Real U,
1222 const gp_Ax22d& Pos,
1223 const Standard_Real MajorRadius,
1224 const Standard_Real MinorRadius,
1225 const Standard_Integer N)
1227 Standard_Real Xc=0, Yc=0;
1229 Xc = MajorRadius * -sin(U);
1230 Yc = MinorRadius * cos(U);
1232 else if ((N + 2) % 4 == 0) {
1233 Xc = MajorRadius * -cos(U);
1234 Yc = MinorRadius * -sin(U);
1236 else if ((N + 1) % 4 == 0) {
1237 Xc = MajorRadius * sin(U);
1238 Yc = MinorRadius * -cos(U);
1240 else if (N % 4 == 0) {
1241 Xc = MajorRadius * cos(U);
1242 Yc = MinorRadius * sin(U);
1244 else if ((N-1) % 4 == 0) {
1245 Xc = MajorRadius * -sin(U);
1246 Yc = MinorRadius * cos(U);
1248 gp_XY Xdir (Pos.XDirection().XY());
1249 gp_XY Ydir (Pos.YDirection().XY());
1250 Xdir.SetLinearForm (Xc, Xdir, Yc, Ydir);
1251 return gp_Vec2d (Xdir);
1254 //=======================================================================
1255 //function : HyperbolaDN
1257 //=======================================================================
1259 gp_Vec2d ElCLib::HyperbolaDN (const Standard_Real U,
1260 const gp_Ax22d& Pos,
1261 const Standard_Real MajorRadius,
1262 const Standard_Real MinorRadius,
1263 const Standard_Integer N)
1265 Standard_Real Xc=0, Yc=0;
1267 Xc = MajorRadius * Sinh(U);
1268 Yc = MinorRadius * Cosh(U);
1270 else if (IsEven (N)) {
1271 Xc = MajorRadius * Cosh(U);
1272 Yc = MinorRadius * Sinh(U);
1274 gp_XY Xdir (Pos.XDirection().XY());
1275 gp_XY Ydir (Pos.YDirection().XY());
1276 Xdir.SetLinearForm (Xc, Xdir, Yc, Ydir);
1277 return gp_Vec2d (Xdir);
1280 //=======================================================================
1281 //function : ParabolaDN
1283 //=======================================================================
1285 gp_Vec2d ElCLib::ParabolaDN (const Standard_Real U,
1286 const gp_Ax22d& Pos,
1287 const Standard_Real Focal,
1288 const Standard_Integer N)
1291 gp_XY Xdir (Pos.XDirection().XY());
1294 return gp_Vec2d (Xdir);
1297 gp_XY Ydir (Pos.YDirection().XY());
1298 Xdir.SetLinearForm (U / (2.0 * Focal), Xdir, Ydir);
1299 return gp_Vec2d (Xdir);
1304 return gp_Vec2d (0.0, 0.0);
1307 Xdir.Multiply ( 1.0 / (2.0 * Focal));
1308 return gp_Vec2d (Xdir);
1312 return gp_Vec2d (0.0, 0.0);
1315 //=======================================================================
1316 //function : LineParameter
1318 //=======================================================================
1320 Standard_Real ElCLib::LineParameter (const gp_Ax1& L, const gp_Pnt& P)
1322 return (P.XYZ() - L.Location().XYZ()).Dot (L.Direction().XYZ());
1325 //=======================================================================
1326 //function : CircleParameter
1328 //=======================================================================
1329 Standard_Real ElCLib::CircleParameter(const gp_Ax2& Pos,
1332 gp_Vec aVec(Pos.Location(), P);
1333 if (aVec.SquareMagnitude() < gp::Resolution())
1334 // coinciding points -> infinite number of parameters
1337 const gp_Dir& dir = Pos.Direction();
1338 // Project vector on circle's plane
1339 gp_XYZ aVProj = dir.XYZ().CrossCrossed(aVec.XYZ(), dir.XYZ());
1341 if (aVProj.SquareModulus() < gp::Resolution())
1344 // Angle between X direction and projected vector
1345 Standard_Real Teta = (Pos.XDirection()).AngleWithRef(aVProj, dir);
1347 if (Teta < -1.e-16) Teta += PIPI;
1348 else if (Teta < 0) Teta = 0;
1352 //=======================================================================
1353 //function : EllipseParameter
1355 //=======================================================================
1357 Standard_Real ElCLib::EllipseParameter (const gp_Ax2& Pos,
1358 const Standard_Real MajorRadius,
1359 const Standard_Real MinorRadius,
1362 gp_XYZ OP = P.XYZ()-Pos.Location().XYZ();
1363 gp_XYZ xaxis = Pos.XDirection().XYZ();
1364 gp_XYZ yaxis = Pos.YDirection().XYZ();
1365 Standard_Real NY = OP.Dot(yaxis);
1366 Standard_Real NX = OP.Dot(xaxis);
1368 if( (Abs(NX) <= gp::Resolution())
1369 &&(Abs(NY) <= gp::Resolution()))
1370 //-- The point P is on the Axis of the Ellipse.
1373 yaxis.Multiply (NY * (MajorRadius/MinorRadius));
1374 gp_XYZ Om = xaxis.Multiplied (NX);
1376 Standard_Real Teta = gp_Vec(xaxis).AngleWithRef
1377 (gp_Vec(Om), gp_Vec(Pos.Direction()));
1378 if (Teta < -1.e-16) Teta += PIPI;
1379 else if (Teta < 0) Teta = 0;
1383 //=======================================================================
1384 //function : HyperbolaParameter
1386 //=======================================================================
1388 Standard_Real ElCLib::HyperbolaParameter (const gp_Ax2& Pos,
1389 const Standard_Real,
1390 const Standard_Real MinorRadius,
1394 gp_Vec(Pos.Location (), P).Dot
1395 (gp_Vec (Pos.YDirection())) / MinorRadius;
1397 #if defined(__QNX__)
1398 return std::asinh(sht);
1404 //=======================================================================
1405 //function : ParabolaParameter
1407 //=======================================================================
1409 Standard_Real ElCLib::ParabolaParameter (const gp_Ax2& Pos,
1412 return gp_Vec(Pos.Location(),P).Dot(gp_Vec(Pos.YDirection()));
1415 //=======================================================================
1416 //function : LineParameter
1418 //=======================================================================
1420 Standard_Real ElCLib::LineParameter (const gp_Ax2d& L,
1423 gp_XY Coord = P.XY();
1424 Coord.Subtract (L.Location().XY());
1425 return Coord.Dot (L.Direction().XY());
1428 //=======================================================================
1429 //function : CircleParameter
1431 //=======================================================================
1433 Standard_Real ElCLib::CircleParameter (const gp_Ax22d& Pos,
1436 Standard_Real Teta = (Pos.XDirection()).Angle
1437 (gp_Vec2d (Pos.Location(),P));
1438 Teta = ((Pos.XDirection() ^ Pos.YDirection()) >= 0.0) ? Teta: -Teta;
1439 if (Teta < -1.e-16) Teta += PIPI;
1440 else if (Teta < 0) Teta = 0;
1444 //=======================================================================
1445 //function : EllipseParameter
1447 //=======================================================================
1449 Standard_Real ElCLib::EllipseParameter (const gp_Ax22d& Pos,
1450 const Standard_Real MajorRadius,
1451 const Standard_Real MinorRadius,
1455 OP.Subtract (Pos.Location().XY());
1456 gp_XY xaxis = Pos.XDirection().XY();
1457 gp_XY yaxis = Pos.YDirection().XY();
1458 gp_XY Om = xaxis.Multiplied (OP.Dot(xaxis));
1459 yaxis.Multiply ( (OP.Dot(yaxis)) * (MajorRadius/MinorRadius) );
1461 Standard_Real Teta = gp_Vec2d(xaxis).Angle (gp_Vec2d(Om));
1462 Teta = ((Pos.XDirection() ^ Pos.YDirection()) >= 0.0) ? Teta: -Teta;
1463 if (Teta < -1.e-16) Teta += PIPI;
1464 else if (Teta < 0) Teta = 0;
1468 //=======================================================================
1469 //function : HyperbolaParameter
1471 //=======================================================================
1473 Standard_Real ElCLib::HyperbolaParameter (const gp_Ax22d& Pos,
1474 const Standard_Real,
1475 const Standard_Real MinorRadius,
1478 gp_Vec2d V (Pos.YDirection().XY());
1479 Standard_Real sht = gp_Vec2d(Pos.Location(),P).Dot(V) /MinorRadius;
1480 #if defined(__QNX__)
1481 return std::asinh(sht);
1487 //=======================================================================
1488 //function : ParabolaParameter
1490 //=======================================================================
1492 Standard_Real ElCLib::ParabolaParameter (const gp_Ax22d& Pos,
1495 gp_Vec2d Directrix (Pos.YDirection().XY());
1496 return gp_Vec2d(Pos.Location(),P).Dot(Directrix);
1499 //=======================================================================
1502 //=======================================================================
1504 gp_Pnt ElCLib::To3d (const gp_Ax2& Pos, const gp_Pnt2d& P)
1506 gp_XYZ Vxy = Pos.XDirection().XYZ();
1507 Vxy.SetLinearForm (P.X(), Vxy, P.Y(), Pos.YDirection().XYZ(),
1508 Pos.Location().XYZ());
1509 return gp_Pnt (Vxy);
1513 //=======================================================================
1516 //=======================================================================
1518 gp_Dir ElCLib::To3d (const gp_Ax2& Pos, const gp_Dir2d& V)
1520 gp_Vec Vx = Pos.XDirection();
1521 gp_Vec Vy = Pos.YDirection();
1522 Vx.Multiply (V.X());
1523 Vy.Multiply (V.Y());
1528 //=======================================================================
1531 //=======================================================================
1533 gp_Vec ElCLib::To3d (const gp_Ax2& Pos, const gp_Vec2d& V)
1535 gp_Vec Vx = Pos.XDirection();
1536 gp_Vec Vy = Pos.YDirection();
1537 Vx.Multiply (V.X());
1538 Vy.Multiply (V.Y());
1543 //=======================================================================
1546 //=======================================================================
1548 gp_Ax1 ElCLib::To3d (const gp_Ax2& Pos, const gp_Ax2d& A)
1550 gp_Pnt P = ElCLib::To3d (Pos, A.Location());
1551 gp_Vec V = ElCLib::To3d (Pos, A.Direction());
1552 return gp_Ax1 (P, V);
1555 //=======================================================================
1558 //=======================================================================
1560 gp_Ax2 ElCLib::To3d (const gp_Ax2& Pos, const gp_Ax22d& A)
1562 gp_Pnt P = ElCLib::To3d (Pos, A.Location());
1563 gp_Vec VX = ElCLib::To3d (Pos, A.XDirection());
1564 gp_Vec VY = ElCLib::To3d (Pos, A.YDirection());
1565 return gp_Ax2 (P, VX.Crossed(VY), VX);
1568 //=======================================================================
1571 //=======================================================================
1573 gp_Lin ElCLib::To3d (const gp_Ax2& Pos, const gp_Lin2d& L)
1575 return gp_Lin (ElCLib::To3d (Pos, L.Position()));
1578 //=======================================================================
1581 //=======================================================================
1583 gp_Circ ElCLib::To3d (const gp_Ax2& Pos, const gp_Circ2d& C)
1585 return gp_Circ (ElCLib::To3d (Pos, C.Axis()), C.Radius());
1588 //=======================================================================
1591 //=======================================================================
1593 gp_Elips ElCLib::To3d (const gp_Ax2& Pos, const gp_Elips2d& E)
1595 return gp_Elips (ElCLib::To3d (Pos, E.Axis ()), E.MajorRadius (),
1599 //=======================================================================
1602 //=======================================================================
1604 gp_Hypr ElCLib::To3d (const gp_Ax2& Pos, const gp_Hypr2d& H)
1606 return gp_Hypr (ElCLib::To3d (Pos, H.Axis ()), H.MajorRadius (),
1610 //=======================================================================
1613 //=======================================================================
1615 gp_Parab ElCLib::To3d (const gp_Ax2& Pos, const gp_Parab2d& Prb)
1617 return gp_Parab ( ElCLib::To3d (Pos, Prb.Axis ()), Prb.Focal ());