Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: c10388203be8
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 7bb41a421abe
Choose a head ref
  • 5 commits
  • 4 files changed
  • 1 contributor

Commits on Oct 30, 2021

  1. Planetarium compiles.

    pleroy committed Oct 30, 2021
    Copy the full SHA
    d81ad5b View commit details
  2. Change FindSegment to avoid failing when given a time before the begi…

    …nning of the trajectory.
    pleroy committed Oct 30, 2021
    Copy the full SHA
    104ed55 View commit details
  3. Planetarium test passing.

    pleroy committed Oct 30, 2021
    Copy the full SHA
    18435ad View commit details
  4. Copy the full SHA
    f1cab80 View commit details
  5. Merge pull request #3181 from pleroy/Planetarium

    Convert Planetarium and its test to DiscreteTraject0ry
    pleroy authored Oct 30, 2021
    Copy the full SHA
    7bb41a4 View commit details
Showing with 99 additions and 78 deletions.
  1. +14 −14 ksp_plugin/planetarium.cpp
  2. +13 −10 ksp_plugin/planetarium.hpp
  3. +55 −37 ksp_plugin_test/planetarium_test.cpp
  4. +17 −17 testing_utilities/discrete_trajectory_factories_body.hpp
28 changes: 14 additions & 14 deletions ksp_plugin/planetarium.cpp
Original file line number Diff line number Diff line change
@@ -48,14 +48,13 @@ Planetarium::Planetarium(
plotting_frame_(plotting_frame) {}

RP2Lines<Length, Camera> Planetarium::PlotMethod0(
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end,
DiscreteTraject0ry<Barycentric> const& trajectory,
DiscreteTraject0ry<Barycentric>::iterator const begin,
DiscreteTraject0ry<Barycentric>::iterator const end,
Instant const& now,
bool const /*reverse*/) const {
auto const plottable_begin =
begin.trajectory()->LowerBound(plotting_frame_->t_min());
auto const plottable_end =
begin.trajectory()->LowerBound(plotting_frame_->t_max());
auto const plottable_begin = trajectory.lower_bound(plotting_frame_->t_min());
auto const plottable_end = trajectory.lower_bound(plotting_frame_->t_max());
auto const plottable_spheres = ComputePlottableSpheres(now);
auto const plottable_segments = ComputePlottableSegments(plottable_spheres,
plottable_begin,
@@ -98,16 +97,17 @@ RP2Lines<Length, Camera> Planetarium::PlotMethod0(
}

RP2Lines<Length, Camera> Planetarium::PlotMethod1(
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end,
DiscreteTraject0ry<Barycentric> const& trajectory,
DiscreteTraject0ry<Barycentric>::iterator const begin,
DiscreteTraject0ry<Barycentric>::iterator const end,
Instant const& now,
bool const reverse) const {
Length const focal_plane_tolerance =
perspective_.focal() * parameters_.tan_angular_resolution_;
auto const focal_plane_tolerance² =
focal_plane_tolerance * focal_plane_tolerance;

auto const rp2_lines = PlotMethod0(begin, end, now, reverse);
auto const rp2_lines = PlotMethod0(trajectory, begin, end, now, reverse);

RP2Lines<Length, Camera> new_rp2_lines;
for (auto const& rp2_line : rp2_lines) {
@@ -135,16 +135,16 @@ RP2Lines<Length, Camera> Planetarium::PlotMethod1(
}

RP2Lines<Length, Camera> Planetarium::PlotMethod2(
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end,
Trajectory<Barycentric> const& trajectory,
DiscreteTraject0ry<Barycentric>::iterator const begin,
DiscreteTraject0ry<Barycentric>::iterator const end,
Instant const& now,
bool const reverse) const {
if (begin == end) {
return {};
}
auto last = end;
--last;
auto const& trajectory = *begin.trajectory();
auto const begin_time = std::max(begin->time, plotting_frame_->t_min());
auto const last_time = std::min(last->time, plotting_frame_->t_max());
return PlotMethod2(trajectory, begin_time, last_time, now, reverse);
@@ -278,8 +278,8 @@ std::vector<Sphere<Navigation>> Planetarium::ComputePlottableSpheres(

Segments<Navigation> Planetarium::ComputePlottableSegments(
const std::vector<Sphere<Navigation>>& plottable_spheres,
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end) const {
DiscreteTraject0ry<Barycentric>::iterator const begin,
DiscreteTraject0ry<Barycentric>::iterator const end) const {
Segments<Navigation> all_segments;
if (begin == end) {
return all_segments;
23 changes: 13 additions & 10 deletions ksp_plugin/planetarium.hpp
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@
#include "geometry/sphere.hpp"
#include "ksp_plugin/frames.hpp"
#include "physics/degrees_of_freedom.hpp"
#include "physics/discrete_trajectory.hpp"
#include "physics/discrete_traject0ry.hpp"
#include "physics/ephemeris.hpp"
#include "physics/rigid_motion.hpp"
#include "quantities/quantities.hpp"
@@ -31,7 +31,7 @@ using geometry::Segment;
using geometry::Segments;
using geometry::Sphere;
using physics::DegreesOfFreedom;
using physics::DiscreteTrajectory;
using physics::DiscreteTraject0ry;
using physics::Ephemeris;
using physics::RigidMotion;
using physics::Trajectory;
@@ -70,25 +70,28 @@ class Planetarium {
// A no-op method that just returns all the points in the trajectory defined
// by |begin| and |end|.
RP2Lines<Length, Camera> PlotMethod0(
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end,
DiscreteTraject0ry<Barycentric> const& trajectory,
DiscreteTraject0ry<Barycentric>::iterator begin,
DiscreteTraject0ry<Barycentric>::iterator end,
Instant const& now,
bool reverse) const;

// A method that coalesces segments until they are larger than the angular
// resolution.
RP2Lines<Length, Camera> PlotMethod1(
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end,
DiscreteTraject0ry<Barycentric> const& trajectory,
DiscreteTraject0ry<Barycentric>::iterator begin,
DiscreteTraject0ry<Barycentric>::iterator end,
Instant const& now,
bool reverse) const;

// A method that plots the cubic Hermite spline interpolating the trajectory,
// using an adaptive step size to keep the error between the straight segments
// and the actual spline below and close to the angular resolution.
RP2Lines<Length, Camera> PlotMethod2(
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end,
Trajectory<Barycentric> const& trajectory,
DiscreteTraject0ry<Barycentric>::iterator begin,
DiscreteTraject0ry<Barycentric>::iterator end,
Instant const& now,
bool reverse) const;

@@ -110,8 +113,8 @@ class Planetarium {
// are not hidden by the |plottable_spheres|.
Segments<Navigation> ComputePlottableSegments(
const std::vector<Sphere<Navigation>>& plottable_spheres,
DiscreteTrajectory<Barycentric>::Iterator const& begin,
DiscreteTrajectory<Barycentric>::Iterator const& end) const;
DiscreteTraject0ry<Barycentric>::iterator begin,
DiscreteTraject0ry<Barycentric>::iterator end) const;

Parameters const parameters_;
Perspective<Navigation, Camera> const perspective_;
92 changes: 55 additions & 37 deletions ksp_plugin_test/planetarium_test.cpp
Original file line number Diff line number Diff line change
@@ -10,9 +10,12 @@
#include "geometry/grassmann.hpp"
#include "geometry/linear_map.hpp"
#include "geometry/named_quantities.hpp"
#include "geometry/orthogonal_map.hpp"
#include "geometry/perspective.hpp"
#include "geometry/rotation.hpp"
#include "gtest/gtest.h"
#include "physics/discrete_traject0ry.hpp"
#include "physics/ephemeris.hpp"
#include "physics/massive_body.hpp"
#include "physics/mock_continuous_trajectory.hpp"
#include "physics/mock_dynamic_frame.hpp"
@@ -23,16 +26,16 @@
#include "quantities/elementary_functions.hpp"
#include "quantities/si.hpp"
#include "testing_utilities/almost_equals.hpp"
#include "testing_utilities/discrete_trajectory_factories.hpp"
#include "testing_utilities/serialization.hpp"
#include "testing_utilities/trajectory_factories.hpp"
#include "testing_utilities/vanishes_before.hpp"

namespace principia {
namespace ksp_plugin {
namespace internal_planetarium {

using astronomy::InfinitePast;
using astronomy::InfiniteFuture;
using base::not_null;
using base::make_not_null_unique;
using base::ParseFromBytes;
using geometry::AngularVelocity;
@@ -42,14 +45,18 @@ using geometry::DeduceSignReversingOrientation;
using geometry::Displacement;
using geometry::Frame;
using geometry::Handedness;
using geometry::Instant;
using geometry::LinearMap;
using geometry::OrthogonalMap;
using geometry::Perspective;
using geometry::RigidTransformation;
using geometry::Rotation;
using geometry::Sign;
using geometry::Signature;
using geometry::Vector;
using geometry::Velocity;
using physics::DiscreteTraject0ry;
using physics::Ephemeris;
using physics::MassiveBody;
using physics::MockContinuousTrajectory;
using physics::MockDynamicFrame;
@@ -67,7 +74,8 @@ using quantities::si::Metre;
using quantities::si::Radian;
using quantities::si::Second;
using testing_utilities::AlmostEquals;
using testing_utilities::NewCircularTrajectory;
using testing_utilities::AppendTrajectoryTimeline;
using testing_utilities::NewCircularTrajectoryTimeline;
using testing_utilities::ReadFromBinaryFile;
using testing_utilities::VanishesBefore;
using ::testing::_;
@@ -133,12 +141,14 @@ class PlanetariumTest : public ::testing::Test {
};

TEST_F(PlanetariumTest, PlotMethod0) {
auto const discrete_trajectory =
NewCircularTrajectory<Barycentric>(/*period=*/10 * Second,
/*r=*/10 * Metre,
/*Δt=*/1 * Second,
/*t1=*/t0_,
/*t2=*/t0_ + 11 * Second);
DiscreteTraject0ry<Barycentric> discrete_trajectory;
AppendTrajectoryTimeline(/*from=*/NewCircularTrajectoryTimeline<Barycentric>(
/*period=*/10 * Second,
/*r=*/10 * Metre,
/*Δt=*/1 * Second,
/*t1=*/t0_,
/*t2=*/t0_ + 11 * Second),
/*to=*/discrete_trajectory);

// No dark area, infinite acuity, wide field of view.
Planetarium::Parameters parameters(
@@ -148,8 +158,9 @@ TEST_F(PlanetariumTest, PlotMethod0) {
Planetarium planetarium(
parameters, perspective_, &ephemeris_, &plotting_frame_);
auto const rp2_lines =
planetarium.PlotMethod0(discrete_trajectory->begin(),
discrete_trajectory->end(),
planetarium.PlotMethod0(discrete_trajectory,
discrete_trajectory.begin(),
discrete_trajectory.end(),
t0_ + 10 * Second,
/*reverse=*/false);

@@ -176,12 +187,14 @@ TEST_F(PlanetariumTest, PlotMethod0) {
TEST_F(PlanetariumTest, PlotMethod1) {
// A quarter of a circular trajectory around the origin, with many small
// segments.
auto const discrete_trajectory =
NewCircularTrajectory<Barycentric>(/*period=*/100'000 * Second,
/*r=*/10 * Metre,
/*Δt=*/1 * Second,
/*t1=*/t0_,
/*t2=*/t0_ + 25'000 * Second);
DiscreteTraject0ry<Barycentric> discrete_trajectory;
AppendTrajectoryTimeline(/*from=*/NewCircularTrajectoryTimeline<Barycentric>(
/*period=*/100'000 * Second,
/*r=*/10 * Metre,
/*Δt=*/1 * Second,
/*t1=*/t0_,
/*t2=*/t0_ + 25'000 * Second),
/*to=*/discrete_trajectory);

// No dark area, human visual acuity, wide field of view.
Planetarium::Parameters parameters(
@@ -191,8 +204,9 @@ TEST_F(PlanetariumTest, PlotMethod1) {
Planetarium planetarium(
parameters, perspective_, &ephemeris_, &plotting_frame_);
auto const rp2_lines =
planetarium.PlotMethod1(discrete_trajectory->begin(),
discrete_trajectory->end(),
planetarium.PlotMethod1(discrete_trajectory,
discrete_trajectory.begin(),
discrete_trajectory.end(),
t0_ + 10 * Second,
/*reverse=*/false);

@@ -209,12 +223,14 @@ TEST_F(PlanetariumTest, PlotMethod1) {
TEST_F(PlanetariumTest, PlotMethod2) {
// A quarter of a circular trajectory around the origin, with many small
// segments.
auto const discrete_trajectory =
NewCircularTrajectory<Barycentric>(/*period=*/100'000 * Second,
/*r=*/10 * Metre,
/*Δt=*/1 * Second,
/*t1=*/t0_,
/*t2=*/t0_ + 25'000 * Second);
DiscreteTraject0ry<Barycentric> discrete_trajectory;
AppendTrajectoryTimeline(/*from=*/NewCircularTrajectoryTimeline<Barycentric>(
/*period=*/100'000 * Second,
/*r=*/10 * Metre,
/*Δt=*/1 * Second,
/*t1=*/t0_,
/*t2=*/t0_ + 25'000 * Second),
/*to=*/discrete_trajectory);

// No dark area, human visual acuity, wide field of view.
Planetarium::Parameters parameters(
@@ -224,8 +240,9 @@ TEST_F(PlanetariumTest, PlotMethod2) {
Planetarium planetarium(
parameters, perspective_, &ephemeris_, &plotting_frame_);
auto const rp2_lines =
planetarium.PlotMethod2(discrete_trajectory->begin(),
discrete_trajectory->end(),
planetarium.PlotMethod2(discrete_trajectory,
discrete_trajectory.begin(),
discrete_trajectory.end(),
t0_ + 10 * Second,
/*reverse=*/false);

@@ -241,11 +258,12 @@ TEST_F(PlanetariumTest, PlotMethod2) {

#if !defined(_DEBUG)
TEST_F(PlanetariumTest, RealSolarSystem) {
auto discrete_trajectory = DiscreteTrajectory<Barycentric>::ReadFromMessage(
ParseFromBytes<serialization::DiscreteTrajectory>(
ReadFromBinaryFile(SOLUTION_DIR / "ksp_plugin_test" /
"planetarium_trajectory.proto.bin")),
/*forks=*/{});
auto const discrete_trajectory =
DiscreteTraject0ry<Barycentric>::ReadFromMessage(
ParseFromBytes<serialization::DiscreteTrajectory>(
ReadFromBinaryFile(SOLUTION_DIR / "ksp_plugin_test" /
"planetarium_trajectory.proto.bin")),
/*tracked=*/{});

auto ephemeris = Ephemeris<Barycentric>::ReadFromMessage(
InfiniteFuture,
@@ -265,7 +283,7 @@ TEST_F(PlanetariumTest, RealSolarSystem) {
ReadFromBinaryFile(SOLUTION_DIR / "ksp_plugin_test" /
"planetarium_to_camera.proto.bin")));

EXPECT_EQ(23423, discrete_trajectory->Size());
EXPECT_EQ(23423, discrete_trajectory.size());

Planetarium::Parameters parameters(
/*sphere_radius_multiplier=*/1,
@@ -277,9 +295,10 @@ TEST_F(PlanetariumTest, RealSolarSystem) {
ephemeris.get(),
plotting_frame.get());
auto const rp2_lines =
planetarium.PlotMethod2(discrete_trajectory->begin(),
discrete_trajectory->end(),
discrete_trajectory->back().time,
planetarium.PlotMethod2(discrete_trajectory,
discrete_trajectory.begin(),
discrete_trajectory.end(),
discrete_trajectory.back().time,
/*reverse=*/false);

EXPECT_EQ(2, rp2_lines.size());
@@ -288,6 +307,5 @@ TEST_F(PlanetariumTest, RealSolarSystem) {
}
#endif

} // namespace internal_planetarium
} // namespace ksp_plugin
} // namespace principia
Loading