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: daf3bbf1b91e
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 1e78803ea251
Choose a head ref
  • 13 commits
  • 23 files changed
  • 2 contributors

Commits on Dec 26, 2019

  1. Copy the full SHA
    006b461 View commit details
  2. Geometry compiles.

    pleroy committed Dec 26, 2019
    Copy the full SHA
    c3b15bd View commit details
  3. Fix tests.

    pleroy committed Dec 26, 2019
    Copy the full SHA
    60a6817 View commit details
  4. Rename.

    pleroy committed Dec 26, 2019
    Copy the full SHA
    31146a3 View commit details
  5. Copy the full SHA
    83a1a53 View commit details
  6. Copy the full SHA
    2bdd03b View commit details

Commits on Dec 27, 2019

  1. Copy the full SHA
    f8963dd View commit details
  2. Everything compiles.

    pleroy committed Dec 27, 2019
    Copy the full SHA
    6478a00 View commit details
  3. Merge.

    pleroy committed Dec 27, 2019
    Copy the full SHA
    16c19c6 View commit details
  4. After egg's review.

    pleroy committed Dec 27, 2019
    Copy the full SHA
    67ef250 View commit details
  5. Copy the full SHA
    bef93aa View commit details
  6. Lint.

    pleroy committed Dec 27, 2019
    Copy the full SHA
    f9b2391 View commit details
  7. Merge pull request #2414 from pleroy/Handedness2

    Enforce handedness correctness in rotations and orthogonal maps
    pleroy authored Dec 27, 2019
    Copy the full SHA
    1e78803 View commit details
30 changes: 22 additions & 8 deletions benchmarks/planetarium_plot_methods.cpp
Original file line number Diff line number Diff line change
@@ -19,9 +19,11 @@ using astronomy::operator""_TT;
using base::make_not_null_unique;
using base::not_null;
using geometry::Bivector;
using geometry::DeduceSignReversingOrientation;
using geometry::Perspective;
using geometry::RigidTransformation;
using geometry::RP2Lines;
using geometry::Signature;
using geometry::Vector;
using geometry::Velocity;
using integrators::SymmetricLinearMultistepIntegrator;
@@ -66,29 +68,41 @@ constexpr Length focal = 1 * Metre;

Perspective<Navigation, Camera> PolarPerspective(
Length const distance_from_earth) {
using LeftNavigation =
Frame<enum class LeftNavigationTag, NonInertial, Handedness::Left>;
return {
RigidTransformation<Navigation, Camera>(
Navigation::origin + Displacement<Navigation>(
{0 * Metre, 0 * Metre, distance_from_earth}),
Camera::origin,
Rotation<Navigation, Camera>(Vector<double, Navigation>({1, 0, 0}),
Vector<double, Navigation>({0, -1, 0}),
Bivector<double, Navigation>({0, 0, -1}))
.Forget()),
Rotation<LeftNavigation, Camera>(
Vector<double, LeftNavigation>({1, 0, 0}),
Vector<double, LeftNavigation>({0, -1, 0}),
Bivector<double, LeftNavigation>({0, 0, -1})).Forget() *
Signature<Navigation, LeftNavigation>(
Sign::Positive(),
Sign::Positive(),
DeduceSignReversingOrientation{}).Forget()),
focal};
}

Perspective<Navigation, Camera> EquatorialPerspective(
Length const distance_from_earth) {
using LeftNavigation =
Frame<enum class LeftNavigationTag, NonInertial, Handedness::Left>;
return {
RigidTransformation<Navigation, Camera>(
Navigation::origin + Displacement<Navigation>(
{0 * Metre, distance_from_earth, 0 * Metre}),
Camera::origin,
Rotation<Navigation, Camera>(Vector<double, Navigation>({1, 0, 0}),
Vector<double, Navigation>({0, 0, 1}),
Bivector<double, Navigation>({0, -1, 0}))
.Forget()),
Rotation<LeftNavigation, Camera>(
Vector<double, LeftNavigation>({1, 0, 0}),
Vector<double, LeftNavigation>({0, 0, 1}),
Bivector<double, LeftNavigation>({0, -1, 0})).Forget() *
Signature<Navigation, LeftNavigation>(
Sign::Positive(),
Sign::Positive(),
DeduceSignReversingOrientation{}).Forget()),
focal};
}

