1// Created on: 1991-12-13
2// Created by: Christophe MARION
3// Copyright (c) 1991-1999 Matra Datavision
4// Copyright (c) 1999-2014 OPEN CASCADE SAS
5//
6// This file is part of Open CASCADE Technology software library.
7//
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.
13//
14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
16
17//                   **-----------****             Other
18//     ***-----*                                   IsBefore
19//     ***------------*                            IsJustBefore
20//     ***-----------------*                       IsOverlappingAtStart
21//     ***--------------------------*              IsJustEnclosingAtEnd
22//     ***-------------------------------------*   IsEnclosing
23//                  ***----*                       IsJustOverlappingAtStart
24//                  ***-------------*              IsSimilar
25//                  ***------------------------*   IsJustEnclosingAtStart
26//                         ***-*                   IsInside
27//                         ***------*              IsJustOverlappingAtEnd
28//                         ***-----------------*   IsOverlappingAtEnd
29//                                  ***--------*   IsJustAfter
30//                                       ***---*   IsAfter
31
32//=======================================================================
33//function : Start
34//purpose  :
35//=======================================================================
36
37inline Standard_Real Intrv_Interval::Start () const
38{ return myStart; }
39
40//=======================================================================
41//function : End
42//purpose  :
43//=======================================================================
44
45inline Standard_Real Intrv_Interval::End () const
46{ return myEnd; }
47
48//=======================================================================
49//function : TolStart
50//purpose  :
51//=======================================================================
52
53inline Standard_ShortReal Intrv_Interval::TolStart () const
54{ return myTolStart; }
55
56//=======================================================================
57//function : TolEnd
58//purpose  :
59//=======================================================================
60
61inline Standard_ShortReal Intrv_Interval::TolEnd () const
62{ return myTolEnd; }
63
64//=======================================================================
65//function : Bounds
66//purpose  :
67//=======================================================================
68
69inline void Intrv_Interval::Bounds
70  (Standard_Real& Start, Standard_ShortReal& TolStart,
71   Standard_Real& End  , Standard_ShortReal& TolEnd) const
72{
73  Start    = myStart;
74  TolStart = myTolStart;
75  End      = myEnd;
76  TolEnd   = myTolEnd;
77}
78
79//=======================================================================
80//function : SetStart
81//purpose  :
82//=======================================================================
83
84inline void Intrv_Interval::SetStart
85  (const Standard_Real Start, const Standard_ShortReal TolStart)
86{
87  myStart    = Start;
88  myTolStart = TolStart;
89}
90
91//=======================================================================
92//function : FuseAtStart
93//
94//                 ****+****-------------------->      Old one
95//             ****+****------------------------>      New one to fuse
96//             <<<     <<<
97//             ****+****------------------------>      result
98//
99//=======================================================================
100
101inline void Intrv_Interval::FuseAtStart
102  (const Standard_Real Start, const Standard_ShortReal TolStart)
103{
104  if (myStart != RealFirst()) {
105    Standard_Real a = Min(myStart-myTolStart,Start-TolStart);
106    Standard_Real b = Min(myStart+myTolStart,Start+TolStart);
107    myStart    =                     (a+b)/2;
108    myTolStart = (Standard_ShortReal)(b-a)/2;
109  }
110}
111
112//=======================================================================
113//function : CutAtStart
114//
115//                          ****+****----------->      Old one
116//             <----------**+**                        Tool for cutting
117//                        >>>     >>>
118//                          ****+****----------->      result
119//
120//=======================================================================
121
122inline void Intrv_Interval::CutAtStart
123  (const Standard_Real Start, const Standard_ShortReal TolStart)
124{
125  if (myStart != RealFirst()) {
126    Standard_Real a = Max(myStart-myTolStart,Start-TolStart);
127    Standard_Real b = Max(myStart+myTolStart,Start+TolStart);
128    myStart    =                     (a+b)/2;
129    myTolStart = (Standard_ShortReal)(b-a)/2;
130  }
131}
132
133//=======================================================================
134//function : SetEnd
135//purpose  :
136//=======================================================================
137
138inline void Intrv_Interval::SetEnd
139  (const Standard_Real End, const Standard_ShortReal TolEnd)
140{
141  myEnd    = End;
142  myTolEnd = TolEnd;
143}
144
145//=======================================================================
146//function : FuseAtEnd
147//
148//             <---------------------****+****      Old one
149//             <-----------------**+**              New one to fuse
150//                                 >>>     >>>
151//             <---------------------****+****      result
152//
153//=======================================================================
154
155inline void Intrv_Interval::FuseAtEnd
156  (const Standard_Real End, const Standard_ShortReal TolEnd)
157{
158  if (myEnd != RealLast()) {
159    Standard_Real a = Max(myEnd-myTolEnd,End-TolEnd);
160    Standard_Real b = Max(myEnd+myTolEnd,End+TolEnd);
161    myEnd    =                     (a+b)/2;
162    myTolEnd = (Standard_ShortReal)(b-a)/2;
163  }
164}
165
166//=======================================================================
167//function : CutAtEnd
168//
169//             <-----****+****                      Old one
170//                         **+**------>             Tool for cutting
171//                   <<<     <<<
172//             <-----****+****                      result
173//
174//=======================================================================
175
176inline void Intrv_Interval::CutAtEnd
177  (const Standard_Real End, const Standard_ShortReal TolEnd)
178{
179  if (myEnd != RealLast()) {
180    Standard_Real a = Min(myEnd-myTolEnd,End-TolEnd);
181    Standard_Real b = Min(myEnd+myTolEnd,End+TolEnd);
182    myEnd    =                     (a+b)/2;
183    myTolEnd = (Standard_ShortReal)(b-a)/2;
184  }
185}
186
187//=======================================================================
188//function : AreFused
189//purpose  :
190//=======================================================================
191
192inline Standard_Boolean AreFused
193  (const Standard_Real c1,const Standard_ShortReal t1,
194   const Standard_Real c2,const Standard_ShortReal t2)
195{ return t1 + t2 >= Abs (c1 - c2); }
196
197//=======================================================================
198//function : IsProbablyEmpty
199//purpose  :
200//=======================================================================
201
202inline Standard_Boolean Intrv_Interval::IsProbablyEmpty () const
203{ return AreFused (myStart, myTolStart, myEnd, myTolEnd); }
204
205//=======================================================================
206//                   **-----------****             Other
207//     ***-----*                                   IsBefore
208//=======================================================================
209
210inline Standard_Boolean Intrv_Interval::IsBefore
211  (const Intrv_Interval& Other) const
212{ return myTolEnd + Other.myTolStart < Other.myStart - myEnd; }
213
214//=======================================================================
215//                   **-----------****             Other
216//                                       ***---*   IsAfter
217//=======================================================================
218
219inline Standard_Boolean Intrv_Interval::IsAfter
220  (const Intrv_Interval& Other) const
221{ return myTolStart + Other.myTolEnd < myStart - Other.myEnd; }
222
223//=======================================================================
224//                   **-----------****             Other
225//                         ***-*                   IsInside
226//=======================================================================
227
228inline Standard_Boolean Intrv_Interval::IsInside
229  (const Intrv_Interval& Other) const
230{ return myTolStart + Other.myTolStart < myStart     - Other.myStart &&
231         myTolEnd   + Other.myTolEnd   < Other.myEnd - myEnd; }
232
233//=======================================================================
234//                   **-----------****             Other
235//     ***-------------------------------------*   IsEnclosing
236//=======================================================================
237
238inline Standard_Boolean Intrv_Interval::IsEnclosing
239  (const Intrv_Interval& Other) const
240{ return myTolStart + Other.myTolStart < Other.myStart - myStart &&
241         myTolEnd   + Other.myTolEnd   < myEnd         - Other.myEnd; }
242
243//=======================================================================
244//                   **-----------****             Other
245//                  ***------------------------*   IsJustEnclosingAtStart
246//=======================================================================
247
248inline Standard_Boolean Intrv_Interval::IsJustEnclosingAtStart
249  (const Intrv_Interval& Other) const
250{ return AreFused (myStart, myTolStart, Other.myStart, Other.myTolStart) &&
251         myTolEnd + Other.myTolEnd < myEnd - Other.myEnd; }
252
253//=======================================================================
254//                   **-----------****             Other
255//     ***--------------------------*              IsJustEnclosingAtEnd
256//=======================================================================
257
258inline Standard_Boolean Intrv_Interval::IsJustEnclosingAtEnd
259  (const Intrv_Interval& Other) const
260{ return myTolStart + Other.myTolStart < Other.myStart - myStart &&
261         AreFused (Other.myEnd, Other.myTolEnd, myEnd, myTolEnd); }
262
263//=======================================================================
264//                   **-----------****             Other
265//     ***------------*                            IsJustBefore
266//=======================================================================
267
268inline Standard_Boolean Intrv_Interval::IsJustBefore
269  (const Intrv_Interval& Other) const
270{ return AreFused (myEnd, myTolEnd, Other.myStart, Other.myTolStart); }
271
272//=======================================================================
273//                   **-----------****             Other
274//                                  ***--------*   IsJustAfter
275//=======================================================================
276
277inline Standard_Boolean Intrv_Interval::IsJustAfter
278  (const Intrv_Interval& Other) const
279{ return AreFused (Other.myEnd, Other.myTolEnd, myStart, myTolStart); }
280
281//=======================================================================
282//                   **-----------****             Other
283//     ***-----------------*                       IsOverlappingAtStart
284//=======================================================================
285
286inline Standard_Boolean Intrv_Interval::IsOverlappingAtStart
287  (const Intrv_Interval& Other) const
288{ return myTolStart + Other.myTolStart < Other.myStart - myStart       &&
289         myTolEnd   + Other.myTolStart < myEnd         - Other.myStart &&
290         myTolEnd   + Other.myTolEnd   < Other.myEnd   - myEnd  ; }
291
292//=======================================================================
293//                   **-----------****             Other
294//                         ***-----------------*   IsOverlappingAtEnd
295//=======================================================================
296
297inline Standard_Boolean Intrv_Interval::IsOverlappingAtEnd
298  (const Intrv_Interval& Other) const
299{ return myTolStart + Other.myTolStart < myStart     - Other.myStart &&
300         myTolStart + Other.myTolEnd   < Other.myEnd - myStart       &&
301         myTolEnd   + Other.myTolEnd   < myEnd       - Other.myEnd; }
302
303//=======================================================================
304//                   **-----------****             Other
305//                  ***----*                       IsJustOverlappingAtStart
306//=======================================================================
307
308inline Standard_Boolean Intrv_Interval::IsJustOverlappingAtStart
309  (const Intrv_Interval& Other) const
310{ return AreFused (myStart, myTolStart, Other.myStart, Other.myTolStart) &&
311         myTolEnd + Other.myTolEnd < Other.myEnd - myEnd; }
312
313//=======================================================================
314//                   **-----------****             Other
315//                         ***------*              IsJustOverlappingAtEnd
316//=======================================================================
317
318inline Standard_Boolean Intrv_Interval::IsJustOverlappingAtEnd
319  (const Intrv_Interval& Other) const
320{ return myTolStart + Other.myTolStart < myStart - Other.myStart &&
321         AreFused (Other.myEnd, Other.myTolEnd, myEnd, myTolEnd); }
322
323//=======================================================================
324//                   **-----------****             Other
325//                  ***-------------*              IsSimilar
326//=======================================================================
327
328inline Standard_Boolean Intrv_Interval::IsSimilar
329  (const Intrv_Interval& Other) const
330{
331  Standard_Boolean b1,b2;
332  b1 = AreFused (myStart,myTolStart,Other.myStart,Other.myTolStart);
333  b2 = AreFused (myEnd  ,myTolEnd  ,Other.myEnd  ,Other.myTolEnd);
334  return b1 && b2;
335}
336
337