d8eddc
d8eddc
d8eddc
#include <tools modifiers="" modifiersegmentation.h=""></tools>
d8eddc
#include <algorithm></algorithm>
d8eddc
d8eddc
d8eddc
//*****************************************************************************************
d8eddc
//    TModifierSegmentation implementation
d8eddc
//*****************************************************************************************
d8eddc
d8eddc
f278a5
TModifierSegmentation::TModifierSegmentation(const TPointD &step, int maxLevel):
f278a5
  m_maxLevel(0)
f278a5
  { setStep(step); setMaxLevel(maxLevel); }
493cac
493cac
493cac
void
493cac
TModifierSegmentation::setStep(const TPointD &step) {
493cac
  m_step.x = std::max(TConsts::epsilon, fabs(step.x));
493cac
  m_step.y = std::max(TConsts::epsilon, fabs(step.y));
493cac
}
d8eddc
d8eddc
d8eddc
void
f278a5
TModifierSegmentation::setMaxLevel(int maxLevel) {
f278a5
  m_maxLevel = std::max(0, maxLevel);
f278a5
}
f278a5
f278a5
f278a5
void
d8eddc
TModifierSegmentation::addSegments(
d8eddc
  TTrack &track,
d8eddc
  const TTrackPoint &p0,
d8eddc
  const TTrackPoint &p1,
d8eddc
  int level)
d8eddc
{
d8eddc
  TPointD d = p1.position - p0.position;
d8eddc
f278a5
  if (level <= 0 || (fabs(d.x) <= m_step.x && fabs(d.y) <= m_step.y)) {
f278a5
    track.push_back(p1, false);
d8eddc
    return;
d8eddc
  }
d8eddc
f278a5
  --level;
fa009d
  TTrackPoint p = track.calcPointFromOriginal(0.5*(p0.originalIndex + p1.originalIndex));
f278a5
  addSegments(track, p0, p, level);
f278a5
  addSegments(track, p, p1, level);
d8eddc
}
d8eddc
d8eddc
d8eddc
void
d8eddc
TModifierSegmentation::modifyTrack(
c3c215
  const TTrack &track,
d8eddc
  TTrackList &outTracks )
d8eddc
{
c3c215
  if (!track.handler) {
fa009d
    Handler *handler = new Handler();
fa009d
    track.handler = handler;
fa009d
    handler->track = new TTrack(track);
fa009d
    new Interpolator(*handler->track);
d8eddc
  }
d8eddc
fa009d
  Handler *handler = dynamic_cast<handler*>(track.handler.getPointer());</handler*>
fa009d
  if (!handler)
d8eddc
    return;
fa009d
  
fa009d
  outTracks.push_back(handler->track);
fa009d
  TTrack &subTrack = *handler->track;
fa009d
  
9f0c16
  if (!track.changed())
9f0c16
    return;
fa009d
  
d8eddc
  // remove points
c3c215
  int start = track.size() - track.pointsAdded;
d8eddc
  if (start < 0) start = 0;
f278a5
  int subStart = start > 0 ? subTrack.floorIndex(subTrack.indexByOriginalIndex(start-1)) + 1 : 0;
00337d
  subTrack.truncate(subStart);
d8eddc
d8eddc
  // add points
fa009d
  TTrackPoint p0 = subTrack.pointFromOriginal(start - 1);
c3c215
  for(int i = start; i < track.size(); ++i) {
fa009d
    TTrackPoint p1 = subTrack.pointFromOriginal(i);
f278a5
    addSegments(subTrack, p0, p1, m_maxLevel);
d8eddc
    p0 = p1;
d8eddc
  }
d8eddc
f278a5
  // fix points
f278a5
  if (track.fixedSize())
f278a5
    subTrack.fix_to(
f278a5
      subTrack.floorIndex(subTrack.indexByOriginalIndex(track.fixedSize() - 1)) + 1 );
f278a5
  
00337d
  track.resetChanges();
d8eddc
}