1 // File: GeomLib_Check2dBSplineCurve.cxx
2 // Created: Wed May 28 17:26:47 1997
3 // Author: Xavier BENVENISTE
4 // <xab@zozox.paris1.matra-dtv.fr>
7 #include <GeomLib_Check2dBSplineCurve.ixx>
8 #include <Geom_BSplineCurve.hxx>
9 #include <gp_Pnt2d.hxx>
10 #include <gp_Vec2d.hxx>
11 //=======================================================================
12 //function : GeomLib_Check2dBSplineCurve
14 //=======================================================================
16 GeomLib_Check2dBSplineCurve::GeomLib_Check2dBSplineCurve(const Handle(Geom2d_BSplineCurve)& Curve,
17 const Standard_Real Tolerance,
18 const Standard_Real AngularTolerance)
20 myDone(Standard_False),
21 myFixFirstTangent(Standard_False),
22 myFixLastTangent(Standard_False),
23 myAngularTolerance(Abs(AngularTolerance)),
24 myTolerance(Abs(Tolerance)),
25 myFirstPole(1.0,0.0e0),
26 myLastPole(1.0e0,0.0e0)
32 Standard_Real tangent_magnitude,
37 num_poles = Curve->NbPoles() ;
38 if (( ! myCurve->IsPeriodic() )&& num_poles >= 4) {
43 for (ii = 1 ; ii <= 2 ; ii++) {
44 tangent.SetCoord(ii,myCurve->Pole(2).Coord(ii) - myCurve->Pole(1).Coord(ii)) ;
45 a_vector.SetCoord(ii, myCurve->Pole(3).Coord(ii) - myCurve->Pole(1).Coord(ii)) ;
47 tangent_magnitude = tangent.Magnitude() ;
48 vector_magnitude = a_vector.Magnitude() ;
49 if (tangent_magnitude > myTolerance &&
50 vector_magnitude > myTolerance)
52 value = tangent.Dot(a_vector) ;
54 for (ii = 1 ; ii <= 2 ; ii++) {
55 diff.SetCoord(ii, (tangent.Coord(ii) / tangent_magnitude) + (a_vector.Coord(ii) / vector_magnitude)) ;
59 if (angular_value < myAngularTolerance) {
60 myFixFirstTangent = Standard_True ;
62 if (tangent_magnitude > 0.5e0 * vector_magnitude) {
63 factor = 0.5e0 * vector_magnitude / tangent_magnitude ;
65 for (ii = 1 ; ii <= 2 ; ii++) {
66 myFirstPole.SetCoord(ii, myCurve->Pole(1).Coord(ii) - factor * tangent.Coord(ii)) ;
72 for (ii = 1 ; ii <= 2 ; ii++) {
73 tangent.SetCoord(ii,myCurve->Pole(num_poles-1).Coord(ii) - myCurve->Pole(num_poles).Coord(ii)) ;
74 a_vector.SetCoord(ii, myCurve->Pole(num_poles-2).Coord(ii) - myCurve->Pole(num_poles).Coord(ii)) ;
76 tangent_magnitude = tangent.Magnitude() ;
77 vector_magnitude = a_vector.Magnitude() ;
79 if (tangent_magnitude > myTolerance &&
80 vector_magnitude > myTolerance)
82 value = tangent.Dot(a_vector) ;
84 for (ii = 1 ; ii <= 2 ; ii++) {
85 diff.SetCoord(ii, (tangent.Coord(ii) / tangent_magnitude) + (a_vector.Coord(ii) / vector_magnitude)) ;
89 if ( angular_value < myAngularTolerance) {
90 myFixLastTangent = Standard_True ;
92 if (tangent_magnitude > 0.5e0 * vector_magnitude) {
93 factor = 0.5e0 * vector_magnitude / tangent_magnitude ;
95 for (ii = 1 ; ii <= 2 ; ii++) {
96 myLastPole.SetCoord(ii, myCurve->Pole(num_poles).Coord(ii) - factor * tangent.Coord(ii)) ;
105 myDone = Standard_True ;
109 //=======================================================================
110 //function : NeedTangentFix
112 //=======================================================================
114 void GeomLib_Check2dBSplineCurve::NeedTangentFix(Standard_Boolean & FirstFlag,
115 Standard_Boolean & LastFlag) const
117 FirstFlag = myFixFirstTangent ;
118 LastFlag = myFixLastTangent ;
120 //=======================================================================
121 //function : FixTangent
123 //=======================================================================
125 Handle(Geom2d_BSplineCurve) GeomLib_Check2dBSplineCurve::FixedTangent(const Standard_Boolean FirstFlag,
126 const Standard_Boolean LastFlag)
128 Handle(Geom2d_BSplineCurve) new_curve ;
129 if ((myFixFirstTangent && FirstFlag) ||(myFixLastTangent && LastFlag)) {
131 Handle(Geom2d_BSplineCurve)::DownCast(myCurve->Copy()) ;
134 if (myFixFirstTangent && FirstFlag) {
135 new_curve->SetPole(2,
138 if (myFixLastTangent && LastFlag) {
139 Standard_Integer num_poles = myCurve->NbPoles() ;
140 new_curve->SetPole(num_poles-1,
144 myDone = Standard_True ;
147 //=======================================================================
148 //function : FixTangent
150 //=======================================================================
152 void GeomLib_Check2dBSplineCurve::FixTangent(const Standard_Boolean FirstFlag,
153 const Standard_Boolean LastFlag)
156 if (myFixFirstTangent && FirstFlag) {
160 if (myFixLastTangent && LastFlag) {
161 Standard_Integer num_poles = myCurve->NbPoles() ;
162 myCurve->SetPole(num_poles-1,
166 myDone = Standard_True ;