8585 /// The returned vector is in space `Map::Source`.
8686 ///
8787 /// # Panics
88- /// If `i >= N `.
88+ /// If `i >= M `.
8989 #[ inline]
9090 pub fn row_vec ( & self , i : usize ) -> Vector < [ Sc ; N ] , Map :: Source > {
9191 Vector :: new ( self . 0 [ i] )
@@ -650,46 +650,167 @@ mod tests {
650650 type Map < const N : usize = 3 > = RealToReal < N , Basis1 , Basis2 > ;
651651 type InvMap < const N : usize = 3 > = RealToReal < N , Basis2 , Basis1 > ;
652652
653- #[ test]
654- fn matrix_debug ( ) {
655- let actual: Mat4x4 < Map > = [
653+ mod mat3x3 {
654+ use super :: * ;
655+
656+ const MAT : Mat3x3 < Map > = Matrix :: new ( [
657+ [ 0.0 , 1.0 , 2.0 ] , //
658+ [ 10.0 , 11.0 , 12.0 ] ,
659+ [ 20.0 , 21.0 , 22.0 ] ,
660+ ] ) ;
661+
662+ #[ test]
663+ fn row_col_vecs ( ) {
664+ assert_eq ! ( MAT . row_vec( 2 ) , vec3:: <_, Basis1 >( 20.0 , 21.0 , 22.0 ) ) ;
665+ assert_eq ! ( MAT . col_vec( 2 ) , vec3:: <_, Basis2 >( 2.0 , 12.0 , 22.0 ) ) ;
666+ }
667+
668+ #[ test]
669+ fn composition ( ) {
670+ let t = Mat3x3 :: < Map < 2 > > :: new ( [
671+ [ 1.0 , 0.0 , 2.0 ] , //
672+ [ 0.0 , 1.0 , -3.0 ] ,
673+ [ 0.0 , 0.0 , 1.0 ] ,
674+ ] ) ;
675+ let s = Mat3x3 :: < InvMap < 2 > > :: new ( [
676+ [ -1.0 , 0.0 , 0.0 ] , //
677+ [ 0.0 , 2.0 , 0.0 ] ,
678+ [ 0.0 , 0.0 , 1.0 ] ,
679+ ] ) ;
680+
681+ let ts = t. then ( & s) ;
682+ let st = s. then ( & t) ;
683+
684+ assert_eq ! ( ts, s. compose( & t) ) ;
685+ assert_eq ! ( st, t. compose( & s) ) ;
686+
687+ assert_eq ! ( ts. apply( & splat( 0.0 ) ) , vec2( -2.0 , -6.0 ) ) ;
688+ assert_eq ! ( st. apply( & splat( 0.0 ) ) , vec2( 2.0 , -3.0 ) ) ;
689+ }
690+
691+ #[ test]
692+ fn scaling ( ) {
693+ let m = Mat3x3 :: < Map < 2 > > :: new ( [
694+ [ 2.0 , 0.0 , 0.0 ] , //
695+ [ 0.0 , -3.0 , 0.0 ] ,
696+ [ 0.0 , 0.0 , 1.0 ] ,
697+ ] ) ;
698+ assert_eq ! ( m. apply( & vec2( 1.0 , 2.0 ) ) , vec2( 2.0 , -6.0 ) ) ;
699+ }
700+
701+ #[ test]
702+ fn translation ( ) {
703+ let m = Mat3x3 :: < Map < 2 > > :: new ( [
704+ [ 1.0 , 0.0 , 2.0 ] , //
705+ [ 0.0 , 1.0 , -3.0 ] ,
706+ [ 0.0 , 0.0 , 1.0 ] ,
707+ ] ) ;
708+ assert_eq ! ( m. apply( & vec2( 1.0 , 2.0 ) ) , vec2( 3.0 , -1.0 ) ) ;
709+ }
710+
711+ #[ test]
712+ fn matrix_debug ( ) {
713+ assert_eq ! (
714+ alloc:: format!( "{MAT:?}" ) ,
715+ r#"Matrix<Basis1→Basis2>[
716+ [ 0.00, 1.00, 2.00]
717+ [ 10.00, 11.00, 12.00]
718+ [ 20.00, 21.00, 22.00]
719+ ]"#
720+ ) ;
721+ }
722+ }
723+
724+ mod mat4x4 {
725+ use super :: * ;
726+
727+ const MAT : Mat4x4 < Map > = Matrix :: new ( [
656728 [ 0.0 , 1.0 , 2.0 , 3.0 ] ,
657729 [ 10.0 , 11.0 , 12.0 , 13.0 ] ,
658730 [ 20.0 , 21.0 , 22.0 , 23.0 ] ,
659731 [ 30.0 , 31.0 , 32.0 , 33.0 ] ,
660- ]
661- . into ( ) ;
732+ ] ) ;
733+
734+ #[ test]
735+ fn row_col_vecs ( ) {
736+ assert_eq ! ( MAT . row_vec( 1 ) , [ 10.0 , 11.0 , 12.0 , 13.0 ] . into( ) ) ;
737+ assert_eq ! ( MAT . col_vec( 3 ) , [ 3.0 , 13.0 , 23.0 , 33.0 ] . into( ) ) ;
738+ }
739+
740+ #[ test]
741+ fn composition ( ) {
742+ let t = translate ( vec3 ( 1.0 , 2.0 , 3.0 ) ) . to :: < Map > ( ) ;
743+ let s = scale ( vec3 ( 3.0 , 2.0 , 1.0 ) ) . to :: < InvMap > ( ) ;
662744
663- let expected = r#"Matrix<Basis1→Basis2>[
745+ let ts = t. then ( & s) ;
746+ let st = s. then ( & t) ;
747+
748+ assert_eq ! ( ts, s. compose( & t) ) ;
749+ assert_eq ! ( st, t. compose( & s) ) ;
750+
751+ assert_eq ! ( ts. apply( & splat( 0.0 ) ) , vec3:: <_, Basis1 >( 3.0 , 4.0 , 3.0 ) ) ;
752+ assert_eq ! ( st. apply( & splat( 0.0 ) ) , vec3:: <_, Basis2 >( 1.0 , 2.0 , 3.0 ) ) ;
753+ }
754+
755+ #[ test]
756+ fn scaling_vec3 ( ) {
757+ let m = scale ( vec3 ( 1.0 , -2.0 , 3.0 ) ) ;
758+ let v = vec3 ( 0.0 , 4.0 , -3.0 ) ;
759+ assert_eq ! ( m. apply( & v) , vec3( 0.0 , -8.0 , -9.0 ) ) ;
760+ }
761+
762+ #[ test]
763+ fn translation_vec3 ( ) {
764+ let m = translate ( vec3 ( 1.0 , 2.0 , 3.0 ) ) ;
765+ let v = vec3 ( 0.0 , 5.0 , -3.0 ) ;
766+ assert_eq ! ( m. apply( & v) , vec3( 1.0 , 7.0 , 0.0 ) ) ;
767+ }
768+
769+ #[ cfg( feature = "fp" ) ]
770+ #[ test]
771+ fn rotation_x ( ) {
772+ let m = rotate_x ( degs ( 90.0 ) ) ;
773+ assert_eq ! ( m. apply( & splat( 0.0 ) ) , splat( 0.0 ) ) ;
774+ assert_approx_eq ! (
775+ m. apply( & vec3( 0.0 , 0.0 , 1.0 ) ) ,
776+ vec3( 0.0 , 1.0 , 0.0 )
777+ ) ;
778+ }
779+
780+ #[ cfg( feature = "fp" ) ]
781+ #[ test]
782+ fn rotation_y ( ) {
783+ let m = rotate_y ( degs ( 90.0 ) ) ;
784+ assert_eq ! ( m. apply( & splat( 0.0 ) ) , splat( 0.0 ) ) ;
785+ assert_approx_eq ! (
786+ m. apply( & vec3( 1.0 , 0.0 , 0.0 ) ) ,
787+ vec3( 0.0 , 0.0 , 1.0 )
788+ ) ;
789+ }
790+
791+ #[ cfg( feature = "fp" ) ]
792+ #[ test]
793+ fn rotation_z ( ) {
794+ let m = rotate_z ( degs ( 90.0 ) ) ;
795+ assert_eq ! ( m. apply( & splat( 0.0 ) ) , splat( 0.0 ) ) ;
796+ assert_approx_eq ! (
797+ m. apply( & vec3( 0.0 , 1.0 , 0.0 ) ) ,
798+ vec3( 1.0 , 0.0 , 0.0 )
799+ ) ;
800+ }
801+
802+ #[ test]
803+ fn matrix_debug ( ) {
804+ assert_eq ! (
805+ alloc:: format!( "{MAT:?}" ) ,
806+ r#"Matrix<Basis1→Basis2>[
664807 [ 0.00, 1.00, 2.00, 3.00]
665808 [ 10.00, 11.00, 12.00, 13.00]
666809 [ 20.00, 21.00, 22.00, 23.00]
667810 [ 30.00, 31.00, 32.00, 33.00]
668- ]"# ;
669-
670- assert_eq ! ( alloc:: format!( "{actual:?}" ) , expected) ;
671- }
672-
673- #[ test]
674- fn row_vec ( ) {
675- let m: Mat3x3 < Map > = [
676- [ 0.0 , 1.0 , 2.0 ] , //
677- [ 10.0 , 11.0 , 12.0 ] ,
678- [ 20.0 , 21.0 , 22.0 ] ,
679- ]
680- . into ( ) ;
681- assert_eq ! ( m. row_vec( 2 ) , vec3:: <_, Basis1 >( 20.0 , 21.0 , 22.0 ) ) ;
682- }
683-
684- #[ test]
685- fn col_vec ( ) {
686- let m: Mat3x3 < Map > = [
687- [ 0.0 , 1.0 , 2.0 ] , //
688- [ 10.0 , 11.0 , 12.0 ] ,
689- [ 20.0 , 21.0 , 22.0 ] ,
690- ]
691- . into ( ) ;
692- assert_eq ! ( m. col_vec( 2 ) , vec3:: <_, Basis2 >( 2.0 , 12.0 , 22.0 ) ) ;
811+ ]"#
812+ ) ;
813+ }
693814 }
694815
695816 #[ test]
@@ -709,104 +830,6 @@ mod tests {
709830 ) ;
710831 }
711832
712- #[ test]
713- fn scaling_vec2 ( ) {
714- let m = Mat3x3 :: < Map < 2 > > :: new ( [
715- [ 2.0 , 0.0 , 0.0 ] , //
716- [ 0.0 , -3.0 , 0.0 ] ,
717- [ 0.0 , 0.0 , 1.0 ] ,
718- ] ) ;
719- assert_eq ! ( m. apply( & vec2( 1.0 , 2.0 ) ) , vec2( 2.0 , -6.0 ) ) ;
720- }
721-
722- #[ test]
723- fn translation_vec2 ( ) {
724- let m = Mat3x3 :: < Map < 2 > > :: new ( [
725- [ 1.0 , 0.0 , 2.0 ] , //
726- [ 0.0 , 1.0 , -3.0 ] ,
727- [ 0.0 , 0.0 , 1.0 ] ,
728- ] ) ;
729- assert_eq ! ( m. apply( & vec2( 1.0 , 2.0 ) ) , vec2( 3.0 , -1.0 ) ) ;
730- }
731-
732- #[ test]
733- fn scaling_vec3 ( ) {
734- let m = scale ( vec3 ( 1.0 , -2.0 , 3.0 ) ) ;
735- let v = vec3 ( 0.0 , 4.0 , -3.0 ) ;
736-
737- assert_eq ! ( m. apply( & v) , vec3( 0.0 , -8.0 , -9.0 ) ) ;
738- }
739-
740- #[ test]
741- fn translation_vec3 ( ) {
742- let m = translate ( vec3 ( 1.0 , 2.0 , 3.0 ) ) ;
743- let v = vec3 ( 0.0 , 5.0 , -3.0 ) ;
744-
745- assert_eq ! ( m. apply( & v) , vec3( 1.0 , 7.0 , 0.0 ) ) ;
746- }
747-
748- #[ cfg( feature = "fp" ) ]
749- #[ test]
750- fn rotation_x ( ) {
751- let m = rotate_x ( degs ( 90.0 ) ) ;
752- assert_eq ! ( m. apply( & splat( 0.0 ) ) , splat( 0.0 ) ) ;
753- assert_approx_eq ! ( m. apply( & vec3( 0.0 , 0.0 , 1.0 ) ) , vec3( 0.0 , 1.0 , 0.0 ) ) ;
754- }
755-
756- #[ cfg( feature = "fp" ) ]
757- #[ test]
758- fn rotation_y ( ) {
759- let m = rotate_y ( degs ( 90.0 ) ) ;
760- assert_eq ! ( m. apply( & splat( 0.0 ) ) , splat( 0.0 ) ) ;
761- assert_approx_eq ! ( m. apply( & vec3( 1.0 , 0.0 , 0.0 ) ) , vec3( 0.0 , 0.0 , 1.0 ) ) ;
762- }
763-
764- #[ cfg( feature = "fp" ) ]
765- #[ test]
766- fn rotation_z ( ) {
767- let m = rotate_z ( degs ( 90.0 ) ) ;
768- assert_eq ! ( m. apply( & splat( 0.0 ) ) , splat( 0.0 ) ) ;
769- assert_approx_eq ! ( m. apply( & vec3( 0.0 , 1.0 , 0.0 ) ) , vec3( 1.0 , 0.0 , 0.0 ) ) ;
770- }
771-
772- #[ test]
773- fn composition_3x3 ( ) {
774- let t = Mat3x3 :: < Map < 2 > > :: new ( [
775- [ 1.0 , 0.0 , 2.0 ] , //
776- [ 0.0 , 1.0 , -3.0 ] ,
777- [ 0.0 , 0.0 , 1.0 ] ,
778- ] ) ;
779- let s = Mat3x3 :: < InvMap < 2 > > :: new ( [
780- [ -1.0 , 0.0 , 0.0 ] , //
781- [ 0.0 , 2.0 , 0.0 ] ,
782- [ 0.0 , 0.0 , 1.0 ] ,
783- ] ) ;
784-
785- let ts = t. then ( & s) ;
786- let st = s. then ( & t) ;
787-
788- assert_eq ! ( ts, s. compose( & t) ) ;
789- assert_eq ! ( st, t. compose( & s) ) ;
790-
791- assert_eq ! ( ts. apply( & splat( 0.0 ) ) , vec2( -2.0 , -6.0 ) ) ;
792- assert_eq ! ( st. apply( & splat( 0.0 ) ) , vec2( 2.0 , -3.0 ) ) ;
793- }
794-
795- #[ test]
796- fn composition_4x4 ( ) {
797- let t = translate ( vec3 ( 1.0 , 2.0 , 3.0 ) ) . to :: < Map > ( ) ;
798- let s = scale ( vec3 ( 3.0 , 2.0 , 1.0 ) ) . to :: < InvMap > ( ) ;
799-
800- let ts = t. then ( & s) ;
801- let st = s. then ( & t) ;
802-
803- assert_eq ! ( ts, s. compose( & t) ) ;
804- assert_eq ! ( st, t. compose( & s) ) ;
805-
806- assert_eq ! ( ts. apply( & splat( 0.0 ) ) , vec3:: <_, Basis1 >( 3.0 , 4.0 , 3.0 ) ) ;
807- assert_eq ! ( st. apply( & splat( 0.0 ) ) , vec3:: <_, Basis2 >( 1.0 , 2.0 , 3.0 ) ) ;
808- }
809-
810833 #[ test]
811834 fn determinant_of_identity_is_one ( ) {
812835 let id: Mat4x4 < Map > = Mat4x4 :: identity ( ) ;
0 commit comments