void
sObstructionMap::RemoveSegmentByPoint(int x, int y)
{
  // if there aren't any segments, don't do anything
  if (m_Segments.size() == 0) {
    return;
  }

  // find minimum distance
  double distance = DistanceToSegment(x, y, 0);
  int point = 0;
  for (int i = 1; i < m_Segments.size(); i++) {
    double new_distance = DistanceToSegment(x, y, i);
    if (new_distance < distance) {
      distance = new_distance;
      point = i;
    }
  }

  // remove that point
  RemoveSegment(point);
}
void SectionSelector::SelectSection(SelectionTracker* tracker, const SectionInfo& si)
{
	if(!si.bb.IsInside(tracker->GetPoint())) return;
	const Vector2d* last = nullptr;
	for(const Vector2d& p : si.pixels)
	{
		if(last == nullptr) { last = &p; continue; }
		Vector2d nearest;
		double distanceSeg = DistanceToSegment(tracker->GetPoint(), *last, p, &nearest);
		if(tracker->Validate(distanceSeg, this))
		{
			mSection = si.section;
			mNearest = nearest;
		}
		last = &p;
	}
}
void WayPointSelector::SelectWayPoint(SelectionTracker* tracker, const SectionInfo& si)
{
	if(!si.bb.IsInside(tracker->GetPoint())) return;
	const Vector2d* last = nullptr;
	Section::LocationList::const_iterator it = si.section->GetLocations().begin();
	for(const Vector2d& p : si.pixels)
	{
		if(last == nullptr) { last = &p; it++; continue; }
		Vector2d nearest;
		double distanceSeg = DistanceToSegment(tracker->GetPoint(), *last, p, &nearest);
		if(tracker->Validate(distanceSeg, this))
		{
			delete mWayPoint;
			mWayPoint = new WayPoint(si.section, it - 1, tracker->GetViewport()->PixelToLocation(nearest));
		}
		last = &p;
		it++;
	}
}