(FILECREATED " 4-Jun-85 12:48:19" {ERIS}<LISPCORE>LIBRARY>NEWMATMULT.;1 20336  

      changes to:  (FNS MAT.INVERT.3BY3 \MATMULT)

      previous date: "30-May-85 16:43:53" {ERIS}<LISPCORE>DIG>NEWMATMULT.;17)


(* Copyright (c) 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT NEWMATMULTCOMS)

(RPAQQ NEWMATMULTCOMS ((FILES CMLARRAY)
		       (FNS ARRAYCOLS ARRAYROWS CMLARRAYP SHOW.ARRAY \CHECKVALIDARRAY MAKEAIJ 
			    MAT.DETERMINANT MAT.INVERT MAT.INVERT.3BY3 MAT.SIGN)
		       (FNS CONCATTRANSFORMS MATMULT \MATMULT MATMULT133 MATMULT331 MATMULT333 
			    MATMULT144 MATMULT441 MATMULT444)
		       (FNS SET.WCOORD SET.XCOORD SET.YCOORD SET.ZCOORD GET.XCOORD GET.YCOORD 
			    GET.ZCOORD GET.WCOORD)
		       (FNS \MAKEVALIDARRAY CREATE1BY3 CREATE3BY1 CREATE3BY3 IDENTITY3BY3 
			    TRANSLATE3BY3 SCALE3BY3 ROTATE3BY3)
		       (FNS CREATE4BY4 IDENTITY4BY4 SCALE4BY4 TRANSLATE4BY4 ROTATE4BY4.ABOUTX 
			    ROTATE4BY4.ABOUTY ROTATE4BY4.ABOUTZ)
		       (MACROS GET.WCOORD GET.XCOORD GET.YCOORD GET.ZCOORD SET.WCOORD SET.XCOORD 
			       SET.YCOORD SET.ZCOORD)
		       (MACROS MATMULT133 MATMULT331 MATMULT333 MATMULT144 MATMULT441 MATMULT444)
		       (CONSTANTS WORDSPER3BY3MATRIX)
		       (RESOURCES TRANSFORM.BOX)))
