Source code for symplyphysics.laws.kinematics.vector.displacement_is_angular_displacement_cross_radius

"""
Linear displacement is angular displacement cross radius
=================================================

Assuming a body rotating around a fixed axis, the vector of its linear displacement can be expressed
as the cross product of the pseudovector of angular displacement and the radius vector of rotation.

**Conditions:**

#. The axis is fixed.
#. Angular displacement pseudovector and radius vector must be orthogonal to one another.

**Links:**

#. `Physics LibreTexts, formula 11.1.4 <https://phys.libretexts.org/Bookshelves/University_Physics/Book%3A_Introductory_Physics_-_Building_Models_to_Describe_Our_World_(Martin_Neary_Rinaldo_and_Woodman)/11%3A_Rotational_dynamics/11.01%3A_Rotational_kinematic_vectors>`__.
"""

from pytest import approx
from symplyphysics import (
    Quantity,
    dot_vectors,
    units,
    angle_type,
    validate_input,
    validate_output,
    Vector,
    QuantityVector,
    cross_cartesian_vectors,
)


[docs] def displacement_law(angular_displacement_: Vector, rotation_radius_: Vector) -> Vector: r""" Displacement vector. Law: :code:`s = cross(theta, r)` Latex: .. math:: \vec s = \vec \theta \times \vec r :param angular_displacement\_: pseudovector of angular displacement parallel to axis of rotation Symbol: :code:`theta` Latex: :math:`\vec \theta` Dimension: *angle* :param rotation_radius\_: radius vector pointing away from the rotational axis and perpendicular to it Symbol: :code:`r` Latex: :math:`\vec r` Dimension: *length* :return: vector of linear displacement Symbol: :code:`s` Latex: :math:`\vec s` Dimension: *length* """ return cross_cartesian_vectors(angular_displacement_, rotation_radius_)
@validate_input(angular_displacement_=angle_type, rotation_radius_=units.length) @validate_output(units.length) def calculate_linear_displacement(angular_displacement_: QuantityVector, rotation_radius_: QuantityVector) -> QuantityVector: angular_displacement_vector = angular_displacement_.to_base_vector() rotation_radius_vector = rotation_radius_.to_base_vector() dot_vectors_result = Quantity(dot_vectors(angular_displacement_vector, rotation_radius_vector)) if dot_vectors_result.scale_factor != approx(0.0, rel=1e-3): raise ValueError( "Angular displacement pseudovector and rotation radius vector should be perpendicular to each other" ) result_vector = displacement_law(angular_displacement_vector, rotation_radius_vector) return QuantityVector.from_base_vector(result_vector)