use pyo3::prelude::*;
use crate::vector3::Vector3;
#[pyclass(name = "Vector3")]
#[derive(Clone)]
pub struct PyVector3 {
inner: Vector3<f64>,
}
#[pymethods]
impl PyVector3 {
#[new]
pub fn new(x: f64, y: f64, z: f64) -> Self {
Self {
inner: Vector3::new(x, y, z),
}
}
#[getter]
pub fn x(&self) -> f64 {
self.inner.x
}
#[getter]
pub fn y(&self) -> f64 {
self.inner.y
}
#[getter]
pub fn z(&self) -> f64 {
self.inner.z
}
#[setter]
pub fn set_x(&mut self, value: f64) {
self.inner.x = value;
}
#[setter]
pub fn set_y(&mut self, value: f64) {
self.inner.y = value;
}
#[setter]
pub fn set_z(&mut self, value: f64) {
self.inner.z = value;
}
pub fn dot(&self, other: &PyVector3) -> f64 {
self.inner.dot(&other.inner)
}
pub fn cross(&self, other: &PyVector3) -> PyVector3 {
PyVector3 {
inner: self.inner.cross(&other.inner),
}
}
pub fn magnitude(&self) -> f64 {
self.inner.magnitude()
}
pub fn normalize(&self) -> PyVector3 {
PyVector3 {
inner: self.inner.normalize(),
}
}
pub fn __add__(&self, other: &PyVector3) -> PyVector3 {
PyVector3 {
inner: self.inner + other.inner,
}
}
pub fn __sub__(&self, other: &PyVector3) -> PyVector3 {
PyVector3 {
inner: self.inner - other.inner,
}
}
pub fn __mul__(&self, scalar: f64) -> PyVector3 {
PyVector3 {
inner: self.inner * scalar,
}
}
pub fn __rmul__(&self, scalar: f64) -> PyVector3 {
PyVector3 {
inner: self.inner * scalar,
}
}
pub fn __repr__(&self) -> String {
format!(
"Vector3({:.6}, {:.6}, {:.6})",
self.inner.x, self.inner.y, self.inner.z
)
}
pub fn to_tuple(&self) -> (f64, f64, f64) {
(self.inner.x, self.inner.y, self.inner.z)
}
pub fn to_list(&self) -> Vec<f64> {
vec![self.inner.x, self.inner.y, self.inner.z]
}
#[staticmethod]
pub fn unit_x() -> PyVector3 {
PyVector3 {
inner: Vector3::new(1.0, 0.0, 0.0),
}
}
#[staticmethod]
pub fn unit_y() -> PyVector3 {
PyVector3 {
inner: Vector3::new(0.0, 1.0, 0.0),
}
}
#[staticmethod]
pub fn unit_z() -> PyVector3 {
PyVector3 {
inner: Vector3::new(0.0, 0.0, 1.0),
}
}
#[staticmethod]
pub fn zero() -> PyVector3 {
PyVector3 {
inner: Vector3::new(0.0, 0.0, 0.0),
}
}
}
impl PyVector3 {
pub fn inner(&self) -> Vector3<f64> {
self.inner
}
pub fn from_inner(inner: Vector3<f64>) -> Self {
Self { inner }
}
}