(FILESLOAD CMLARRAY)
(DEFINEQ

(ARRAYCOLS
  [LAMBDA (A)                                                (* hdj "16-May-85 10:24")
    (CADR (ARRAYDIMENSIONS A])

(ARRAYROWS
  [LAMBDA (A)                                                (* hdj "16-May-85 10:24")
    (CAR (ARRAYDIMENSIONS A])

(CMLARRAYP
  [LAMBDA (CMLARRAY)                                         (* hdj "16-May-85 11:47")
    (type? CMLARRAY CMLARRAY])

(SHOW.ARRAY
  [LAMBDA (A W)                                              (* hdj "16-May-85 12:18")
    (for Y from 0 to (SUB1 (ARRAYROWS A))
       do (for X from 0 to (SUB1 (ARRAYCOLS A))
	     do (PRINTOUT W "[" .I2 Y "," .I2 X "]:" .F8.6 (AREF A Y X)
			  ,))
	  (TERPRI W))
    (TERPRI W])

(\CHECKVALIDARRAY
  [LAMBDA (ARRAY DIMS TYPE)                                  (* hdj "16-May-85 11:38")
    (LET ((DIMENSIONS (ARRAYDIMENSIONS ARRAY)))
      (if (AND (CMLARRAYP ARRAY)
	       (EQUAL DIMS DIMENSIONS)
	       (EQ (ARRAYELEMENTTYPE ARRAY)
		   TYPE))
	  then ARRAY
	else (\ILLEGAL.ARG ARRAY])

(MAKEAIJ
  [LAMBDA (A NEWA ELIDEROW ELIDECOL)                         (* hdj "16-May-85 10:24")
    (PROG ((N 0)
	   (M 0)
	   (AROWS (ARRAYROWS A))
	   (ACOLS (ARRAYCOLS A)))
          (for ROW from 0 to (SUB1 AROWS) do (if (NEQ ROW ELIDEROW)
						 then (SETQ M 0)
						      (for COL from 0 to (SUB1 ACOLS)
							 do (if (NEQ COL ELIDECOL)
								then (ASET (AREF A ROW COL)
									   NEWA N M)
								     (add M 1)))
						      (add N 1])

(MAT.DETERMINANT
  [LAMBDA (A)                                                (* hdj "16-May-85 11:32")
    (PROG (NROWS NCOLS DET)
          (SETQ NROWS (ARRAYROWS A))
          (SETQ NCOLS (ARRAYCOLS A))
          (if (NEQ NROWS NCOLS)
	      then (ERROR "Can't take determinant of non-square matrix" A))
          [if (EQ NROWS 1)
	      then (SETQ DET (AREF A 0 0))
	    elseif (EQ NROWS 2)
	      then [SETQ DET (FDIFFERENCE (FTIMES (AREF A 0 0)
						  (AREF A 1 1))
					  (FTIMES (AREF A 0 1)
						  (AREF A 1 0]
	    else (PROG [I J (AIJ (MAKEARRAY (LIST (SUB1 NROWS)
						  (SUB1 NCOLS))
					    (QUOTE ELEMENTTYPE)
					    (QUOTE FLOATP]
		       (SETQ DET 0.0)
		       (SETQ J 0)
		       (for I from 0 to (SUB1 NROWS)
			  do (MAKEAIJ A AIJ I J)
			     (SETQ DET (FPLUS DET (FTIMES (AREF A I J)
							  (MAT.SIGN I J)
							  (MAT.DETERMINANT AIJ]
          (RETURN DET])

(MAT.INVERT
  [LAMBDA (MATRIX)                                           (* hdj "16-May-85 12:29")
    (LET ((NROWS (ARRAYROWS MATRIX))
       (NCOLS (ARRAYCOLS MATRIX)))
      (PROG (AI AIJ DET)
	    (if (NEQ NROWS NCOLS)
		then (ERROR "Square matrices cannot be inverted" MATRIX))
	    (SETQ DET (MAT.DETERMINANT MATRIX))
	    (SETQ AI (MAKEARRAY (LIST NROWS NCOLS)
				(QUOTE ELEMENTTYPE)
				(QUOTE FLOATP)))
	    (SETQ AIJ (MAKEARRAY (LIST (SUB1 NROWS)
				       (SUB1 NCOLS))
				 (QUOTE ELEMENTTYPE)
				 (QUOTE FLOATP)))
	    (for I from 0 to (SUB1 NROWS) do (for J from 0 to (SUB1 NCOLS)
						do (MAKEAIJ MATRIX AIJ I J)
						   (ASET (FQUOTIENT (FTIMES (MAT.SIGN I J)
									    (MAT.DETERMINANT AIJ))
								    DET)
							 AI J I)))
	    (RETURN AI])

(MAT.INVERT.3BY3
  [LAMBDA (MATRIX)                                           (* hdj " 4-Jun-85 12:33")
    (PROG ((INVERT (CREATE3BY3))
	   (A (AREF MATRIX 0 0))
	   (B (AREF MATRIX 1 0))
	   (C (AREF MATRIX 2 0))
	   (D (AREF MATRIX 0 1))
	   (E (AREF MATRIX 1 1))
	   (F (AREF MATRIX 2 1))
	   AE BD BF EC CD AF AE-BD)
          (SETQ AE (TIMES A E))
          (SETQ BD (TIMES B D))
          (SETQ BF (TIMES B F))
          (SETQ EC (TIMES E C))
          (SETQ CD (TIMES E C))
          (SETQ AF (TIMES A F))
          (SETQ AE-BD (FDIFFERENCE AE BD))
          (if (ZEROP AE-BD)
	      then (HELP "Matrix cannot be inverted" MATRIX))
          (ASET (FQUOTIENT E AE-BD)
		INVERT 0 0)
          (ASET (FQUOTIENT (FMINUS B)
			   AE-BD)
		INVERT 1 0)
          (ASET (FQUOTIENT (FDIFFERENCE BF EC)
			   AE-BD)
		INVERT 2 0)
          (ASET (FQUOTIENT (FMINUS D)
			   AE-BD)
		INVERT 0 1)
          (ASET (FQUOTIENT A AE-BD)
		INVERT 1 1)
          (ASET (FQUOTIENT (FDIFFERENCE CD AF)
			   AE-BD)
		INVERT 2 1)
          (ASET 0.0 INVERT 0 2)
          (ASET 0.0 INVERT 1 2)
          (ASET 1.0 INVERT 2 2)
          (RETURN INVERT])

(MAT.SIGN
  [LAMBDA (I J)                                              (* hdj "16-May-85 10:46")
    (if (EQ (IMOD (IPLUS I J)
		  2)
	    0)
	then 1
      else -1])
)
(DEFINEQ

(CONCATTRANSFORMS
  [LAMBDA (A B)                                              (* hdj "24-May-85 17:17")
    (GLOBALRESOURCE TRANSFORM.BOX                            (*)
		    (MATMULT333 A B TRANSFORM.BOX)
		    (\BLT (fetch (CMLARRAY CMLANCHOR) of A)
			  (fetch (CMLARRAY CMLANCHOR) of TRANSFORM.BOX)
			  WORDSPER3BY3MATRIX))
    A])

(MATMULT
  [LAMBDA (MATRIXA MATRIXB MATRIXC K M N)                    (* hdj "16-May-85 12:13")

          (* * multiply matrices of arbitrary size)


    (\CHECKVALIDARRAY MATRIXA (LIST K M)
		      (QUOTE FLONUM))
    (\CHECKVALIDARRAY MATRIXB (LIST M N)
		      (QUOTE FLONUM))
    (\CHECKVALIDARRAY MATRIXC (LIST K N)
		      (QUOTE FLONUM))
    (for I from 0 to (SUB1 K) do (for J from 0 to (SUB1 N)
				    do (ASET (for K from 0 to (SUB1 M)
						sum (FTIMES (AREF MATRIXA I K)
							    (AREF MATRIXB K J)))
					     MATRIXC I J)))
    MATRIXC])

(\MATMULT
  [LAMBDA (A B RESULT L M N)                                 (* hdj " 4-Jun-85 12:44")
    [for I from 1 to L do (for J from 1 to N do (\SETELT RESULT I J N
							 (for K from 1 to M
							    sum (FTIMES (\GETELT A I K M)
									(\GETELT B K J N]
    RESULT])

(MATMULT133
  [LAMBDA (MATRIXA MATRIXB MATRIXC)                          (* hdj "15-May-85 16:55")

          (* * multiply (1 , 3) * (3 , 3) => (1 , 3))


    (.MATMULT133 (fetch (CMLARRAY CMLANCHOR) of MATRIXA)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXB)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXC])

(MATMULT331
  [LAMBDA (MATRIXA MATRIXB MATRIXC)                          (* hdj "15-May-85 16:58")

          (* * multiply (3 , 3) * (3 , 1) => (3 , 1))


    (.MATMULT331 (fetch (CMLARRAY CMLANCHOR) of MATRIXA)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXB)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXC])

(MATMULT333
  [LAMBDA (MATRIXA MATRIXB MATRIXC)                          (* hdj "15-May-85 17:00")

          (* * multiply two (3 , 3) matrices in microcode)


    (.MATMULT333 (fetch (CMLARRAY CMLANCHOR) of MATRIXA)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXB)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXC])

(MATMULT144
  [LAMBDA (MATRIXA MATRIXB MATRIXC)                          (* hdj "15-May-85 17:02")

          (* * multiply (1 , 4) * (4 , 4) => (1 , 41))


    (.MATMULT144 (fetch (CMLARRAY CMLANCHOR) of MATRIXA)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXB)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXC])

(MATMULT441
  [LAMBDA (MATRIXA MATRIXB MATRIXC)                          (* hdj "24-May-85 18:25")

          (* * multiply (4 , 4) * (4 , 1) => (4 , 1))


    (.MATMULT441 (fetch (CMLARRAY CMLANCHOR) of MATRIXA)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXB)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXC])

(MATMULT444
  [LAMBDA (MATRIXA MATRIXB MATRIXC)                          (* hdj "24-May-85 18:23")

          (* * multiply two (4 , 4) matrices in microcode)


    (.MATMULT444 (fetch (CMLARRAY CMLANCHOR) of MATRIXA)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXB)
		 (fetch (CMLARRAY CMLANCHOR) of MATRIXC])
)
(DEFINEQ

(SET.WCOORD
  [LAMBDA (VECTOR VALUE)                                     (* hdj "16-May-85 14:29")
    (ASET VALUE VECTOR 0 3])

(SET.XCOORD
  [LAMBDA (VECTOR VALUE)                                     (* hdj "16-May-85 14:27")
    (ASET VALUE VECTOR 0 0])

(SET.YCOORD
  [LAMBDA (VECTOR VALUE)                                     (* hdj "16-May-85 14:28")
    (ASET VALUE VECTOR 0 1])

(SET.ZCOORD
  [LAMBDA (VECTOR VALUE)                                     (* hdj "16-May-85 14:28")
    (ASET VALUE VECTOR 0 2])

(GET.XCOORD
  [LAMBDA (VECTOR)                                           (* hdj "17-May-85 14:34")
    (AREF VECTOR 0 0])

(GET.YCOORD
  [LAMBDA (VECTOR)                                           (* hdj "17-May-85 14:34")
    (AREF VECTOR 0 1])

(GET.ZCOORD
  [LAMBDA (VECTOR)                                           (* hdj "17-May-85 14:35")
    (AREF VECTOR 0 2])

(GET.WCOORD
  [LAMBDA (VECTOR)                                           (* hdj "17-May-85 14:35")
    (AREF VECTOR 0 3])
)
(DEFINEQ

(\MAKEVALIDARRAY
  [LAMBDA (ARRAY DIMS CREATEFN)                              (* hdj "16-May-85 11:48")
    (if (AND (CMLARRAYP ARRAY)
	     (EQUAL DIMS (ARRAYDIMENSIONS ARRAY)))
	then ARRAY
      else (if (NULL ARRAY)
	       then (APPLY CREATEFN)
	     else (\ILLEGAL.ARG ARRAY])

(CREATE1BY3
  [LAMBDA NIL                                                (* hdj "16-May-85 12:25")
    (MAKEARRAY (LIST 1 3)
	       (QUOTE ELEMENTTYPE)
	       (QUOTE FLOATP])

(CREATE3BY1
  [LAMBDA NIL                                                (* hdj "16-May-85 12:25")
    (MAKEARRAY (LIST 3 1)
	       (QUOTE ELEMENTTYPE)
	       (QUOTE FLOATP])

(CREATE3BY3
  [LAMBDA NIL                                                (* hdj "16-May-85 11:42")
    (MAKEARRAY (LIST 3 3)
	       (QUOTE ELEMENTTYPE)
	       (QUOTE FLOATP])

(IDENTITY3BY3
  [LAMBDA (M)                                                (* hdj "16-May-85 11:49")
    (LET [(MATRIX (\MAKEVALIDARRAY M (LIST 3 3)
				   (FUNCTION CREATE3BY3]
      (ASET 1.0 MATRIX 0 0)
      (ASET 1.0 MATRIX 1 1)
      (ASET 1.0 MATRIX 2 2)
      MATRIX])

(TRANSLATE3BY3
  [LAMBDA (Tx Ty M)                                          (* hdj "16-May-85 11:45")
    (LET [(MATRIX (\MAKEVALIDARRAY M (LIST 3 3)
				   (FUNCTION CREATE3BY3]
      (IDENTITY3BY3 MATRIX)
      (ASET Tx MATRIX 2 0)
      (ASET Ty MATRIX 2 1)
      MATRIX])

(SCALE3BY3
  [LAMBDA (Sx Sy M)                                          (* hdj "29-May-85 11:54")
    (LET [(MATRIX (\MAKEVALIDARRAY M (LIST 3 3)
				   (FUNCTION CREATE3BY3]
      (ASET Sx MATRIX 0 0)
      (ASET Sy MATRIX 1 1)
      (ASET 1.0 MATRIX 2 2)
      MATRIX])

(ROTATE3BY3
  [LAMBDA (PHI M RADIANSFLG)                                 (* hdj "30-May-85 16:43")
    (LET ((MATRIX (\MAKEVALIDARRAY M 9 (FUNCTION CREATE3BY3)))
       (COSPHI (COS PHI RADIANSFLG))
       (SINPHI (SIN PHI RADIANSFLG)))
      (ASET COSPHI MATRIX 0 0)
      (ASET (FMINUS SINPHI)
	    MATRIX 0 1)
      (ASET 0.0 MATRIX 0 2)
      (ASET SINPHI MATRIX 1 0)
      (ASET COSPHI MATRIX 1 1)
      (ASET 0.0 MATRIX 1 2)
      (ASET 0.0 MATRIX 2 0)
      (ASET 0.0 MATRIX 2 1)
      (ASET 1.0 MATRIX 2 2)
      MATRIX])
)
(DEFINEQ

(CREATE4BY4
  [LAMBDA NIL                                                (* hdj "30-May-85 15:45")
    (MAKEARRAY (LIST 4 4)
	       (QUOTE ELEMENTTYPE)
	       (QUOTE FLOATP])

(IDENTITY4BY4
  [LAMBDA (M)                                                (* hdj "30-May-85 15:47")
    (LET [(MATRIX (\MAKEVALIDARRAY M (LIST 4 4)
				   (FUNCTION CREATE4BY4]
      (ASET 1.0 MATRIX 0 0)
      (ASET 1.0 MATRIX 1 1)
      (ASET 1.0 MATRIX 2 2)
      (ASET 1.0 MATRIX 3 3)
      MATRIX])

(SCALE4BY4
  [LAMBDA (Sx Sy Sz M)                                       (* hdj "30-May-85 15:05")
    (LET [(MATRIX (\MAKEVALIDARRAY M (LIST 3 3)
				   (FUNCTION CREATE4BY4]
      (ASET Sx MATRIX 0 0)
      (ASET Sy MATRIX 1 1)
      (ASET Sz MATRIX 2 2)
      (ASET 1.0 MATRIX 3 3)
      MATRIX])

(TRANSLATE4BY4
  [LAMBDA (Tx Ty Tz M)                                       (* hdj "30-May-85 15:37")
    (LET [(MATRIX (IDENTITY4BY4 (\MAKEVALIDARRAY M (LIST 4 4)
						 (FUNCTION CREATE4BY4]
      (IDENTITY4BY4 MATRIX)
      (ASET Tx MATRIX 3 0)
      (ASET Ty MATRIX 3 1)
      (ASET Tz MATRIX 3 2)
      MATRIX])

(ROTATE4BY4.ABOUTX
  [LAMBDA (PHI RADIANSFLG M)                                 (* hdj "30-May-85 16:41")
    (LET ((MATRIX (\MAKEVALIDARRAY M (LIST 4 4)
				   (FUNCTION CREATE4BY4)))
       (COSPHI (COS PHI RADIANSFLG))
       (SINPHI (SIN PHI RADIANSFLG)))
      (ASET 1.0 MATRIX 0 0)
      (ASET COSPHI MATRIX 1 1)
      (ASET (FMINUS SINPHI)
	    MATRIX 1 2)
      (ASET SINPHI MATRIX 2 1)
      (ASET COSPHI MATRIX 2 2)
      (ASET 1.0 MATRIX 3 3)
      MATRIX])

(ROTATE4BY4.ABOUTY
  [LAMBDA (PHI RADIANSFLG M)                                 (* hdj "30-May-85 16:42")
    (LET ((MATRIX (\MAKEVALIDARRAY M (LIST 4 4)
				   (FUNCTION CREATE4BY4)))
       (COSPHI (COS PHI RADIANSFLG))
       (SINPHI (SIN PHI RADIANSFLG)))
      (ASET COSPHI MATRIX 0 0 4)
      (ASET (FMINUS SINPHI)
	    MATRIX 2 0 4)
      (ASET 1.0 MATRIX 1 1 4)
      (ASET SINPHI MATRIX 0 2 4)
      (ASET COSPHI MATRIX 2 2 4)
      (ASET 1.0 MATRIX 3 3 4)
      MATRIX])

(ROTATE4BY4.ABOUTZ
  [LAMBDA (PHI RADIANSFLG M)                                 (* hdj "30-May-85 16:32")
    (LET ((MATRIX (\MAKEVALIDARRAY M (LIST 4 4)
				   (FUNCTION CREATE4BY4)))
       (COSPHI (COS PHI RADIANSFLG))
       (SINPHI (SIN PHI RADIANSFLG)))
      (ASET COSPHI MATRIX 1 1)
      (ASET (FMINUS SINPHI)
	    MATRIX 1 2)
      (ASET SINPHI MATRIX 2 1)
      (ASET COSPHI MATRIX 2 2)
      (ASET 1.0 MATRIX 3 3)
      (ASET 1.0 MATRIX 4 4)
      MATRIX])
)
(DECLARE: EVAL@COMPILE 
(PUTPROPS GET.WCOORD MACRO [LAMBDA (VECTOR)
				   (* hdj "17-May-85 14:35")
				   (AREF VECTOR 0 3])
(PUTPROPS GET.XCOORD MACRO [LAMBDA (VECTOR)
				   (* hdj "17-May-85 14:34")
				   (AREF VECTOR 0 0])
(PUTPROPS GET.YCOORD MACRO [LAMBDA (VECTOR)
				   (* hdj "17-May-85 14:34")
				   (AREF VECTOR 0 1])
(PUTPROPS GET.ZCOORD MACRO [LAMBDA (VECTOR)
				   (* hdj "17-May-85 14:35")
				   (AREF VECTOR 0 2])
(PUTPROPS SET.WCOORD MACRO [LAMBDA (VECTOR VALUE)
				   (* hdj "16-May-85 14:29")
				   (ASET VALUE VECTOR 0 3])
(PUTPROPS SET.XCOORD MACRO [LAMBDA (VECTOR VALUE)
				   (* hdj "16-May-85 14:27")
				   (ASET VALUE VECTOR 0 0])
(PUTPROPS SET.YCOORD MACRO [LAMBDA (VECTOR VALUE)
				   (* hdj "16-May-85 14:28")
				   (ASET VALUE VECTOR 0 1])
(PUTPROPS SET.ZCOORD MACRO [LAMBDA (VECTOR VALUE)
				   (* hdj "16-May-85 14:28")
				   (ASET VALUE VECTOR 0 2])
)
(DECLARE: EVAL@COMPILE 
[PUTPROPS MATMULT133 DMACRO (LAMBDA (MATRIXA MATRIXB MATRIXC)
				    (* hdj "12-Feb-85 12:28")
				    (* * multiply (1 , 3)
				       *
				       (3 , 3)
				       =>
				       (1 , 3))
				    (LET ((MATRIXABASE (fetch (ARRAYP BASE)
							      of MATRIXA))
					  (MATRIXBBASE (fetch (ARRAYP BASE)
							      of MATRIXB))
					  (MATRIXCBASE (fetch (ARRAYP BASE)
							      of MATRIXC)))
					 (.MATMULT133 MATRIXABASE MATRIXBBASE MATRIXCBASE]
[PUTPROPS MATMULT331 DMACRO (LAMBDA (MATRIXA MATRIXB MATRIXC)
				    (* hdj "12-Feb-85 12:30")
				    (* * multiply (3 , 3)
				       *
				       (3 , 1)
				       =>
				       (3 , 1))
				    (LET ((MATRIXABASE (fetch (ARRAYP BASE)
							      of MATRIXA))
					  (MATRIXBBASE (fetch (ARRAYP BASE)
							      of MATRIXB))
					  (MATRIXCBASE (fetch (ARRAYP BASE)
							      of MATRIXC)))
					 (.MATMULT331 MATRIXABASE MATRIXBBASE MATRIXCBASE]
[PUTPROPS MATMULT333 DMACRO (LAMBDA (MATRIXA MATRIXB MATRIXC)
				    (* hdj "12-Feb-85 12:30")
				    (* * multiply two (3 , 3)
				       matrices in microcode)
				    (LET ((MATRIXABASE (fetch (ARRAYP BASE)
							      of MATRIXA))
					  (MATRIXBBASE (fetch (ARRAYP BASE)
							      of MATRIXB))
					  (MATRIXCBASE (fetch (ARRAYP BASE)
							      of MATRIXC)))
					 (.MATMULT333 MATRIXABASE MATRIXBBASE MATRIXCBASE]
[PUTPROPS MATMULT144 DMACRO (LAMBDA (MATRIXA MATRIXB MATRIXC)
				    (* hdj "12-Feb-85 12:31")
				    (* * multiply (1 , 4)
				       *
				       (4 , 4)
				       =>
				       (1 , 41))
				    (LET ((MATRIXABASE (fetch (ARRAYP BASE)
							      of MATRIXA))
					  (MATRIXBBASE (fetch (ARRAYP BASE)
							      of MATRIXB))
					  (MATRIXCBASE (fetch (ARRAYP BASE)
							      of MATRIXC)))
					 (.MATMULT144 MATRIXABASE MATRIXBBASE MATRIXCBASE]
[PUTPROPS MATMULT441 DMACRO (LAMBDA (MATRIXA MATRIXB MATRIXC)
				    (* hdj "12-Feb-85 12:32")
				    (* * multiply (4 , 4)
				       *
				       (4 , 1)
				       =>
				       (4 , 1))
				    (LET ((MATRIXABASE (fetch (ARRAYP BASE)
							      of MATRIXA))
					  (MATRIXBBASE (fetch (ARRAYP BASE)
							      of MATRIXB))
					  (MATRIXCBASE (fetch (ARRAYP BASE)
							      of MATRIXC)))
					 (.MATMULT441 MATRIXABASE MATRIXBBASE MATRIXCBASE]
[PUTPROPS MATMULT444 DMACRO (LAMBDA (MATRIXA MATRIXB MATRIXC)
				    (* hdj "12-Feb-85 12:25")
				    (* * multiply two (4 , 4)
				       matrices in microcode)
				    (LET ((MATRIXABASE (fetch (ARRAYP BASE)
							      of MATRIXA))
					  (MATRIXBBASE (fetch (ARRAYP BASE)
							      of MATRIXB))
					  (MATRIXCBASE (fetch (ARRAYP BASE)
							      of MATRIXC)))
					 (.MATMULT444 MATRIXABASE MATRIXBBASE MATRIXCBASE]
)
(DECLARE: EVAL@COMPILE 

(RPAQQ WORDSPER3BY3MATRIX 18)

(CONSTANTS WORDSPER3BY3MATRIX)
)
(DECLARE: EVAL@COMPILE 
[PUTDEF (QUOTE TRANSFORM.BOX)
	(QUOTE RESOURCES)
	(QUOTE (NEW (IDENTITY3BY3]
)
(PUTPROPS NEWMATMULT COPYRIGHT ("Xerox Corporation" 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1281 6563 (ARRAYCOLS 1291 . 1435) (ARRAYROWS 1437 . 1580) (CMLARRAYP 1582 . 1722) (
SHOW.ARRAY 1724 . 2085) (\CHECKVALIDARRAY 2087 . 2447) (MAKEAIJ 2449 . 3003) (MAT.DETERMINANT 3005 . 
4097) (MAT.INVERT 4099 . 5028) (MAT.INVERT.3BY3 5030 . 6362) (MAT.SIGN 6364 . 6561)) (6564 10011 (
CONCATTRANSFORMS 6574 . 6947) (MATMULT 6949 . 7628) (\MATMULT 7630 . 7976) (MATMULT133 7978 . 8313) (
MATMULT331 8315 . 8650) (MATMULT333 8652 . 8992) (MATMULT144 8994 . 9330) (MATMULT441 9332 . 9667) (
MATMULT444 9669 . 10009)) (10012 11126 (SET.WCOORD 10022 . 10161) (SET.XCOORD 10163 . 10302) (
SET.YCOORD 10304 . 10443) (SET.ZCOORD 10445 . 10584) (GET.XCOORD 10586 . 10719) (GET.YCOORD 10721 . 
10854) (GET.ZCOORD 10856 . 10989) (GET.WCOORD 10991 . 11124)) (11127 13609 (\MAKEVALIDARRAY 11137 . 
11482) (CREATE1BY3 11484 . 11684) (CREATE3BY1 11686 . 11886) (CREATE3BY3 11888 . 12088) (IDENTITY3BY3 
12090 . 12398) (TRANSLATE3BY3 12400 . 12707) (SCALE3BY3 12709 . 13012) (ROTATE3BY3 13014 . 13607)) (
13610 16448 (CREATE4BY4 13620 . 13820) (IDENTITY4BY4 13822 . 14162) (SCALE4BY4 14164 . 14498) (
TRANSLATE4BY4 14500 . 14856) (ROTATE4BY4.ABOUTX 14858 . 15382) (ROTATE4BY4.ABOUTY 15384 . 15920) (
ROTATE4BY4.ABOUTZ 15922 . 16446)))))
STOP