1 // Created on: 1991-06-25
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 // 24-Aug-95 : xab removed C1 and C2 test : appeller D1 et D2
18 // avec discernement !
19 // 19-09-97 : JPI correction derivee seconde
22 #include <Geom_OffsetCurve.ixx>
27 #include <Geom_Line.hxx>
28 #include <Geom_Circle.hxx>
29 #include <Geom_Ellipse.hxx>
30 #include <Geom_Hyperbola.hxx>
31 #include <Geom_Parabola.hxx>
32 #include <Geom_BezierCurve.hxx>
33 #include <Geom_TrimmedCurve.hxx>
34 #include <Geom_BSplineCurve.hxx>
35 #include <Geom_Geometry.hxx>
37 #include <Geom_UndefinedDerivative.hxx>
38 #include <Geom_UndefinedValue.hxx>
39 #include <Standard_ConstructionError.hxx>
40 #include <Standard_RangeError.hxx>
41 #include <Standard_NotImplemented.hxx>
43 typedef Geom_OffsetCurve OffsetCurve;
44 typedef Handle(Geom_OffsetCurve) Handle(OffsetCurve);
45 typedef Geom_Curve Curve;
46 typedef Handle(Geom_Curve) Handle(Curve);
47 typedef Handle(Geom_Geometry) Handle(Geometry);
58 //ordre de derivation maximum pour la recherche de la premiere
60 static const int maxDerivOrder = 3;
61 static const Standard_Real MinStep = 1e-7;
62 static const Standard_Real MyAngularToleranceForG1 = Precision::Angular();
67 //=======================================================================
70 //=======================================================================
72 Handle(Geom_Geometry) Geom_OffsetCurve::Copy () const {
74 Handle(OffsetCurve) C;
75 C = new OffsetCurve (basisCurve, offsetValue, direction);
81 //=======================================================================
82 //function : Geom_OffsetCurve
83 //purpose : Basis curve cannot be an Offset curve or trimmed from
85 //=======================================================================
87 Geom_OffsetCurve::Geom_OffsetCurve (const Handle(Geom_Curve)& theCurve,
88 const Standard_Real theOffset,
90 const Standard_Boolean isTheNotCheckC0)
91 : direction(theDir), offsetValue(theOffset)
93 SetBasisCurve (theCurve, isTheNotCheckC0);
97 //=======================================================================
100 //=======================================================================
102 void Geom_OffsetCurve::Reverse ()
104 basisCurve->Reverse();
105 offsetValue = -offsetValue;
109 //=======================================================================
110 //function : ReversedParameter
112 //=======================================================================
114 Standard_Real Geom_OffsetCurve::ReversedParameter( const Standard_Real U) const
116 return basisCurve->ReversedParameter( U);
119 //=======================================================================
120 //function : Direction
122 //=======================================================================
124 const gp_Dir& Geom_OffsetCurve::Direction () const
125 { return direction; }
127 //=======================================================================
128 //function : SetDirection
130 //=======================================================================
132 void Geom_OffsetCurve::SetDirection (const Dir& V)
135 //=======================================================================
136 //function : SetOffsetValue
138 //=======================================================================
140 void Geom_OffsetCurve::SetOffsetValue (const Standard_Real D)
144 //=======================================================================
145 //function : IsPeriodic
147 //=======================================================================
149 Standard_Boolean Geom_OffsetCurve::IsPeriodic () const
151 return basisCurve->IsPeriodic();
154 //=======================================================================
157 //=======================================================================
159 Standard_Real Geom_OffsetCurve::Period () const
161 return basisCurve->Period();
164 //=======================================================================
165 //function : SetBasisCurve
167 //=======================================================================
169 void Geom_OffsetCurve::SetBasisCurve (const Handle(Curve)& C,
170 const Standard_Boolean isNotCheckC0)
172 const Standard_Real aUf = C->FirstParameter(),
173 aUl = C->LastParameter();
174 Handle(Curve) aCheckingCurve = Handle(Curve)::DownCast(C->Copy());
175 Standard_Boolean isTrimmed = Standard_False;
177 while(aCheckingCurve->IsKind(STANDARD_TYPE(Geom_TrimmedCurve)) ||
178 aCheckingCurve->IsKind(STANDARD_TYPE(Geom_OffsetCurve)))
180 if (aCheckingCurve->IsKind(STANDARD_TYPE(Geom_TrimmedCurve)))
182 Handle(Geom_TrimmedCurve) aTrimC =
183 Handle(Geom_TrimmedCurve)::DownCast(aCheckingCurve);
184 aCheckingCurve = aTrimC->BasisCurve();
185 isTrimmed = Standard_True;
188 if (aCheckingCurve->IsKind(STANDARD_TYPE(Geom_OffsetCurve)))
190 Handle(Geom_OffsetCurve) aOC =
191 Handle(Geom_OffsetCurve)::DownCast(aCheckingCurve);
192 aCheckingCurve = aOC->BasisCurve();
193 Standard_Real PrevOff = aOC->Offset();
194 gp_Vec V1(aOC->Direction());
195 gp_Vec V2(direction);
196 gp_Vec Vdir(PrevOff*V1 + offsetValue*V2);
198 if (offsetValue >= 0.)
200 offsetValue = Vdir.Magnitude();
201 direction.SetXYZ(Vdir.XYZ());
205 offsetValue = -Vdir.Magnitude();
206 direction.SetXYZ((-Vdir).XYZ());
211 myBasisCurveContinuity = aCheckingCurve->Continuity();
213 Standard_Boolean isC0 = !isNotCheckC0 &&
214 (myBasisCurveContinuity == GeomAbs_C0);
216 // Basis curve must be at least C1
217 if (isC0 && aCheckingCurve->IsKind(STANDARD_TYPE(Geom_BSplineCurve)))
219 Handle(Geom_BSplineCurve) aBC = Handle(Geom_BSplineCurve)::DownCast(aCheckingCurve);
220 if(aBC->IsG1(aUf, aUl, MyAngularToleranceForG1))
222 //Checking if basis curve has more smooth (C1, G2 and above) is not done.
223 //It can be done in case of need.
224 myBasisCurveContinuity = GeomAbs_G1;
225 isC0 = Standard_False;
228 // Raise exception if still C0
230 Standard_ConstructionError::Raise("Offset on C0 curve");
235 basisCurve = new Geom_TrimmedCurve(aCheckingCurve, aUf, aUl);
239 basisCurve = aCheckingCurve;
245 //=======================================================================
246 //function : BasisCurve
248 //=======================================================================
250 Handle(Curve) Geom_OffsetCurve::BasisCurve () const
256 //=======================================================================
257 //function : Continuity
259 //=======================================================================
261 GeomAbs_Shape Geom_OffsetCurve::Continuity () const {
263 GeomAbs_Shape OffsetShape=GeomAbs_C0;
264 switch (myBasisCurveContinuity) {
265 case GeomAbs_C0 : OffsetShape = GeomAbs_C0; break;
266 case GeomAbs_C1 : OffsetShape = GeomAbs_C0; break;
267 case GeomAbs_C2 : OffsetShape = GeomAbs_C1; break;
268 case GeomAbs_C3 : OffsetShape = GeomAbs_C2; break;
269 case GeomAbs_CN : OffsetShape = GeomAbs_CN; break;
270 case GeomAbs_G1 : OffsetShape = GeomAbs_G1; break;
271 case GeomAbs_G2 : OffsetShape = GeomAbs_G2; break;
277 //=======================================================================
280 //=======================================================================
282 void Geom_OffsetCurve::D0 (const Standard_Real U, Pnt& P) const
286 D0(U,P,PBasis,VBasis);
290 //=======================================================================
293 //=======================================================================
295 void Geom_OffsetCurve::D1 (const Standard_Real U, Pnt& P, Vec& V1) const
298 gp_Vec V1Basis,V2Basis;
299 D1(U,P,PBasis,V1,V1Basis,V2Basis);
304 //=======================================================================
307 //=======================================================================
309 void Geom_OffsetCurve::D2 (const Standard_Real U, Pnt& P, Vec& V1, Vec& V2) const
312 gp_Vec V1Basis,V2Basis,V3Basis;
313 D2(U,P,PBasis,V1,V2,V1Basis,V2Basis,V3Basis);
317 //=======================================================================
320 //=======================================================================
322 void Geom_OffsetCurve::D3 (const Standard_Real theU, Pnt& P, Vec& theV1, Vec& V2, Vec& V3)
326 // P(u) = p(u) + Offset * Ndir / R
327 // with R = || p' ^ V|| and Ndir = P' ^ direction (local normal direction)
329 // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R))
331 // P"(u) = p"(u) + (Offset / R) * (D2Ndir/DU - DNdir * (2.0 * Dr/ R**2) +
332 // Ndir * ( (3.0 * Dr**2 / R**4) - (D2r / R**2)))
334 //P"'(u) = p"'(u) + (Offset / R) * (D3Ndir - (3.0 * Dr/R**2) * D2Ndir -
335 // (3.0 * D2r / R2) * DNdir + (3.0 * Dr * Dr / R4) * DNdir -
336 // (D3r/R2) * Ndir + (6.0 * Dr * Dr / R4) * Ndir +
337 // (6.0 * Dr * D2r / R4) * Ndir - (15.0 * Dr* Dr* Dr /R6) * Ndir
339 const Standard_Real aTol = gp::Resolution();
341 Standard_Boolean IsDirectionChange = Standard_False;
343 basisCurve->D3 (theU, P, theV1, V2, V3);
344 Vec V4 = basisCurve->DN (theU, 4);
345 if(theV1.Magnitude() <= aTol)
347 const Standard_Real anUinfium = basisCurve->FirstParameter();
348 const Standard_Real anUsupremum = basisCurve->LastParameter();
350 const Standard_Real DivisionFactor = 1.e-3;
352 if((anUsupremum >= RealLast()) || (anUinfium <= RealFirst()))
355 du = anUsupremum-anUinfium;
357 const Standard_Real aDelta = Max(du*DivisionFactor,MinStep);
358 //Derivative is approximated by Taylor-series
360 Standard_Integer anIndex = 1; //Derivative order
365 V = basisCurve->DN(theU,++anIndex);
367 while((V.Magnitude() <= aTol) && anIndex < maxDerivOrder);
371 if(theU-anUinfium < aDelta)
377 basisCurve->D0(Min(theU, u),P1);
378 basisCurve->D0(Max(theU, u),P2);
381 Standard_Real aDirFactor = V.Dot(V1);
386 V2 = -basisCurve->DN (theU, anIndex + 1);
387 V3 = -basisCurve->DN (theU, anIndex + 2);
388 V4 = -basisCurve->DN (theU, anIndex + 3);
390 IsDirectionChange = Standard_True;
395 V2 = basisCurve->DN (theU, anIndex + 1);
396 V3 = basisCurve->DN (theU, anIndex + 2);
397 V4 = basisCurve->DN (theU, anIndex + 3);
399 }//if(V1.Magnitude() <= aTol)
402 XYZ OffsetDir = direction.XYZ();
403 XYZ Ndir = (theV1.XYZ()).Crossed (OffsetDir);
404 XYZ DNdir = (V2.XYZ()).Crossed (OffsetDir);
405 XYZ D2Ndir = (V3.XYZ()).Crossed (OffsetDir);
406 XYZ D3Ndir = (V4.XYZ()).Crossed (OffsetDir);
407 Standard_Real R2 = Ndir.SquareModulus();
408 Standard_Real R = Sqrt (R2);
409 Standard_Real R3 = R2 * R;
410 Standard_Real R4 = R2 * R2;
411 Standard_Real R5 = R3 * R2;
412 Standard_Real R6 = R3 * R3;
413 Standard_Real R7 = R5 * R2;
414 Standard_Real Dr = Ndir.Dot (DNdir);
415 Standard_Real D2r = Ndir.Dot (D2Ndir) + DNdir.Dot (DNdir);
416 Standard_Real D3r = Ndir.Dot (D3Ndir) + 3.0 * DNdir.Dot (D2Ndir);
417 if (R7 <= gp::Resolution()) {
418 if (R6 <= gp::Resolution()) Geom_UndefinedDerivative::Raise();
420 D3Ndir.Subtract (D2Ndir.Multiplied (3.0 * Dr / R2));
421 D3Ndir.Subtract (DNdir.Multiplied (3.0 * ((D2r/R2) + (Dr*Dr/R4))));
422 D3Ndir.Add (Ndir.Multiplied (6.0*Dr*Dr/R4 + 6.0*Dr*D2r/R4 -
423 15.0*Dr*Dr*Dr/R6 - D3r));
424 D3Ndir.Multiply (offsetValue/R);
426 if(IsDirectionChange)
429 V3.Add (Vec(D3Ndir));
432 Standard_Real R4 = R2 * R2;
433 D2Ndir.Subtract (DNdir.Multiplied (2.0 * Dr / R2));
434 D2Ndir.Subtract (Ndir.Multiplied ((3.0 * Dr * Dr / R4) - (D2r / R2)));
435 D2Ndir.Multiply (offsetValue / R);
436 V2.Add (Vec(D2Ndir));
439 DNdir.Subtract (Ndir.Multiplied (Dr/R));
440 DNdir.Multiply (offsetValue/R2);
441 theV1.Add (Vec(DNdir));
446 D3Ndir.Subtract (D2Ndir.Multiplied (3.0 * Dr / R3));
447 D3Ndir.Subtract (DNdir.Multiplied ((3.0 * ((D2r/R3) + (Dr*Dr)/R5))));
448 D3Ndir.Add (Ndir.Multiplied (6.0*Dr*Dr/R5 + 6.0*Dr*D2r/R5 -
449 15.0*Dr*Dr*Dr/R7 - D3r));
450 D3Ndir.Multiply (offsetValue);
452 if(IsDirectionChange)
455 V3.Add (Vec(D3Ndir));
459 D2Ndir.Subtract (DNdir.Multiplied (2.0 * Dr / R3));
460 D2Ndir.Subtract (Ndir.Multiplied ((3.0 * Dr * Dr / R5) - (D2r / R3)));
461 D2Ndir.Multiply (offsetValue);
462 V2.Add (Vec(D2Ndir));
464 DNdir.Multiply (offsetValue/R);
465 DNdir.Subtract (Ndir.Multiplied (offsetValue*Dr/R3));
466 theV1.Add (Vec(DNdir));
473 //=======================================================================
476 //=======================================================================
478 Vec Geom_OffsetCurve::DN (const Standard_Real U, const Standard_Integer N) const
480 Standard_RangeError_Raise_if (N < 1, "Exception: "
481 "Geom_OffsetCurve::DN(...). N<1.");
491 D2( U, Ptemp, Vtemp, VN);
494 D3( U, Ptemp, Vtemp, Vtemp, VN);
497 Standard_NotImplemented::Raise("Exception: "
498 "Derivative order is greater than 3. Cannot compute of derivative.");
504 //=======================================================================
507 //=======================================================================
509 void Geom_OffsetCurve::D0(const Standard_Real theU, gp_Pnt& theP,
510 gp_Pnt& thePbasis, gp_Vec& theV1basis)const
512 const Standard_Real aTol = gp::Resolution();
514 basisCurve->D1 (theU, thePbasis, theV1basis);
515 Standard_Real Ndu = theV1basis.Magnitude();
519 const Standard_Real anUinfium = basisCurve->FirstParameter();
520 const Standard_Real anUsupremum = basisCurve->LastParameter();
522 const Standard_Real DivisionFactor = 1.e-3;
524 if((anUsupremum >= RealLast()) || (anUinfium <= RealFirst()))
527 du = anUsupremum-anUinfium;
529 const Standard_Real aDelta = Max(du*DivisionFactor,MinStep);
530 //Derivative is approximated by Taylor-series
532 Standard_Integer anIndex = 1; //Derivative order
537 V = basisCurve->DN(theU,++anIndex);
540 while((Ndu <= aTol) && anIndex < maxDerivOrder);
544 if(theU-anUinfium < aDelta)
550 basisCurve->D0(Min(theU, u),P1);
551 basisCurve->D0(Max(theU, u),P2);
554 Standard_Real aDirFactor = V.Dot(V1);
561 Ndu = theV1basis.Magnitude();
564 XYZ Ndir = (theV1basis.XYZ()).Crossed (direction.XYZ());
565 Standard_Real R = Ndir.Modulus();
566 if (R <= gp::Resolution())
567 Geom_UndefinedValue::Raise("Exception: Undefined normal vector "
568 "because tangent vector has zero-magnitude!");
570 Ndir.Multiply (offsetValue/R);
571 Ndir.Add (thePbasis.XYZ());
575 //=======================================================================
578 //=======================================================================
580 void Geom_OffsetCurve::D1 ( const Standard_Real theU,
581 Pnt& P , Pnt& PBasis ,
582 Vec& theV1, Vec& V1basis, Vec& V2basis) const {
584 // P(u) = p(u) + Offset * Ndir / R
585 // with R = || p' ^ V|| and Ndir = P' ^ direction (local normal direction)
587 // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R))
589 const Standard_Real aTol = gp::Resolution();
591 basisCurve->D2 (theU, PBasis, V1basis, V2basis);
595 if(theV1.Magnitude() <= aTol)
597 const Standard_Real anUinfium = basisCurve->FirstParameter();
598 const Standard_Real anUsupremum = basisCurve->LastParameter();
600 const Standard_Real DivisionFactor = 1.e-3;
602 if((anUsupremum >= RealLast()) || (anUinfium <= RealFirst()))
605 du = anUsupremum-anUinfium;
607 const Standard_Real aDelta = Max(du*DivisionFactor,MinStep);
608 //Derivative is approximated by Taylor-series
610 Standard_Integer anIndex = 1; //Derivative order
615 V = basisCurve->DN(theU,++anIndex);
617 while((V.Magnitude() <= aTol) && anIndex < maxDerivOrder);
621 if(theU-anUinfium < aDelta)
627 basisCurve->D0(Min(theU, u),P1);
628 basisCurve->D0(Max(theU, u),P2);
631 Standard_Real aDirFactor = V.Dot(V1);
636 V2 = - basisCurve->DN (theU, anIndex+1);
641 V2 = basisCurve->DN (theU, anIndex+1);
646 }//if(theV1.Magnitude() <= aTol)
648 XYZ OffsetDir = direction.XYZ();
649 XYZ Ndir = (theV1.XYZ()).Crossed (OffsetDir);
650 XYZ DNdir = (V2.XYZ()).Crossed (OffsetDir);
651 Standard_Real R2 = Ndir.SquareModulus();
652 Standard_Real R = Sqrt (R2);
653 Standard_Real R3 = R * R2;
654 Standard_Real Dr = Ndir.Dot (DNdir);
655 if (R3 <= gp::Resolution()) {
656 //We try another computation but the stability is not very good.
657 if (R2 <= gp::Resolution()) Geom_UndefinedDerivative::Raise();
659 DNdir.Subtract (Ndir.Multiplied (Dr/R));
660 DNdir.Multiply (offsetValue/R2);
661 theV1.Add (Vec(DNdir));
664 // Same computation as IICURV in EUCLID-IS because the stability is
666 DNdir.Multiply (offsetValue/R);
667 DNdir.Subtract (Ndir.Multiplied (offsetValue * Dr/R3));
668 theV1.Add (Vec(DNdir));
674 //=======================================================================
677 //=======================================================================
679 void Geom_OffsetCurve::D2 (const Standard_Real theU,
680 Pnt& P , Pnt& PBasis ,
681 Vec& theV1 , Vec& V2 ,
682 Vec& V1basis, Vec& V2basis, Vec& V3basis) const {
684 // P(u) = p(u) + Offset * Ndir / R
685 // with R = || p' ^ V|| and Ndir = P' ^ direction (local normal direction)
687 // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R))
689 // P"(u) = p"(u) + (Offset / R) * (D2Ndir/DU - DNdir * (2.0 * Dr/ R**2) +
690 // Ndir * ( (3.0 * Dr**2 / R**4) - (D2r / R**2)))
692 const Standard_Real aTol = gp::Resolution();
694 Standard_Boolean IsDirectionChange = Standard_False;
696 basisCurve->D3 (theU, PBasis, V1basis, V2basis, V3basis);
702 if(theV1.Magnitude() <= aTol)
704 const Standard_Real anUinfium = basisCurve->FirstParameter();
705 const Standard_Real anUsupremum = basisCurve->LastParameter();
707 const Standard_Real DivisionFactor = 1.e-3;
709 if((anUsupremum >= RealLast()) || (anUinfium <= RealFirst()))
712 du = anUsupremum-anUinfium;
714 const Standard_Real aDelta = Max(du*DivisionFactor,MinStep);
715 //Derivative is approximated by Taylor-series
717 Standard_Integer anIndex = 1; //Derivative order
722 V = basisCurve->DN(theU,++anIndex);
724 while((V.Magnitude() <= aTol) && anIndex < maxDerivOrder);
728 if(theU-anUinfium < aDelta)
734 basisCurve->D0(Min(theU, u),P1);
735 basisCurve->D0(Max(theU, u),P2);
738 Standard_Real aDirFactor = V.Dot(V1);
743 V2 = -basisCurve->DN (theU, anIndex+1);
744 V3 = -basisCurve->DN (theU, anIndex + 2);
746 IsDirectionChange = Standard_True;
751 V2 = basisCurve->DN (theU, anIndex+1);
752 V3 = basisCurve->DN (theU, anIndex + 2);
757 }//if(V1.Magnitude() <= aTol)
759 XYZ OffsetDir = direction.XYZ();
760 XYZ Ndir = (theV1.XYZ()).Crossed (OffsetDir);
761 XYZ DNdir = (V2.XYZ()).Crossed (OffsetDir);
762 XYZ D2Ndir = (V3.XYZ()).Crossed (OffsetDir);
763 Standard_Real R2 = Ndir.SquareModulus();
764 Standard_Real R = Sqrt (R2);
765 Standard_Real R3 = R2 * R;
766 Standard_Real R4 = R2 * R2;
767 Standard_Real R5 = R3 * R2;
768 Standard_Real Dr = Ndir.Dot (DNdir);
769 Standard_Real D2r = Ndir.Dot (D2Ndir) + DNdir.Dot (DNdir);
771 if (R5 <= gp::Resolution()) {
772 //We try another computation but the stability is not very good
774 if (R4 <= gp::Resolution()) Geom_UndefinedDerivative::Raise();
776 Standard_Real R4 = R2 * R2;
777 D2Ndir.Subtract (DNdir.Multiplied (2.0 * Dr / R2));
778 D2Ndir.Add (Ndir.Multiplied (((3.0 * Dr * Dr)/R4) - (D2r/R2)));
779 D2Ndir.Multiply (offsetValue / R);
781 if(IsDirectionChange)
784 V2.Add (Vec(D2Ndir));
788 DNdir.Subtract (Ndir.Multiplied (Dr/R));
789 DNdir.Multiply (offsetValue/R2);
790 theV1.Add (Vec(DNdir));
793 // Same computation as IICURV in EUCLID-IS because the stability is
796 D2Ndir.Multiply (offsetValue/R);
797 D2Ndir.Subtract (DNdir.Multiplied (2.0 * offsetValue * Dr / R3));
798 D2Ndir.Add (Ndir.Multiplied (
799 offsetValue * (((3.0 * Dr * Dr) / R5) - (D2r / R3))
803 if(IsDirectionChange)
806 V2.Add (Vec(D2Ndir));
809 DNdir.Multiply (offsetValue/R);
810 DNdir.Subtract (Ndir.Multiplied (offsetValue*Dr/R3));
811 theV1.Add (Vec(DNdir));
818 //=======================================================================
819 //function : FirstParameter
821 //=======================================================================
823 Standard_Real Geom_OffsetCurve::FirstParameter () const {
825 return basisCurve->FirstParameter();
829 //=======================================================================
830 //function : LastParameter
832 //=======================================================================
834 Standard_Real Geom_OffsetCurve::LastParameter () const {
836 return basisCurve->LastParameter();
840 //=======================================================================
843 //=======================================================================
845 Standard_Real Geom_OffsetCurve::Offset () const { return offsetValue; }
847 //=======================================================================
850 //=======================================================================
852 void Geom_OffsetCurve::Value (const Standard_Real theU, Pnt& theP,
853 Pnt& thePbasis, Vec& theV1basis) const
855 if (myBasisCurveContinuity == GeomAbs_C0)
856 Geom_UndefinedValue::Raise("Exception: Basis curve is C0 continuity!");
858 basisCurve->D1(theU, thePbasis, theV1basis);
863 //=======================================================================
864 //function : IsClosed
866 //=======================================================================
868 Standard_Boolean Geom_OffsetCurve::IsClosed () const
871 D0(FirstParameter(),PF);
872 D0(LastParameter(),PL);
873 return ( PF.Distance(PL) <= gp::Resolution());
878 //=======================================================================
881 //=======================================================================
883 Standard_Boolean Geom_OffsetCurve::IsCN (const Standard_Integer N) const {
885 Standard_RangeError_Raise_if (N < 0, " ");
886 return basisCurve->IsCN (N + 1);
890 //=======================================================================
891 //function : Transform
893 //=======================================================================
895 void Geom_OffsetCurve::Transform (const Trsf& T) {
897 basisCurve->Transform (T);
898 direction.Transform(T);
899 offsetValue *= T.ScaleFactor();
902 //=======================================================================
903 //function : TransformedParameter
905 //=======================================================================
907 Standard_Real Geom_OffsetCurve::TransformedParameter(const Standard_Real U,
908 const gp_Trsf& T) const
910 return basisCurve->TransformedParameter(U,T);
913 //=======================================================================
914 //function : ParametricTransformation
916 //=======================================================================
918 Standard_Real Geom_OffsetCurve::ParametricTransformation(const gp_Trsf& T)
921 return basisCurve->ParametricTransformation(T);
924 //=======================================================================
925 //function : GetBasisCurveContinuity
927 //=======================================================================
928 GeomAbs_Shape Geom_OffsetCurve::GetBasisCurveContinuity() const
930 return myBasisCurveContinuity;