4 changes: 1 addition & 3 deletions geometry/identity_body.hpp
Original file line number Diff line number Diff line change
@@ -61,9 +61,7 @@ Identity<FromFrame, ToFrame>::operator()(T const& t) const {

template<typename FromFrame, typename ToFrame>
OrthogonalMap<FromFrame, ToFrame> Identity<FromFrame, ToFrame>::Forget() const {
return OrthogonalMap<FromFrame, ToFrame>(
Determinant(),
Rotation<FromFrame, ToFrame>::Identity());
return OrthogonalMap<FromFrame, ToFrame>::Identity();
}

template<typename FromFrame, typename ToFrame>
33 changes: 25 additions & 8 deletions geometry/orthogonal_map.hpp
Original file line number Diff line number Diff line change
@@ -2,11 +2,14 @@
#pragma once

#include "base/mappable.hpp"
#include "geometry/frame.hpp"
#include "geometry/grassmann.hpp"
#include "geometry/linear_map.hpp"
#include "geometry/quaternion.hpp"
#include "geometry/r3_element.hpp"
#include "geometry/rotation.hpp"
#include "geometry/sign.hpp"
#include "geometry/signature.hpp"
#include "serialization/geometry.pb.h"

namespace principia {
@@ -45,7 +48,10 @@ class OrthogonalMap : public LinearMap<FromFrame, ToFrame> {
public:
Sign Determinant() const override;

Rotation<FromFrame, ToFrame> const& rotation() const;
template<typename F = FromFrame,
typename T = ToFrame,
typename = std::enable_if_t<F::handedness == T::handedness>>
Rotation<FromFrame, ToFrame> AsRotation() const;

OrthogonalMap<ToFrame, FromFrame> Inverse() const;

@@ -89,11 +95,20 @@ class OrthogonalMap : public LinearMap<FromFrame, ToFrame> {
serialization::OrthogonalMap const& message);

private:
OrthogonalMap(Sign const& determinant,
Rotation<FromFrame, ToFrame> const& rotation);
explicit OrthogonalMap(Quaternion const& quaternion);

using IntermediateFrame = Frame<enum class IntermediateFrameTag,
ToFrame::motion,
ToFrame::handedness>;

static constexpr Signature<FromFrame, IntermediateFrame> MakeSignature();
Rotation<IntermediateFrame, ToFrame> MakeRotation() const;

Sign determinant_;
Rotation<FromFrame, ToFrame> rotation_;
Quaternion quaternion_;

static constexpr Sign determinant_ =
FromFrame::handedness == ToFrame::handedness ? Sign::Positive()
: Sign::Negative();

template<typename From, typename To>
friend class internal_identity::Identity;
@@ -111,10 +126,12 @@ class OrthogonalMap : public LinearMap<FromFrame, ToFrame> {
OrthogonalMap<Through, To> const& left,
OrthogonalMap<From, Through> const& right);

friend class OrthogonalMapTest;
template<typename From, typename To>
friend std::ostream& operator<<(
std::ostream& out,
OrthogonalMap<From, To> const& orthogonal_map);

// TODO(phl): This friendship could be avoided if we had symmetries.
friend class physics::RigidMotionTest;
friend class OrthogonalMapTest;
};

template<typename FromFrame, typename ThroughFrame, typename ToFrame>
67 changes: 43 additions & 24 deletions geometry/orthogonal_map_body.hpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@

#pragma once

#include "geometry/orthogonal_map.hpp"

#include "geometry/frame.hpp"
#include "geometry/grassmann.hpp"
#include "geometry/linear_map.hpp"
#include "geometry/orthogonal_map.hpp"
#include "geometry/r3_element.hpp"
#include "geometry/sign.hpp"

@@ -17,43 +19,45 @@ Sign OrthogonalMap<FromFrame, ToFrame>::Determinant() const {
}

template<typename FromFrame, typename ToFrame>
Rotation<FromFrame, ToFrame> const&
OrthogonalMap<FromFrame, ToFrame>::rotation() const {
return rotation_;
template<typename F, typename T, typename>
Rotation<FromFrame, ToFrame>
OrthogonalMap<FromFrame, ToFrame>::AsRotation() const {
return Rotation<FromFrame, ToFrame>(quaternion_);
}

template<typename FromFrame, typename ToFrame>
OrthogonalMap<ToFrame, FromFrame>
OrthogonalMap<FromFrame, ToFrame>::Inverse() const {
return OrthogonalMap<ToFrame, FromFrame>(determinant_, rotation_.Inverse());
// Because |quaternion_| has norm 1, its inverse is just its conjugate.
return OrthogonalMap<ToFrame, FromFrame>(quaternion_.Conjugate());
}

template<typename FromFrame, typename ToFrame>
template<typename Scalar>
Vector<Scalar, ToFrame> OrthogonalMap<FromFrame, ToFrame>::operator()(
Vector<Scalar, FromFrame> const& vector) const {
return Vector<Scalar, ToFrame>(determinant_ * rotation_(vector));
return MakeRotation()(MakeSignature()(vector));
}

template<typename FromFrame, typename ToFrame>
template<typename Scalar>
Bivector<Scalar, ToFrame> OrthogonalMap<FromFrame, ToFrame>::operator()(
Bivector<Scalar, FromFrame> const& bivector) const {
return Bivector<Scalar, ToFrame>(rotation_(bivector));
return MakeRotation()(MakeSignature()(bivector));
}

template<typename FromFrame, typename ToFrame>
template<typename Scalar>
Trivector<Scalar, ToFrame> OrthogonalMap<FromFrame, ToFrame>::operator()(
Trivector<Scalar, FromFrame> const& trivector) const {
return Trivector<Scalar, ToFrame>(determinant_ * trivector.coordinates());
return MakeRotation()(MakeSignature()(trivector));
}

template<typename FromFrame, typename ToFrame>
template<typename Scalar>
SymmetricBilinearForm<Scalar, ToFrame> OrthogonalMap<FromFrame, ToFrame>::
operator()(SymmetricBilinearForm<Scalar, FromFrame> const& form) const {
return rotation_(form);
return MakeRotation()(MakeSignature()(form));
}

template<typename FromFrame, typename ToFrame>
@@ -69,8 +73,7 @@ template<typename FromFrame, typename ToFrame>
template<typename F, typename T, typename>
OrthogonalMap<FromFrame, ToFrame>
OrthogonalMap<FromFrame, ToFrame>::Identity() {
return OrthogonalMap(Sign::Positive(),
Rotation<FromFrame, ToFrame>::Identity());
return OrthogonalMap(Quaternion(1));
}

template<typename FromFrame, typename ToFrame>
@@ -95,42 +98,58 @@ OrthogonalMap<FromFrame, ToFrame>::ReadFromMessage(
template<typename FromFrame, typename ToFrame>
void OrthogonalMap<FromFrame, ToFrame>::WriteToMessage(
not_null<serialization::OrthogonalMap*> const message) const {
determinant_.WriteToMessage(message->mutable_determinant());
rotation_.WriteToMessage(message->mutable_rotation());
quaternion_.WriteToMessage(message->mutable_quaternion());
}

template<typename FromFrame, typename ToFrame>
template<typename, typename, typename>
OrthogonalMap<FromFrame, ToFrame>
OrthogonalMap<FromFrame, ToFrame>::ReadFromMessage(
serialization::OrthogonalMap const& message) {
return OrthogonalMap(Sign::ReadFromMessage(message.determinant()),
Rotation<FromFrame, ToFrame>::ReadFromMessage(
message.rotation()));
bool const is_pre_frege = message.has_rotation();
return OrthogonalMap(
is_pre_frege
? Quaternion::ReadFromMessage(message.rotation().quaternion())
: Quaternion::ReadFromMessage(message.quaternion()));
}

template<typename FromFrame, typename ToFrame>
OrthogonalMap<FromFrame, ToFrame>::OrthogonalMap(Quaternion const& quaternion)
: quaternion_(quaternion) {}

template<typename FromFrame, typename ToFrame>
constexpr Signature<
FromFrame,
typename OrthogonalMap<FromFrame, ToFrame>::IntermediateFrame>
OrthogonalMap<FromFrame, ToFrame>::MakeSignature() {
if constexpr (FromFrame::handedness == ToFrame::handedness) {
return Signature<FromFrame, IntermediateFrame>::Identity();
} else {
return Signature<FromFrame, IntermediateFrame>::CentralInversion();
}
}

template<typename FromFrame, typename ToFrame>
OrthogonalMap<FromFrame, ToFrame>::OrthogonalMap(
Sign const& determinant,
Rotation<FromFrame, ToFrame> const& rotation)
: determinant_(determinant),
rotation_(rotation) {}
Rotation<typename OrthogonalMap<FromFrame, ToFrame>::IntermediateFrame,
ToFrame>
OrthogonalMap<FromFrame, ToFrame>::MakeRotation() const {
return Rotation<IntermediateFrame, ToFrame>(quaternion_);
}

template<typename FromFrame, typename ThroughFrame, typename ToFrame>
OrthogonalMap<FromFrame, ToFrame> operator*(
OrthogonalMap<ThroughFrame, ToFrame> const& left,
OrthogonalMap<FromFrame, ThroughFrame> const& right) {
return OrthogonalMap<FromFrame, ToFrame>(
left.determinant_ * right.determinant_,
left.rotation_ * right.rotation_);
left.quaternion_ * right.quaternion_);
}

template<typename FromFrame, typename ToFrame>
std::ostream& operator<<(
std::ostream& out,
OrthogonalMap<FromFrame, ToFrame> const& orthogonal_map) {
return out << "{determinant: " << orthogonal_map.Determinant()
<< ", rotation: " << orthogonal_map.rotation() << "}";
<< ", quaternion: " << orthogonal_map.quaternion_ << "}";
}

} // namespace internal_orthogonal_map
Loading