1use crate::scalar::*;
53use num_traits::{Zero, One};
54use core::ops::{Add, Div, Mul, Neg, Rem, Sub};
55
56pub trait Vector<T: Scalar, Rhs = Self, Output = Self>:
69 Add<Rhs, Output = Output>
70 + Sub<Rhs, Output = Output>
71 + Mul<Rhs, Output = Output>
72 + Mul<T, Output = Output>
73 + Div<Rhs, Output = Output>
74 + Div<T, Output = Output>
75 + Neg<Output = Output>
76 + Clone
77 + Copy
78{
79 fn zero() -> Self;
81
82 fn add_vv(l: &Self, r: &Self) -> Self;
84
85 fn sub_vv(l: &Self, r: &Self) -> Self;
87
88 fn mul_vv(l: &Self, r: &Self) -> Self;
90
91 fn div_vv(l: &Self, r: &Self) -> Self;
93
94 fn mul_vs(l: &Self, r: T) -> Self;
96
97 fn div_vs(l: &Self, r: T) -> Self;
99
100 fn rem_vv(l: &Self, r: &Self) -> Self;
102
103 fn dot(l: &Self, r: &Self) -> T;
110
111 fn min(l: &Self, r: &Self) -> Self;
113
114 fn max(l: &Self, r: &Self) -> Self;
116}
117
118pub trait FloatVector<T: FloatScalar>: Vector<T> {
123 fn length(&self) -> T;
130
131 fn normalize(&self) -> Self;
141
142 fn distance(l: &Self, r: &Self) -> T;
149}
150
151macro_rules! implVecScalar {
152 ($vecName:ident, $scalar:ident) => {
153 impl Mul<$vecName<$scalar>> for $scalar {
154 type Output = $vecName<$scalar>;
155
156 fn mul(self, rhs: $vecName<$scalar>) -> Self::Output {
157 $vecName::mul_vs(&rhs, self)
158 }
159 }
160 };
161}
162
163macro_rules! implVector {
164 ($vecName:ident, $($field:ident)*) => {
165 #[repr(C)]
166 #[derive(Copy, Clone, Debug, Default)]
167 pub struct $vecName<T> { $(pub $field: T),* }
168
169 impl<T: Scalar> $vecName<T> {
170 pub fn new($($field:T),*) -> Self { Self { $($field: $field),* } }
171 }
172
173 impl<T: Scalar> Vector<T> for $vecName<T> {
174 fn zero() -> Self { Self { $($field: <T as Zero>::zero()),* } }
175 fn dot (l: &Self, r: &Self) -> T { $(l.$field * r.$field +)* <T as Zero>::zero() }
176 fn add_vv(l: &Self, r: &Self) -> Self { Self::new($(l.$field + r.$field),*) }
177 fn sub_vv(l: &Self, r: &Self) -> Self { Self::new($(l.$field - r.$field),*) }
178 fn mul_vv(l: &Self, r: &Self) -> Self { Self::new($(l.$field * r.$field),*) }
179 fn div_vv(l: &Self, r: &Self) -> Self { Self::new($(l.$field / r.$field),*) }
180 fn mul_vs(l: &Self, r: T) -> Self { Self::new($(l.$field * r),*) }
181 fn div_vs(l: &Self, r: T) -> Self { Self::new($(l.$field / r),*) }
182 fn rem_vv(l: &Self, r: &Self) -> Self { Self::new($(l.$field % r.$field),*) }
183 fn min(l: &Self, r: &Self) -> Self { Self::new($(T::min(l.$field, r.$field)),*) }
184 fn max(l: &Self, r: &Self) -> Self { Self::new($(T::max(l.$field, r.$field)),*) }
185 }
186
187 impl<T> Add for $vecName<T> where T: Scalar {
188 type Output = $vecName<T>;
189
190 fn add(self, rhs: Self) -> Self::Output {
191 Self { $($field: self.$field + rhs.$field),* }
192 }
193 }
194
195 impl<T> Sub for $vecName<T> where T: Scalar {
196 type Output = $vecName<T>;
197
198 fn sub(self, rhs: Self) -> Self::Output {
199 Self { $($field: self.$field - rhs.$field),* }
200 }
201 }
202
203 impl<T> Mul for $vecName<T> where T: Scalar {
204 type Output = $vecName<T>;
205
206 fn mul(self, rhs: Self) -> Self::Output {
207 Self { $($field: self.$field * rhs.$field),* }
208 }
209 }
210
211 impl<T> Mul<T> for $vecName<T> where T:Scalar {
212 type Output = $vecName<T>;
213
214 fn mul(self, rhs: T) -> Self::Output {
215 Self { $($field: self.$field * rhs),* }
216 }
217 }
218
219 implVecScalar!($vecName, f32);
220 implVecScalar!($vecName, f64);
221 implVecScalar!($vecName, i32);
222 implVecScalar!($vecName, i64);
223
224 impl<T> Div for $vecName<T> where T:Scalar {
225 type Output = $vecName<T>;
226
227 fn div(self, rhs: Self) -> Self::Output {
228 Self { $($field: self.$field / rhs.$field),* }
229 }
230 }
231
232 impl<T> Div<T> for $vecName<T> where T:Scalar {
233 type Output = $vecName<T>;
234
235 fn div(self, rhs: T) -> Self::Output {
236 Self { $($field: self.$field / rhs),* }
237 }
238 }
239
240 impl<T> Rem for $vecName<T> where T: Scalar {
241 type Output = $vecName<T>;
242
243 fn rem(self, rhs: $vecName<T>) -> Self::Output {
244 Self { $($field: self.$field % rhs.$field),* }
245 }
246 }
247
248 impl<T> Rem<T> for $vecName<T> where T:Scalar {
249 type Output = $vecName<T>;
250
251 fn rem(self, rhs: T) -> Self::Output {
252 Self { $($field: self.$field % rhs),* }
253 }
254 }
255
256 impl<T: Scalar> Neg for $vecName<T> {
257 type Output = $vecName<T>;
258 fn neg(self) -> Self::Output {
259 Self { $($field: -self.$field),* }
260 }
261 }
262 };
263}
264
265macro_rules! implFloatVector {
266 ($vecName:ident) => {
267 impl<T: FloatScalar> FloatVector<T> for $vecName<T> {
268 fn length(&self) -> T {
269 Self::dot(self, self).tsqrt()
270 }
271 fn normalize(&self) -> Self {
272 let len = Self::length(self);
273 *self / len
274 }
275 fn distance(l: &Self, r: &Self) -> T {
276 Self::length(&(*r - *l))
277 }
278 }
279 };
280}
281
282pub trait CrossProduct {
287 fn cross(l: &Self, r: &Self) -> Self;
297}
298
299implVector!(Vector2, x y);
310
311implVector!(Vector3, x y z);
323
324implVector!(Vector4, x y z w);
336
337implFloatVector!(Vector2);
338implFloatVector!(Vector3);
339implFloatVector!(Vector4);
340
341impl<T> CrossProduct for Vector3<T>
342where
343 T: Scalar,
344{
345 fn cross(l: &Vector3<T>, r: &Vector3<T>) -> Vector3<T> {
355 Vector3::new(
356 l.y * r.z - l.z * r.y,
357 l.z * r.x - l.x * r.z,
358 l.x * r.y - l.y * r.x,
359 )
360 }
361}
362
363pub trait Swizzle2<T: Scalar> {
368 fn xx(&self) -> Vector2<T>;
369 fn xy(&self) -> Vector2<T>;
370 fn xz(&self) -> Vector2<T>;
371 fn yx(&self) -> Vector2<T>;
372 fn yy(&self) -> Vector2<T>;
373 fn yz(&self) -> Vector2<T>;
374 fn zx(&self) -> Vector2<T>;
375 fn zy(&self) -> Vector2<T>;
376 fn zz(&self) -> Vector2<T>;
377}
378
379impl<T: Scalar> Swizzle2<T> for Vector2<T> {
380 fn xx(&self) -> Vector2<T> {
381 Vector2::new(self.x, self.x)
382 }
383 fn xy(&self) -> Vector2<T> {
384 Vector2::new(self.x, self.y)
385 }
386 fn xz(&self) -> Vector2<T> {
387 Vector2::new(self.x, <T as Zero>::zero())
388 }
389 fn yx(&self) -> Vector2<T> {
390 Vector2::new(self.y, self.x)
391 }
392 fn yy(&self) -> Vector2<T> {
393 Vector2::new(self.y, self.y)
394 }
395 fn yz(&self) -> Vector2<T> {
396 Vector2::new(self.y, <T as Zero>::zero())
397 }
398 fn zx(&self) -> Vector2<T> {
399 Vector2::new(<T as Zero>::zero(), self.x)
400 }
401 fn zy(&self) -> Vector2<T> {
402 Vector2::new(<T as Zero>::zero(), self.y)
403 }
404 fn zz(&self) -> Vector2<T> {
405 Vector2::new(<T as Zero>::zero(), <T as Zero>::zero())
406 }
407}
408
409impl<T: Scalar> Swizzle2<T> for Vector3<T> {
410 fn xx(&self) -> Vector2<T> {
411 Vector2::new(self.x, self.x)
412 }
413 fn xy(&self) -> Vector2<T> {
414 Vector2::new(self.x, self.y)
415 }
416 fn xz(&self) -> Vector2<T> {
417 Vector2::new(self.x, self.z)
418 }
419 fn yx(&self) -> Vector2<T> {
420 Vector2::new(self.y, self.x)
421 }
422 fn yy(&self) -> Vector2<T> {
423 Vector2::new(self.y, self.y)
424 }
425 fn yz(&self) -> Vector2<T> {
426 Vector2::new(self.y, self.z)
427 }
428 fn zx(&self) -> Vector2<T> {
429 Vector2::new(self.z, self.x)
430 }
431 fn zy(&self) -> Vector2<T> {
432 Vector2::new(self.z, self.y)
433 }
434 fn zz(&self) -> Vector2<T> {
435 Vector2::new(self.z, self.z)
436 }
437}
438
439impl<T: Scalar> Swizzle2<T> for Vector4<T> {
440 fn xx(&self) -> Vector2<T> {
441 Vector2::new(self.x, self.x)
442 }
443 fn xy(&self) -> Vector2<T> {
444 Vector2::new(self.x, self.y)
445 }
446 fn xz(&self) -> Vector2<T> {
447 Vector2::new(self.x, self.z)
448 }
449 fn yx(&self) -> Vector2<T> {
450 Vector2::new(self.y, self.x)
451 }
452 fn yy(&self) -> Vector2<T> {
453 Vector2::new(self.y, self.y)
454 }
455 fn yz(&self) -> Vector2<T> {
456 Vector2::new(self.y, self.z)
457 }
458 fn zx(&self) -> Vector2<T> {
459 Vector2::new(self.z, self.x)
460 }
461 fn zy(&self) -> Vector2<T> {
462 Vector2::new(self.z, self.y)
463 }
464 fn zz(&self) -> Vector2<T> {
465 Vector2::new(self.z, self.z)
466 }
467}
468
469pub trait Swizzle3<T: Scalar> {
474 fn xxx(&self) -> Vector3<T>;
475 fn xxy(&self) -> Vector3<T>;
476 fn xxz(&self) -> Vector3<T>;
477 fn xyx(&self) -> Vector3<T>;
478 fn xyy(&self) -> Vector3<T>;
479 fn xyz(&self) -> Vector3<T>;
480 fn xzx(&self) -> Vector3<T>;
481 fn xzy(&self) -> Vector3<T>;
482 fn xzz(&self) -> Vector3<T>;
483
484 fn yxx(&self) -> Vector3<T>;
485 fn yxy(&self) -> Vector3<T>;
486 fn yxz(&self) -> Vector3<T>;
487 fn yyx(&self) -> Vector3<T>;
488 fn yyy(&self) -> Vector3<T>;
489 fn yyz(&self) -> Vector3<T>;
490 fn yzx(&self) -> Vector3<T>;
491 fn yzy(&self) -> Vector3<T>;
492 fn yzz(&self) -> Vector3<T>;
493
494 fn zxx(&self) -> Vector3<T>;
495 fn zxy(&self) -> Vector3<T>;
496 fn zxz(&self) -> Vector3<T>;
497 fn zyx(&self) -> Vector3<T>;
498 fn zyy(&self) -> Vector3<T>;
499 fn zyz(&self) -> Vector3<T>;
500 fn zzx(&self) -> Vector3<T>;
501 fn zzy(&self) -> Vector3<T>;
502 fn zzz(&self) -> Vector3<T>;
503}
504
505impl<T: Scalar> Swizzle3<T> for Vector3<T> {
506 fn xxx(&self) -> Vector3<T> {
507 Vector3::new(self.x, self.x, self.x)
508 }
509 fn xxy(&self) -> Vector3<T> {
510 Vector3::new(self.x, self.x, self.y)
511 }
512 fn xxz(&self) -> Vector3<T> {
513 Vector3::new(self.x, self.x, self.z)
514 }
515 fn xyx(&self) -> Vector3<T> {
516 Vector3::new(self.x, self.y, self.x)
517 }
518 fn xyy(&self) -> Vector3<T> {
519 Vector3::new(self.x, self.y, self.y)
520 }
521 fn xyz(&self) -> Vector3<T> {
522 Vector3::new(self.x, self.y, self.z)
523 }
524 fn xzx(&self) -> Vector3<T> {
525 Vector3::new(self.x, self.z, self.x)
526 }
527 fn xzy(&self) -> Vector3<T> {
528 Vector3::new(self.x, self.z, self.y)
529 }
530 fn xzz(&self) -> Vector3<T> {
531 Vector3::new(self.x, self.z, self.z)
532 }
533
534 fn yxx(&self) -> Vector3<T> {
535 Vector3::new(self.y, self.x, self.x)
536 }
537 fn yxy(&self) -> Vector3<T> {
538 Vector3::new(self.y, self.x, self.y)
539 }
540 fn yxz(&self) -> Vector3<T> {
541 Vector3::new(self.y, self.x, self.z)
542 }
543 fn yyx(&self) -> Vector3<T> {
544 Vector3::new(self.y, self.y, self.x)
545 }
546 fn yyy(&self) -> Vector3<T> {
547 Vector3::new(self.y, self.y, self.y)
548 }
549 fn yyz(&self) -> Vector3<T> {
550 Vector3::new(self.y, self.y, self.z)
551 }
552 fn yzx(&self) -> Vector3<T> {
553 Vector3::new(self.y, self.z, self.x)
554 }
555 fn yzy(&self) -> Vector3<T> {
556 Vector3::new(self.y, self.z, self.y)
557 }
558 fn yzz(&self) -> Vector3<T> {
559 Vector3::new(self.y, self.z, self.z)
560 }
561
562 fn zxx(&self) -> Vector3<T> {
563 Vector3::new(self.z, self.x, self.x)
564 }
565 fn zxy(&self) -> Vector3<T> {
566 Vector3::new(self.z, self.x, self.y)
567 }
568 fn zxz(&self) -> Vector3<T> {
569 Vector3::new(self.z, self.x, self.z)
570 }
571 fn zyx(&self) -> Vector3<T> {
572 Vector3::new(self.z, self.y, self.x)
573 }
574 fn zyy(&self) -> Vector3<T> {
575 Vector3::new(self.z, self.y, self.y)
576 }
577 fn zyz(&self) -> Vector3<T> {
578 Vector3::new(self.z, self.y, self.z)
579 }
580 fn zzx(&self) -> Vector3<T> {
581 Vector3::new(self.z, self.z, self.x)
582 }
583 fn zzy(&self) -> Vector3<T> {
584 Vector3::new(self.z, self.z, self.y)
585 }
586 fn zzz(&self) -> Vector3<T> {
587 Vector3::new(self.z, self.z, self.z)
588 }
589}
590
591impl<T: Scalar> Swizzle3<T> for Vector4<T> {
592 fn xxx(&self) -> Vector3<T> {
593 Vector3::new(self.x, self.x, self.x)
594 }
595 fn xxy(&self) -> Vector3<T> {
596 Vector3::new(self.x, self.x, self.y)
597 }
598 fn xxz(&self) -> Vector3<T> {
599 Vector3::new(self.x, self.x, self.z)
600 }
601 fn xyx(&self) -> Vector3<T> {
602 Vector3::new(self.x, self.y, self.x)
603 }
604 fn xyy(&self) -> Vector3<T> {
605 Vector3::new(self.x, self.y, self.y)
606 }
607 fn xyz(&self) -> Vector3<T> {
608 Vector3::new(self.x, self.y, self.z)
609 }
610 fn xzx(&self) -> Vector3<T> {
611 Vector3::new(self.x, self.z, self.x)
612 }
613 fn xzy(&self) -> Vector3<T> {
614 Vector3::new(self.x, self.z, self.y)
615 }
616 fn xzz(&self) -> Vector3<T> {
617 Vector3::new(self.x, self.z, self.z)
618 }
619
620 fn yxx(&self) -> Vector3<T> {
621 Vector3::new(self.y, self.x, self.x)
622 }
623 fn yxy(&self) -> Vector3<T> {
624 Vector3::new(self.y, self.x, self.y)
625 }
626 fn yxz(&self) -> Vector3<T> {
627 Vector3::new(self.y, self.x, self.z)
628 }
629 fn yyx(&self) -> Vector3<T> {
630 Vector3::new(self.y, self.y, self.x)
631 }
632 fn yyy(&self) -> Vector3<T> {
633 Vector3::new(self.y, self.y, self.y)
634 }
635 fn yyz(&self) -> Vector3<T> {
636 Vector3::new(self.y, self.y, self.z)
637 }
638 fn yzx(&self) -> Vector3<T> {
639 Vector3::new(self.y, self.z, self.x)
640 }
641 fn yzy(&self) -> Vector3<T> {
642 Vector3::new(self.y, self.z, self.y)
643 }
644 fn yzz(&self) -> Vector3<T> {
645 Vector3::new(self.y, self.z, self.z)
646 }
647
648 fn zxx(&self) -> Vector3<T> {
649 Vector3::new(self.z, self.x, self.x)
650 }
651 fn zxy(&self) -> Vector3<T> {
652 Vector3::new(self.z, self.x, self.y)
653 }
654 fn zxz(&self) -> Vector3<T> {
655 Vector3::new(self.z, self.x, self.z)
656 }
657 fn zyx(&self) -> Vector3<T> {
658 Vector3::new(self.z, self.y, self.x)
659 }
660 fn zyy(&self) -> Vector3<T> {
661 Vector3::new(self.z, self.y, self.y)
662 }
663 fn zyz(&self) -> Vector3<T> {
664 Vector3::new(self.z, self.y, self.z)
665 }
666 fn zzx(&self) -> Vector3<T> {
667 Vector3::new(self.z, self.z, self.x)
668 }
669 fn zzy(&self) -> Vector3<T> {
670 Vector3::new(self.z, self.z, self.y)
671 }
672 fn zzz(&self) -> Vector3<T> {
673 Vector3::new(self.z, self.z, self.z)
674 }
675}
676
677pub fn length<T: FloatScalar, V: Vector<T>>(v: &V) -> T {
684 V::dot(v, v).tsqrt()
685}
686
687pub fn dot<T: Scalar, V: Vector<T>>(l: &V, r: &V) -> T {
694 V::dot(l, r)
695}
696
697pub fn normalize<T: FloatScalar, V: FloatVector<T>>(v: &V) -> V {
707 let len = v.length();
708 *v / len
709}
710
711pub fn distance<T: FloatScalar, V: FloatVector<T>>(l: &V, r: &V) -> T {
718 (*r - *l).length()
719}
720
721pub fn min<T: Scalar, V: Vector<T>>(l: &V, r: &V) -> V {
728 V::min(l, r)
729}
730
731pub fn max<T: Scalar, V: Vector<T>>(l: &V, r: &V) -> V {
738 V::max(l, r)
739}
740
741#[cfg(test)]
742mod tests {
743 use super::*;
744 use crate::scalar::FloatScalar;
745
746 #[test]
747 pub fn test() {
748 let f1 = Vector2 { x: 1.0, y: 2.0 };
749 let f2 = Vector2 { x: 3.0, y: 4.0 };
750 let out = f1 + f2;
751 assert_eq!(out.x, 4.0);
752 assert_eq!(out.y, 6.0);
753
754 let f22: Vector2<f32> = 2.0 * f2;
755 let f23: Vector2<f32> = f2 * 2.0;
756
757 assert_eq!(f22.x, 6.0);
758 assert_eq!(f22.y, 8.0);
759 assert_eq!(f23.x, f22.x);
760 assert_eq!(f23.y, f22.y);
761 }
762
763 #[test]
764 fn test_vector_normalization() {
765 let v = Vector3::<f32>::new(3.0, 4.0, 0.0);
767 let nv = v.normalize();
768 let len = nv.length();
769 assert!((len - 1.0).abs() < f32::epsilon());
770
771 let v_zero = Vector3::<f32>::new(0.0, 0.0, 0.0);
773 let nv_zero = v_zero.normalize();
774 assert!(nv_zero.x.is_infinite() || nv_zero.x.is_nan());
777
778 let v_unit = Vector3::<f32>::new(1.0, 0.0, 0.0);
780 let nv_unit = v_unit.normalize();
781 assert!((nv_unit.x - 1.0).abs() < f32::epsilon());
782 assert!((nv_unit.y).abs() < f32::epsilon());
783 assert!((nv_unit.z).abs() < f32::epsilon());
784 }
785
786 #[test]
787 fn test_vector_length() {
788 let v2 = Vector2::<f32>::new(3.0, 4.0);
789 assert!((v2.length() - 5.0).abs() < f32::epsilon());
790
791 let v3 = Vector3::<f32>::new(2.0, 3.0, 6.0);
792 assert!((v3.length() - 7.0).abs() < f32::epsilon());
793
794 let v4 = Vector4::<f32>::new(1.0, 2.0, 2.0, 0.0);
795 assert!((v4.length() - 3.0).abs() < f32::epsilon());
796
797 let v_zero = Vector3::<f32>::zero();
799 assert_eq!(v_zero.length(), 0.0);
800 }
801
802 #[test]
803 fn test_vector_dot_product() {
804 let v1 = Vector3::<f32>::new(1.0, 2.0, 3.0);
805 let v2 = Vector3::<f32>::new(4.0, 5.0, 6.0);
806 let dot = Vector3::dot(&v1, &v2);
807 assert_eq!(dot, 32.0); let v_ortho1 = Vector3::<f32>::new(1.0, 0.0, 0.0);
811 let v_ortho2 = Vector3::<f32>::new(0.0, 1.0, 0.0);
812 assert_eq!(Vector3::dot(&v_ortho1, &v_ortho2), 0.0);
813
814 let self_dot = Vector3::dot(&v1, &v1);
816 let len_squared = v1.length() * v1.length();
817 assert!((self_dot - len_squared).abs() < 0.0001);
818 }
819
820 #[test]
821 fn test_vector_cross_product() {
822 let x = Vector3::<f32>::new(1.0, 0.0, 0.0);
824 let y = Vector3::<f32>::new(0.0, 1.0, 0.0);
825 let z = Vector3::<f32>::new(0.0, 0.0, 1.0);
826
827 let x_cross_y = Vector3::cross(&x, &y);
828 assert!((x_cross_y.x - z.x).abs() < f32::epsilon());
829 assert!((x_cross_y.y - z.y).abs() < f32::epsilon());
830 assert!((x_cross_y.z - z.z).abs() < f32::epsilon());
831
832 let y_cross_z = Vector3::cross(&y, &z);
833 assert!((y_cross_z.x - x.x).abs() < f32::epsilon());
834 assert!((y_cross_z.y - x.y).abs() < f32::epsilon());
835 assert!((y_cross_z.z - x.z).abs() < f32::epsilon());
836
837 let z_cross_x = Vector3::cross(&z, &x);
838 assert!((z_cross_x.x - y.x).abs() < f32::epsilon());
839 assert!((z_cross_x.y - y.y).abs() < f32::epsilon());
840 assert!((z_cross_x.z - y.z).abs() < f32::epsilon());
841
842 let a = Vector3::<f32>::new(1.0, 2.0, 3.0);
844 let b = Vector3::<f32>::new(4.0, 5.0, 6.0);
845 let a_cross_b = Vector3::cross(&a, &b);
846 let b_cross_a = Vector3::cross(&b, &a);
847 assert!((a_cross_b.x + b_cross_a.x).abs() < f32::epsilon());
848 assert!((a_cross_b.y + b_cross_a.y).abs() < f32::epsilon());
849 assert!((a_cross_b.z + b_cross_a.z).abs() < f32::epsilon());
850
851 let self_cross = Vector3::cross(&a, &a);
853 assert!(self_cross.x.abs() < f32::epsilon());
854 assert!(self_cross.y.abs() < f32::epsilon());
855 assert!(self_cross.z.abs() < f32::epsilon());
856 }
857
858 #[test]
859 fn test_vector_distance() {
860 let v1 = Vector3::<f32>::new(1.0, 2.0, 3.0);
861 let v2 = Vector3::<f32>::new(4.0, 6.0, 3.0);
862 let dist = Vector3::distance(&v1, &v2);
863 assert!((dist - 5.0).abs() < f32::epsilon()); let self_dist = Vector3::distance(&v1, &v1);
867 assert!(self_dist.abs() < f32::epsilon());
868 }
869
870 #[test]
871 fn test_vector_min_max() {
872 let v1 = Vector3::<f32>::new(1.0, 5.0, 3.0);
873 let v2 = Vector3::<f32>::new(4.0, 2.0, 6.0);
874
875 let v_min = Vector3::min(&v1, &v2);
876 assert_eq!(v_min.x, 1.0);
877 assert_eq!(v_min.y, 2.0);
878 assert_eq!(v_min.z, 3.0);
879
880 let v_max = Vector3::max(&v1, &v2);
881 assert_eq!(v_max.x, 4.0);
882 assert_eq!(v_max.y, 5.0);
883 assert_eq!(v_max.z, 6.0);
884 }
885
886 #[test]
887 fn test_vector_arithmetic() {
888 let v1 = Vector3::<f32>::new(1.0, 2.0, 3.0);
889 let v2 = Vector3::<f32>::new(4.0, 5.0, 6.0);
890
891 let sum = v1 + v2;
893 assert_eq!(sum.x, 5.0);
894 assert_eq!(sum.y, 7.0);
895 assert_eq!(sum.z, 9.0);
896
897 let diff = v2 - v1;
899 assert_eq!(diff.x, 3.0);
900 assert_eq!(diff.y, 3.0);
901 assert_eq!(diff.z, 3.0);
902
903 let prod = v1 * v2;
905 assert_eq!(prod.x, 4.0);
906 assert_eq!(prod.y, 10.0);
907 assert_eq!(prod.z, 18.0);
908
909 let div = v2 / v1;
911 assert_eq!(div.x, 4.0);
912 assert_eq!(div.y, 2.5);
913 assert_eq!(div.z, 2.0);
914
915 let scaled = v1 * 2.0;
917 assert_eq!(scaled.x, 2.0);
918 assert_eq!(scaled.y, 4.0);
919 assert_eq!(scaled.z, 6.0);
920
921 let divided = v2 / 2.0;
923 assert_eq!(divided.x, 2.0);
924 assert_eq!(divided.y, 2.5);
925 assert_eq!(divided.z, 3.0);
926
927 let neg = -v1;
929 assert_eq!(neg.x, -1.0);
930 assert_eq!(neg.y, -2.0);
931 assert_eq!(neg.z, -3.0);
932 }
933
934 #[test]
935 fn test_swizzle_operations() {
936 let v2 = Vector2::<f32>::new(1.0, 2.0);
937
938 assert_eq!(v2.xx().x, 1.0);
939 assert_eq!(v2.xx().y, 1.0);
940
941 assert_eq!(v2.xy().x, 1.0);
942 assert_eq!(v2.xy().y, 2.0);
943
944 assert_eq!(v2.yx().x, 2.0);
945 assert_eq!(v2.yx().y, 1.0);
946
947 assert_eq!(v2.yy().x, 2.0);
948 assert_eq!(v2.yy().y, 2.0);
949
950 let v3 = Vector3::<f32>::new(1.0, 2.0, 3.0);
951
952 assert_eq!(v3.xz().x, 1.0);
953 assert_eq!(v3.xz().y, 3.0);
954
955 assert_eq!(v3.zy().x, 3.0);
956 assert_eq!(v3.zy().y, 2.0);
957
958 let v3_swizzle = v3.zyx();
959 assert_eq!(v3_swizzle.x, 3.0);
960 assert_eq!(v3_swizzle.y, 2.0);
961 assert_eq!(v3_swizzle.z, 1.0);
962 }
963
964 #[test]
965 fn test_vector_rem_operation() {
966 let v1 = Vector3::<i32>::new(10, 15, 20);
967 let v2 = Vector3::<i32>::new(3, 4, 6);
968
969 let rem = v1 % v2;
970 assert_eq!(rem.x, 1); assert_eq!(rem.y, 3); assert_eq!(rem.z, 2); let v3 = Vector3::<i32>::new(10, 15, 20);
975 let rem_scalar = v3 % 7;
976 assert_eq!(rem_scalar.x, 3); assert_eq!(rem_scalar.y, 1); assert_eq!(rem_scalar.z, 6); }
980}