1 #ifndef DiscontinuousSegmentation_hxx
2 #define DiscontinuousSegmentation_hxx
14 const char *
what()
const throw () {
return "Segmentation point inserted out of limits";}
19 const char *
what()
const throw () {
return "Odd number of segmentation points, every segment beggining must be followed by its ending";}
26 double previousOffsetPosition,
27 double intendedOnsetPosition)
29 std::ostringstream os;
30 os <<
"Segment " << missplacedOnset
31 <<
" starts at " << intendedOnsetPosition
32 <<
" overlapping previous segment which ends at " << previousOffsetPosition;
36 const char *
what()
const throw () {
return _message.c_str(); }
44 double offsetPosition)
46 std::ostringstream os;
47 os <<
"Segment " << missplacedOffset
48 <<
" starts at " << onsetPosition
49 <<
" but ends before that, at " << offsetPosition;
53 const char *
what()
const throw () {
return _message.c_str(); }
77 double previousOffset=0.0;
79 for (
const TData* it=begin; it!=end; i++)
82 std::cout << onset <<
" " << std::flush;
83 if (onset<previousOffset)
throw MissplacedOnset(i,previousOffset,onset);
85 double offset = *it++;
86 std::cout << offset <<
" " << std::flush;
93 previousOffset=offset;
103 TimePositions::iterator nextOffset =
107 _onsets.push_back(timePosition);
114 unsigned nextOffsetPosition = nextOffset -
_offsets.begin();
115 if (
_onsets[nextOffsetPosition]<=timePosition)
117 _offsets.insert(nextOffset, timePosition);
118 _onsets.insert(
_onsets.begin()+nextOffsetPosition+1, timePosition);
122 return nextOffsetPosition+1;
131 return nextOffsetPosition;
138 unsigned insert(
double timePosition, std::string label)
140 unsigned segment =
insert(timePosition);
150 void remove(
unsigned segment)
164 unsigned pickOffset(
double timePosition,
double tolerance)
const
166 return pickPosition(
_offsets, timePosition, tolerance);
174 unsigned pickOnset(
double timePosition,
double tolerance)
const
176 return pickPosition(
_onsets, timePosition, tolerance);
183 if (timePosition<0)
return _offsets.size();
184 TimePositions::const_iterator lowerBound =
186 unsigned index = lowerBound-
_offsets.begin();
187 if (index==
_offsets.size())
return index;
196 void dragOnset(
unsigned segment,
double newTimePosition)
199 if (segment>=
_onsets.size())
return;
202 double leftBound = segment ?
_offsets[segment-1] : 0;
203 if (newTimePosition<leftBound)
204 newTimePosition=leftBound;
206 double rigthBound =
_offsets[segment];
207 if (newTimePosition>rigthBound)
208 newTimePosition=rigthBound;
211 _onsets[segment]=newTimePosition;
220 if (segment>=
_offsets.size())
return;
224 if (newTimePosition>rigthBound)
225 newTimePosition=rigthBound;
227 double leftBound =
_onsets[segment];
228 if (newTimePosition<leftBound)
229 newTimePosition=leftBound;
239 unsigned nSegments =
_onsets.size();
240 segmentation.
Resize(nSegments*2);
241 segmentation.
SetSize(nSegments*2);
242 for (
unsigned i=0; i<nSegments; i++)
244 segmentation[i*2] =
_onsets[i];
249 const char *
GetClassName()
const {
return "DiscontinuousSegmentation"; }
260 unsigned pickPosition(
const TimePositions & positions,
double timePosition,
double tolerance)
const
262 TimePositions::const_iterator lowerBound =
263 std::lower_bound(positions.begin(), positions.end(), timePosition-tolerance);
264 TimePositions::const_iterator upperBound =
265 std::upper_bound(lowerBound, positions.end(), timePosition+tolerance);
267 if (lowerBound==upperBound)
return positions.size();
270 unsigned lowerSegment = lowerBound - positions.begin();
271 unsigned upperSegment = upperBound - positions.begin();
272 double lastDifference = std::fabs(timePosition-positions[lowerSegment]);
273 for (
unsigned i=lowerSegment; i<upperSegment; i++)
275 double newDifference = std::fabs(timePosition-positions[i]);
276 if (newDifference>lastDifference)
break;
277 lastDifference = newDifference;
288 #endif//DiscontinuousSegmentation_hxx