use rerun_0_28 as rerun;
use super::{Rotor, Vector};
use crate::specialized::visualization::AsPosition;
impl From<Vector<f32>> for rerun::Vec2D {
#[inline]
fn from(v: Vector<f32>) -> Self {
rerun::Vec2D::new(v.x(), v.y())
}
}
impl From<AsPosition<Vector<f32>>> for rerun::Position2D {
#[inline]
fn from(v: AsPosition<Vector<f32>>) -> Self {
rerun::Position2D::new(v.0.x(), v.0.y())
}
}
impl From<Rotor<f32>> for rerun::components::RotationAxisAngle {
#[inline]
fn from(rotor: Rotor<f32>) -> Self {
let r = rotor.normalize();
let angle = r.angle();
rerun::components::RotationAxisAngle::new(rerun::Vec3D::new(0.0, 0.0, 1.0), angle)
}
}
impl From<Rotor<f32>> for rerun::Transform3D {
#[inline]
fn from(rotor: Rotor<f32>) -> Self {
let rotation: rerun::components::RotationAxisAngle = rotor.into();
rerun::Transform3D::from_rotation(rotation)
}
}
#[cfg(test)]
mod tests {
use super::*;
use approx::abs_diff_eq;
use proptest::prelude::*;
use std::f32::consts::{FRAC_PI_2, PI};
const EPS: f32 = 1e-5;
proptest! {
#[test]
fn vector_to_vec2d_preserves_components(v in any::<Vector<f32>>()) {
let rerun_v: rerun::Vec2D = v.into();
prop_assert!(abs_diff_eq!(rerun_v.x(), v.x(), epsilon = EPS));
prop_assert!(abs_diff_eq!(rerun_v.y(), v.y(), epsilon = EPS));
}
#[test]
fn as_position_to_position2d_preserves_components(v in any::<Vector<f32>>()) {
let pos: rerun::Position2D = AsPosition(v).into();
prop_assert!(abs_diff_eq!(pos.x(), v.x(), epsilon = EPS));
prop_assert!(abs_diff_eq!(pos.y(), v.y(), epsilon = EPS));
}
#[test]
fn rotor_to_axis_angle_preserves_angle(r in any::<Rotor<f32>>()) {
let r = r.normalize();
let original_angle = r.angle();
let rot: rerun::components::RotationAxisAngle = r.into();
let rerun_angle = rot.angle.radians();
let diff = (original_angle - rerun_angle).abs();
let diff_mod = diff.min((diff - 2.0 * PI).abs());
prop_assert!(diff_mod < EPS, "Angle mismatch: {} vs {}", original_angle, rerun_angle);
}
#[test]
fn rotor_to_transform3d_does_not_panic(r in any::<Rotor<f32>>()) {
let r = r.normalize();
let _t: rerun::Transform3D = r.into();
}
}
#[test]
fn rotor_90_degrees() {
let rotor = Rotor::from_angle(FRAC_PI_2);
let rot: rerun::components::RotationAxisAngle = rotor.into();
assert!(abs_diff_eq!(rot.angle.radians(), FRAC_PI_2, epsilon = EPS));
assert!(abs_diff_eq!(rot.axis.x(), 0.0, epsilon = EPS));
assert!(abs_diff_eq!(rot.axis.y(), 0.0, epsilon = EPS));
assert!(abs_diff_eq!(rot.axis.z(), 1.0, epsilon = EPS));
}
}