diff --git a/physics/discrete_trajectory_body.hpp b/physics/discrete_trajectory_body.hpp index 190cd7a757..fb387aac9d 100644 --- a/physics/discrete_trajectory_body.hpp +++ b/physics/discrete_trajectory_body.hpp @@ -429,11 +429,21 @@ void DiscreteTrajectory::Merge(DiscreteTrajectory trajectory) { template Instant DiscreteTrajectory::t_min() const { - return segments_->front().t_min(); + if (empty()) { + return InfiniteFuture; + } + for (auto sit = segments_->begin();; ++sit) { + if (!sit->empty()) { + return sit->t_min(); + } + } } template Instant DiscreteTrajectory::t_max() const { + if (empty()) { + return InfinitePast; + } return segments_->back().t_max(); } diff --git a/physics/discrete_trajectory_test.cpp b/physics/discrete_trajectory_test.cpp index 0b99ba2bb6..05c92639d6 100644 --- a/physics/discrete_trajectory_test.cpp +++ b/physics/discrete_trajectory_test.cpp @@ -32,6 +32,7 @@ using geometry::Displacement; using geometry::Frame; using geometry::Handedness; using geometry::Inertial; +using geometry::InfiniteFuture; using geometry::Instant; using geometry::Velocity; using quantities::AngularFrequency; @@ -523,16 +524,19 @@ TEST_F(DiscreteTrajectoryTest, ForgetBefore) { EXPECT_EQ(3, trajectory.segments().size()); EXPECT_EQ(t0_ + 3 * Second, trajectory.begin()->time); EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time); + EXPECT_EQ(t0_ + 3 * Second, trajectory.t_min()); trajectory.ForgetBefore(t0_ + 6.1 * Second); EXPECT_EQ(3, trajectory.segments().size()); EXPECT_EQ(t0_ + 7 * Second, trajectory.begin()->time); EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time); + EXPECT_EQ(t0_ + 7 * Second, trajectory.t_min()); trajectory.ForgetBefore(t0_ + 9 * Second); EXPECT_EQ(3, trajectory.segments().size()); EXPECT_EQ(t0_ + 9 * Second, trajectory.begin()->time); EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time); + EXPECT_EQ(t0_ + 9 * Second, trajectory.t_min()); // The trajectory now has empty segments, so let's check that we can properly // iterate over those. @@ -565,9 +569,11 @@ TEST_F(DiscreteTrajectoryTest, ForgetBefore) { trajectory.ForgetBefore(t0_ + 99 * Second); EXPECT_TRUE(trajectory.empty()); + EXPECT_EQ(InfiniteFuture, trajectory.t_min()); trajectory.ForgetBefore(trajectory.end()); EXPECT_TRUE(trajectory.empty()); + EXPECT_EQ(InfiniteFuture, trajectory.t_min()); } TEST_F(DiscreteTrajectoryTest, Merge) {