Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
#include <tools/modifiers/modifiersegmentation.h>
Ivan Mahonin d8eddc
#include <algorithm>
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
//*****************************************************************************************
Ivan Mahonin d8eddc
//    TModifierSegmentation implementation
Ivan Mahonin d8eddc
//*****************************************************************************************
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
Ivan Mahonin 493cac
TModifierSegmentation::TModifierSegmentation(const TPointD &step)
Ivan Mahonin 493cac
  { setStep(step); }
Ivan Mahonin 493cac
Ivan Mahonin 493cac
Ivan Mahonin 493cac
void
Ivan Mahonin 493cac
TModifierSegmentation::setStep(const TPointD &step) {
Ivan Mahonin 493cac
  m_step.x = std::max(TConsts::epsilon, fabs(step.x));
Ivan Mahonin 493cac
  m_step.y = std::max(TConsts::epsilon, fabs(step.y));
Ivan Mahonin 493cac
}
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
void
Ivan Mahonin d8eddc
TModifierSegmentation::addSegments(
Ivan Mahonin d8eddc
  TTrack &track,
Ivan Mahonin d8eddc
  const TTrackPoint &p0,
Ivan Mahonin d8eddc
  const TTrackPoint &p1,
Ivan Mahonin d8eddc
  int level)
Ivan Mahonin d8eddc
{
Ivan Mahonin d8eddc
  static const int maxRecursion = 10;
Ivan Mahonin d8eddc
  TPointD d = p1.position - p0.position;
Ivan Mahonin d8eddc
Ivan Mahonin 493cac
  if (level >= maxRecursion || (fabs(d.x) <= m_step.x && fabs(d.y) <= m_step.y)) {
Ivan Mahonin d8eddc
    track.push_back(p1);
Ivan Mahonin d8eddc
    return;
Ivan Mahonin d8eddc
  }
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
  TTrackPoint p = track.modifier->calcPoint(0.5*(p0.originalIndex + p1.originalIndex));
Ivan Mahonin d8eddc
  addSegments(track, p0, p, level + 1);
Ivan Mahonin d8eddc
  addSegments(track, p, p1, level + 1);
Ivan Mahonin d8eddc
}
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
void
Ivan Mahonin d8eddc
TModifierSegmentation::modifyTrack(
Ivan Mahonin c3c215
  const TTrack &track,
Ivan Mahonin d8eddc
  const TInputSavePoint::Holder &savePoint,
Ivan Mahonin d8eddc
  TTrackList &outTracks )
Ivan Mahonin d8eddc
{
Ivan Mahonin c3c215
  if (!track.handler) {
Ivan Mahonin c3c215
    track.handler = new TTrackHandler(track);
Ivan Mahonin c3c215
    track.handler->tracks.push_back(
Ivan Mahonin d8eddc
      new TTrack(
Ivan Mahonin c3c215
        new TTrackModifier(*track.handler) ));
Ivan Mahonin d8eddc
  }
Ivan Mahonin d8eddc
Ivan Mahonin 9f0c16
  if (track.handler->tracks.empty())
Ivan Mahonin d8eddc
    return;
Ivan Mahonin d8eddc
Ivan Mahonin c3c215
  TTrack &subTrack = *track.handler->tracks.front();
Ivan Mahonin c3c215
  outTracks.push_back(track.handler->tracks.front());
Ivan Mahonin d8eddc
Ivan Mahonin 9f0c16
  if (!track.changed())
Ivan Mahonin 9f0c16
    return;
Ivan Mahonin 9f0c16
Ivan Mahonin d8eddc
  // remove points
Ivan Mahonin c3c215
  int start = track.size() - track.pointsAdded;
Ivan Mahonin d8eddc
  if (start < 0) start = 0;
Ivan Mahonin 9f0c16
  int subStart = subTrack.floorIndex(subTrack.indexByOriginalIndex(start-1)) + 1;
Ivan Mahonin 00337d
  subTrack.truncate(subStart);
Ivan Mahonin d8eddc
Ivan Mahonin d8eddc
  // add points
Ivan Mahonin d8eddc
  TTrackPoint p0 = subTrack.modifier->calcPoint(start - 1);
Ivan Mahonin c3c215
  for(int i = start; i < track.size(); ++i) {
Ivan Mahonin d8eddc
    TTrackPoint p1 = subTrack.modifier->calcPoint(i);
Ivan Mahonin d8eddc
    addSegments(subTrack, p0, p1);
Ivan Mahonin d8eddc
    p0 = p1;
Ivan Mahonin d8eddc
  }
Ivan Mahonin d8eddc
Ivan Mahonin 00337d
  track.resetChanges();
Ivan Mahonin d8eddc
}