Rotation<Frenet<ThisFrame>, ThisFrame> DynamicFrame<InertialFrame, ThisFrame>::FrenetFrame( Instant const& t, DegreesOfFreedom<ThisFrame> const& degrees_of_freedom) const { Velocity<ThisFrame> const& velocity = degrees_of_freedom.velocity(); Vector<Acceleration, ThisFrame> const acceleration = GeometricAcceleration(t, degrees_of_freedom); Vector<Acceleration, ThisFrame> normal_acceleration = acceleration; velocity.template Orthogonalize<Acceleration>(&normal_acceleration); Vector<double, ThisFrame> tangent = Normalize(velocity); Vector<double, ThisFrame> normal = Normalize(normal_acceleration); Bivector<double, ThisFrame> binormal = Wedge(tangent, normal); // Maps |tangent| to {1, 0, 0}, |normal| to {0, 1, 0}, and |binormal| to // {0, 0, 1}. return Rotation<Frenet<ThisFrame>, ThisFrame>( R3x3Matrix(tangent.coordinates(), normal.coordinates(), binormal.coordinates()).Transpose()); }
Bivector<Scalar, ToFrame> Identity<FromFrame, ToFrame>::operator()( Bivector<Scalar, FromFrame> const& bivector) const { return Bivector<Scalar, ToFrame>(bivector.coordinates()); }
Vector<quantities::Product<LScalar, RScalar>, Frame> operator*( Trivector<LScalar, Frame> const& left, Bivector<RScalar, Frame> const& right) { return Vector<quantities::Product<LScalar, RScalar>, Frame>( left.coordinates() * right.coordinates()); }
Bivector<quantities::Product<LScalar, RScalar>, Frame> Commutator( Bivector<LScalar, Frame> const& left, Bivector<RScalar, Frame> const& right) { return Bivector<quantities::Product<LScalar, RScalar>, Frame>( Cross(left.coordinates(), right.coordinates())); }
Trivector<quantities::Product<LScalar, RScalar>, Frame> Wedge( Vector<LScalar, Frame> const& left, Bivector<RScalar, Frame> const& right) { return Trivector<quantities::Product<LScalar, RScalar>, Frame>( Dot(left.coordinates(), right.coordinates())); }
quantities::Product<LScalar, RScalar> InnerProduct( Bivector<LScalar, Frame> const& left, Bivector<RScalar, Frame> const& right) { return Dot(left.coordinates(), right.coordinates()); }
inline Vector<quantities::Product<LScalar, RScalar>, Frame> operator*( Bivector<LScalar, Frame> const& left, Vector<RScalar, Frame> const& right) { return Vector<quantities::Product<LScalar, RScalar>, Frame>( Cross(left.coordinates(), right.coordinates())); }
Bivector<Scalar, ToFrame> Permutation<FromFrame, ToFrame>::operator()( Bivector<Scalar, FromFrame> const& bivector) const { return Bivector<Scalar, ToFrame>( Determinant() * (*this)(bivector.coordinates())); }