{- - Fulsom (The Solid Modeller, written in Haskell) - - Copyright 1990,1991,1992,1993 Duncan Sinclair - - Permissiom to use, copy, modify, and distribute this software for any - purpose and without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies, and - that my name not be used in advertising or publicity pertaining to this - software without specific, written prior permission. I makes no - representations about the suitability of this software for any purpose. - It is provided ``as is'' without express or implied warranty. - - Duncan Sinclair 1993. - - Matrix arithmetic functions. - -} module Matrix where import Types import Interval -- not used. #if !defined(__HASKELL98__) #define realToFrac fromRealFrac #endif mat4x1 :: (Fractional a) => Arr -> R3 a -> R3 a mat4x1 (r1,r2,r3) xyz = (x,y,z) where x = dorow r1 xyz y = dorow r2 xyz z = dorow r3 xyz dorow :: (Fractional a) => Row -> R3 a -> a dorow (m11,m12,m13,m14) (x,y,z) = case (m1 * x) + (m2 * y) + (m3 * z) + m4 of n -> n where m1 = realToFrac m11 m2 = realToFrac m12 m3 = realToFrac m13 m4 = realToFrac m14 mat4x1' :: (Fractional a) => Arr -> R3 a -> R3 a mat4x1' (r1,r2,r3) xyz = (x,y,z) where x = dorow r1 xyz y = dorow r2 xyz z = dorow r3 xyz dorow' :: (Fractional a) => Row -> R3 a -> a dorow' (m11,m12,m13,m14) (x,y,z) = case (m1 * x) + (m2 * y) + (m3 * z) of n -> n where m1 = realToFrac m11 m2 = realToFrac m12 m3 = realToFrac m13 mat1x4 :: Row -> Arr -> Row mat1x4 a (b1,b2,b3) = (c1,c2,c3,c4) where c1 = dorow' a (b11,b21,b31) c2 = dorow' a (b12,b22,b32) c3 = dorow' a (b13,b23,b33) c4 = dorow a (b14,b24,b34) (b11,b12,b13,b14) = b1 (b21,b22,b23,b24) = b2 (b31,b32,b33,b34) = b3 mat4x4 :: Arr -> Arr -> Arr mat4x4 a (b1,b2,b3) = (c1,c2,c3) where c1 = (c11,c12,c13,c14) c2 = (c21,c22,c23,c24) c3 = (c31,c32,c33,c34) (b11,b12,b13,b14) = b1 (b21,b22,b23,b24) = b2 (b31,b32,b33,b34) = b3 (c11,c21,c31) = mat4x1' a (b11,b21,b31) (c12,c22,c32) = mat4x1' a (b12,b22,b32) (c13,c23,c33) = mat4x1' a (b13,b23,b33) (c14,c24,c34) = mat4x1 a (b14,b24,b34)