// Created on: 1992-01-30
// Created by: Didier PIFFAULT
// Copyright (c) 1992-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _TopTrans_CurveTransition_HeaderFile
#define _TopTrans_CurveTransition_HeaderFile
#include
#include
#include
#include
#include
#include
#include
#include
#include
class gp_Dir;
//! This algorithm is used to compute the transition
//! of a Curve intersecting a curvilinear boundary.
//!
//! The geometric elements are described locally at
//! the intersection point by a second order
//! development.
//!
//! The curve is described by the intersection point,
//! the tangent vector and the curvature.
//!
//! The boundary is described by a set of curve
//! elements, a curve element is either :
//!
//! - A curve.
//!
//! - A curve and an orientation called a half-curve,
//! the boundary of the curve is before or after the
//! intersection point depending on the orientation.
class TopTrans_CurveTransition
{
public:
DEFINE_STANDARD_ALLOC
//! Create an empty Curve Transition.
Standard_EXPORT TopTrans_CurveTransition();
//! Initialize a Transition with the local description
//! of a Curve.
Standard_EXPORT void Reset (const gp_Dir& Tgt, const gp_Dir& Norm, const Standard_Real Curv);
//! Initialize a Transition with the local description
//! of a straigth line.
Standard_EXPORT void Reset (const gp_Dir& Tgt);
//! Add a curve element to the boundary. If Or is
//! REVERSED the curve is before the intersection,
//! else if Or is FORWARD the curv is after the
//! intersection and if Or is INTERNAL the
//! intersection is in the middle of the curv.
Standard_EXPORT void Compare (const Standard_Real Tole, const gp_Dir& Tang, const gp_Dir& Norm, const Standard_Real Curv, const TopAbs_Orientation S, const TopAbs_Orientation Or);
//! returns the state of the curve before the
//! intersection, this is the position relative to the
//! boundary of a point very close to the intersection
//! on the negative side of the tangent.
Standard_EXPORT TopAbs_State StateBefore() const;
//! returns the state of the curve after the
//! intersection, this is the position relative to the
//! boundary of a point very close to the intersection
//! on the positive side of the tangent.
Standard_EXPORT TopAbs_State StateAfter() const;
protected:
private:
//! Compare two curvature and return true if N1,C1 is
//! before N2,C2 in the edge orientation
Standard_EXPORT Standard_Boolean IsBefore (const Standard_Real Tole, const Standard_Real Angl, const gp_Dir& Nor1, const Standard_Real Cur1, const gp_Dir& Nor2, const Standard_Real Cur2) const;
//! Compare two angles at tolerance Tole
Standard_EXPORT Standard_Integer Compare (const Standard_Real Ang1, const Standard_Real Ang2, const Standard_Real Tole) const;
gp_Dir myTgt;
gp_Dir myNorm;
Standard_Real myCurv;
Standard_Boolean Init;
gp_Dir TgtFirst;
gp_Dir NormFirst;
Standard_Real CurvFirst;
TopAbs_Orientation TranFirst;
gp_Dir TgtLast;
gp_Dir NormLast;
Standard_Real CurvLast;
TopAbs_Orientation TranLast;
};
#endif // _TopTrans_CurveTransition_HeaderFile