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); }; }
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; }
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); }; }