mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-10 18:51:21 +03:00
269 lines
7.8 KiB
C++
269 lines
7.8 KiB
C++
// Created on: 2016-06-07
|
|
// Created by: Nikolai BUKHALOV
|
|
// Copyright (c) 2016 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 _Bnd_Range_HeaderFile
|
|
#define _Bnd_Range_HeaderFile
|
|
|
|
#include <Standard_ConstructionError.hxx>
|
|
|
|
#include <NCollection_List.hxx>
|
|
|
|
//! This class describes a range in 1D space restricted
|
|
//! by two real values.
|
|
//! A range can be void indicating there is no point included in the range.
|
|
class Bnd_Range
|
|
{
|
|
public:
|
|
|
|
//! Default constructor. Creates VOID range.
|
|
Bnd_Range() : myFirst(0.0), myLast(-1.0) {}
|
|
|
|
//! Constructor. Never creates VOID range.
|
|
Bnd_Range(const Standard_Real theMin, const Standard_Real theMax) :
|
|
myFirst(theMin), myLast(theMax)
|
|
{
|
|
if(myLast < myFirst)
|
|
throw Standard_ConstructionError("Last < First");
|
|
}
|
|
|
|
//! Replaces <this> with common-part of <this> and theOther
|
|
Standard_EXPORT void Common(const Bnd_Range& theOther);
|
|
|
|
//! Joins *this and theOther to one interval.
|
|
//! Replaces *this to the result.
|
|
//! Returns false if the operation cannot be done (e.g.
|
|
//! input arguments are empty or separated).
|
|
//! @sa use method ::Add() to merge two ranges unconditionally
|
|
Standard_EXPORT Standard_Boolean Union(const Bnd_Range& theOther);
|
|
|
|
//! Splits <this> to several sub-ranges by theVal value
|
|
//! (e.g. range [3, 15] will be split by theVal==5 to the two
|
|
//! ranges: [3, 5] and [5, 15]). New ranges will be pushed to
|
|
//! theList (theList must be initialized correctly before
|
|
//! calling this method).
|
|
//! If thePeriod != 0.0 then at least one boundary of
|
|
//! new ranges (if <*this> intersects theVal+k*thePeriod) will be equal to
|
|
//! theVal+thePeriod*k, where k is an integer number (k = 0, +/-1, +/-2, ...).
|
|
//! (let thePeriod in above example be 4 ==> we will obtain
|
|
//! four ranges: [3, 5], [5, 9], [9, 13] and [13, 15].
|
|
Standard_EXPORT void Split(const Standard_Real theVal,
|
|
NCollection_List<Bnd_Range>& theList,
|
|
const Standard_Real thePeriod = 0.0) const;
|
|
|
|
//! Checks if <this> intersects values like
|
|
//! theVal+k*thePeriod, where k is an integer number (k = 0, +/-1, +/-2, ...).
|
|
//! Returns:
|
|
//! 0 - if <this> does not intersect the theVal+k*thePeriod.
|
|
//! 1 - if <this> intersects theVal+k*thePeriod.
|
|
//! 2 - if myFirst or/and myLast are equal to theVal+k*thePeriod.
|
|
//!
|
|
//! ATTENTION!!!
|
|
//! If (myFirst == myLast) then this function will return only either 0 or 2.
|
|
Standard_EXPORT Standard_Integer
|
|
IsIntersected(const Standard_Real theVal,
|
|
const Standard_Real thePeriod = 0.0) const;
|
|
|
|
//! Extends <this> to include theParameter
|
|
void Add(const Standard_Real theParameter)
|
|
{
|
|
if(IsVoid())
|
|
{
|
|
myFirst = myLast = theParameter;
|
|
return;
|
|
}
|
|
|
|
myFirst = Min(myFirst, theParameter);
|
|
myLast = Max(myLast, theParameter);
|
|
}
|
|
|
|
//! Extends this range to include both ranges.
|
|
//! @sa use method ::Union() to check if two ranges overlap method merging
|
|
void Add (const Bnd_Range& theRange)
|
|
{
|
|
if (theRange.IsVoid())
|
|
{
|
|
return;
|
|
}
|
|
else if (IsVoid())
|
|
{
|
|
*this = theRange;
|
|
}
|
|
myFirst = Min(myFirst, theRange.myFirst);
|
|
myLast = Max(myLast, theRange.myLast);
|
|
}
|
|
|
|
//! Obtain MIN boundary of <this>.
|
|
//! If <this> is VOID the method returns false.
|
|
Standard_Boolean GetMin(Standard_Real& thePar) const
|
|
{
|
|
if(IsVoid())
|
|
{
|
|
return Standard_False;
|
|
}
|
|
|
|
thePar = myFirst;
|
|
return Standard_True;
|
|
}
|
|
|
|
//! Obtain MAX boundary of <this>.
|
|
//! If <this> is VOID the method returns false.
|
|
Standard_Boolean GetMax(Standard_Real& thePar) const
|
|
{
|
|
if(IsVoid())
|
|
{
|
|
return Standard_False;
|
|
}
|
|
|
|
thePar = myLast;
|
|
return Standard_True;
|
|
}
|
|
|
|
//! Obtain first and last boundary of <this>.
|
|
//! If <this> is VOID the method returns false.
|
|
Standard_Boolean GetBounds(Standard_Real& theFirstPar,
|
|
Standard_Real& theLastPar) const
|
|
{
|
|
if(IsVoid())
|
|
{
|
|
return Standard_False;
|
|
}
|
|
|
|
theFirstPar = myFirst;
|
|
theLastPar = myLast;
|
|
return Standard_True;
|
|
}
|
|
|
|
//! Obtain theParameter satisfied to the equation
|
|
//! (theParameter-MIN)/(MAX-MIN) == theLambda.
|
|
//! * theLambda == 0 --> MIN boundary will be returned;
|
|
//! * theLambda == 0.5 --> Middle point will be returned;
|
|
//! * theLambda == 1 --> MAX boundary will be returned;
|
|
//! * theLambda < 0 --> the value less than MIN will be returned;
|
|
//! * theLambda > 1 --> the value greater than MAX will be returned.
|
|
//! If <this> is VOID the method returns false.
|
|
Standard_Boolean GetIntermediatePoint(const Standard_Real theLambda,
|
|
Standard_Real& theParameter) const
|
|
{
|
|
if (IsVoid())
|
|
{
|
|
return Standard_False;
|
|
}
|
|
|
|
theParameter = myFirst + theLambda*(myLast - myFirst);
|
|
return Standard_True;
|
|
}
|
|
|
|
//! Returns range value (MAX-MIN). Returns negative value for VOID range.
|
|
Standard_Real Delta() const
|
|
{
|
|
return (myLast - myFirst);
|
|
}
|
|
|
|
//! Is <this> initialized.
|
|
Standard_Boolean IsVoid() const
|
|
{
|
|
return (myLast < myFirst);
|
|
}
|
|
|
|
//! Initializes <this> by default parameters. Makes <this> VOID.
|
|
void SetVoid()
|
|
{
|
|
myLast = -1.0;
|
|
myFirst = 0.0;
|
|
}
|
|
|
|
//! Extends this to the given value (in both side)
|
|
void Enlarge(const Standard_Real theDelta)
|
|
{
|
|
if (IsVoid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
myFirst -= theDelta;
|
|
myLast += theDelta;
|
|
}
|
|
|
|
//! Returns the copy of <*this> shifted by theVal
|
|
Bnd_Range Shifted(const Standard_Real theVal) const
|
|
{
|
|
return !IsVoid() ? Bnd_Range(myFirst + theVal, myLast + theVal) : Bnd_Range();
|
|
}
|
|
|
|
//! Shifts <*this> by theVal
|
|
void Shift(const Standard_Real theVal)
|
|
{
|
|
if (!IsVoid())
|
|
{
|
|
myFirst += theVal;
|
|
myLast += theVal;
|
|
}
|
|
}
|
|
|
|
//! Trims the First value in range by the given lower limit.
|
|
//! Marks range as Void if the given Lower value is greater than range Max.
|
|
void TrimFrom (const Standard_Real theValLower)
|
|
{
|
|
if (!IsVoid())
|
|
{
|
|
myFirst = Max (myFirst, theValLower);
|
|
}
|
|
}
|
|
|
|
//! Trim the Last value in range by the given Upper limit.
|
|
//! Marks range as Void if the given Upper value is smaller than range Max.
|
|
void TrimTo (const Standard_Real theValUpper)
|
|
{
|
|
if (!IsVoid())
|
|
{
|
|
myLast = Min (myLast, theValUpper);
|
|
}
|
|
}
|
|
|
|
//! Returns True if the value is out of this range.
|
|
Standard_Boolean IsOut (Standard_Real theValue) const
|
|
{
|
|
return IsVoid()
|
|
|| theValue < myFirst
|
|
|| theValue > myLast;
|
|
}
|
|
|
|
//! Returns True if the given range is out of this range.
|
|
Standard_Boolean IsOut (const Bnd_Range& theRange) const
|
|
{
|
|
return IsVoid()
|
|
|| theRange.IsVoid()
|
|
|| theRange.myLast < myFirst
|
|
|| theRange.myFirst > myLast;
|
|
}
|
|
|
|
//! Returns TRUE if theOther is equal to <*this>
|
|
Standard_Boolean operator==(const Bnd_Range& theOther) const
|
|
{
|
|
return ((myFirst == theOther.myFirst) && (myLast == theOther.myLast));
|
|
}
|
|
|
|
//! Dumps the content of me into the stream
|
|
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
|
|
|
|
private:
|
|
|
|
Standard_Real myFirst; //!< Start of range
|
|
Standard_Real myLast; //!< End of range
|
|
|
|
};
|
|
|
|
#endif
|