@@ -369,10 +369,10 @@ where T: Copy + Clone +
369369 /// The input point must be use the unit Src, and the returned point has the unit Dst.
370370 #[ inline]
371371 pub fn transform_point4d ( & self , p : & TypedPoint4D < T , Src > ) -> TypedPoint4D < T , Dst > {
372- let x = p. x * self . m11 + p. y * self . m21 + p. z * self . m31 + self . m41 ;
373- let y = p. x * self . m12 + p. y * self . m22 + p. z * self . m32 + self . m42 ;
374- let z = p. x * self . m13 + p. y * self . m23 + p. z * self . m33 + self . m43 ;
375- let w = p. x * self . m14 + p. y * self . m24 + p. z * self . m34 + self . m44 ;
372+ let x = p. x * self . m11 + p. y * self . m21 + p. z * self . m31 + p . w * self . m41 ;
373+ let y = p. x * self . m12 + p. y * self . m22 + p. z * self . m32 + p . w * self . m42 ;
374+ let z = p. x * self . m13 + p. y * self . m23 + p. z * self . m33 + p . w * self . m43 ;
375+ let w = p. x * self . m14 + p. y * self . m24 + p. z * self . m34 + p . w * self . m44 ;
376376 TypedPoint4D :: new ( x, y, z, w)
377377 }
378378
@@ -553,7 +553,8 @@ impl<T: Copy + fmt::Debug, Src, Dst> fmt::Debug for TypedMatrix4D<T, Src, Dst> {
553553
554554#[ cfg( test) ]
555555mod tests {
556- use point:: Point2D ;
556+ use approxeq:: ApproxEq ;
557+ use point:: { Point2D , Point4D } ;
557558 use Radians ;
558559 use super :: * ;
559560
@@ -644,4 +645,21 @@ mod tests {
644645 let m2 = Matrix4D :: identity ( ) . pre_translated ( 1.0 , 2.0 , 3.0 ) . pre_scaled ( 1.0 , 2.0 , 3.0 ) ;
645646 assert ! ( m1. approx_eq( & m2) ) ;
646647 }
648+
649+ #[ test]
650+ pub fn test_transform_associativity ( ) {
651+ let m1 = Mf32 :: row_major ( 3.0 , 2.0 , 1.5 , 1.0 ,
652+ 0.0 , 4.5 , -1.0 , -4.0 ,
653+ 0.0 , 3.5 , 2.5 , 40.0 ,
654+ 0.0 , 3.0 , 0.0 , 1.0 ) ;
655+ let m2 = Mf32 :: row_major ( 1.0 , -1.0 , 3.0 , 0.0 ,
656+ -1.0 , 0.5 , 0.0 , 2.0 ,
657+ 1.5 , -2.0 , 6.0 , 0.0 ,
658+ -2.5 , 6.0 , 1.0 , 1.0 ) ;
659+
660+ let p = Point4D :: new ( 1.0 , 3.0 , 5.0 , 1.0 ) ;
661+ let p1 = m2. pre_mul ( & m1) . transform_point4d ( & p) ;
662+ let p2 = m2. transform_point4d ( & m1. transform_point4d ( & p) ) ;
663+ assert ! ( p1. approx_eq( & p2) ) ;
664+ }
647665}
0 commit comments