Esempio n. 1
0
GeoVector 
TaskLeg::leg_vector_remaining(const GeoPoint &ref) const
{
  switch (destination.getActiveState()) {
  case OrderedTaskPoint::AFTER_ACTIVE:
    if (!origin()) {
      return GeoVector(fixed_zero);
    }
    // this leg totally included
    return memo_remaining.calc(origin()->get_location_remaining(), 
                               destination.get_location_remaining());
    break;
  case OrderedTaskPoint::CURRENT_ACTIVE:
    if (!origin()) {
      return GeoVector(fixed_zero, 
                       ref.bearing(destination.get_location_remaining()));
    }
    // this leg partially included
    return memo_remaining.calc(ref, 
                               destination.get_location_remaining());
    break;
  case OrderedTaskPoint::BEFORE_ACTIVE:
    // this leg not included
  default:
    assert(1); // error!
    return GeoVector(fixed_zero);
  };
}
Esempio n. 2
0
void
AATPoint::get_target_range_radial(fixed &range, fixed &radial) const
{
  const fixed oldrange = range;

  const GeoPoint fprev = get_previous()->get_location_remaining();
  const GeoPoint floc = get_location();
  const Angle radialraw = (floc.bearing(get_location_target()) -
      fprev.bearing(floc)).as_bearing();

  const fixed d = floc.distance(get_location_target());
  const fixed radius = floc.distance(get_location_min());
  const fixed rangeraw = min(fixed_one, d / radius);

  radial = radialraw.as_delta().value_degrees();
  const fixed rangesign = (fabs(radial) > fixed(90)) ?
      fixed_minus_one : fixed_one;
  range = rangeraw * rangesign;

  if ((oldrange == fixed_zero) && (range == fixed_zero))
    radial = fixed_zero;
}
Esempio n. 3
0
GeoVector
TaskLeg::leg_vector_travelled(const GeoPoint &ref) const
{
  switch (destination.getActiveState()) {
  case OrderedTaskPoint::BEFORE_ACTIVE:
    if (!origin()) {
      return GeoVector(fixed_zero);
    }
    // this leg totally included
    return memo_travelled.calc(origin()->get_location_travelled(), 
                               destination.get_location_travelled());
    break;
  case OrderedTaskPoint::CURRENT_ACTIVE:
    // this leg partially included
    if (!origin()) {
      return GeoVector(fixed_zero, 
                       ref.bearing(destination.get_location_remaining()));
    }
    if (destination.has_entered()) {
      return memo_travelled.calc(origin()->get_location_travelled(), 
                                 destination.get_location_travelled());
    } else {
      return memo_travelled.calc(origin()->get_location_travelled(), 
                                 ref);
    }
    break;
  case OrderedTaskPoint::AFTER_ACTIVE:
    if (!origin()) {
      return GeoVector(fixed_zero);
    }
    // this leg may be partially included
    if (origin()->has_entered()) {
      return memo_travelled.calc(origin()->get_location_travelled(), 
                                 ref);
    }
  default:
    return GeoVector(fixed_zero);
  };
}