The J programming language provides several facilities for various kinds of graphics programming including an interface to the OpenGL libraries if available on the host system. Models can be built for a variety of graphics topics. Included are models of the 2D transformations (using homogeneous coordinates) scale, rotate and translate.
mat_product =: +/ . * scale =: monad def '3 3 reshape (0 from y.), 0 0 0 , (1 from y.), 0 0 0 1' translate =: monad def '3 3 reshape 1 0 0 0 1 0 , y. , 1' rotate =: monad def '((2 2 reshape 1 1 _1 1 * 2 1 1 2 o. (o. y.) % 180),.0),0 0 1'
NB. A square data object square =: 5 2 $ 0 0 10 0 10 10 0 10 0 0 square 0 0 10 0 10 10 0 10 0 0 translate 10 _10 1 0 0 0 1 0 10 _10 1 (square,.1) mat_product translate 10 _10 10 _10 1 20 _10 1 20 0 1 10 0 1 10 _10 1 NB. Don't do unnecessary multiplications (square,.1) mat_product 3 2 {. translate 10 _10 10 _10 20 _10 20 0 10 0 10 _10 rotate 180 _1 0 0 0 _1 0 0 0 1 (square,.1) mat_product 3 2 {. rotate 180 0 0 _10 0 _10 _10 0 _10 0 0 new_square =: (square,.1) mat_product 3 2 {. translate 10 10 new_square 10 10 20 10 20 20 10 20 10 10 NB. Rotate this square 90 degrees about the point 10 10 xform =: (translate _10 _10)mat_product (rotate 90) mat_product translate 10 10 xform 0 1 0 _1 0 0 20 0 1 (new_square,. 1) mat_product 3 2 {. xform 10 10 10 20 0 20 0 10 10 10