    class
    	EV_MODEL_TRANSFORMATION

    General
    	cluster: interface
    	description:
    		"An EV_TRANSFORMATION is basicaly a matrix
    		discribing a projection from one coordinate system
    		into another with homogeneouse coordinates.
    		You can use an EV_TRANSFORMATION to change
    		shape of any transformable EV_FIGURE.

    		examples:
    		translating (x, y) to (x + dx, y + dy):

    		| 1  0  dx |    |x|    |x + dx|
    		| 0  1  dy |  * |y|  = |y + dy|
    		| 0  0  1  |    |1|    |  1   |

    		rotation matrix around (0, 0) for angle:

    		| cosine angle   -sine angle   0 |
    		|  sine angle   cosine angle   0 |
    		|      0             0         1 |

    		scaling for sx in x direction and sy in y direction:

    		| sx  0   0 |
    		|  0 sy   0 |
    		|  0  0   1 |

    		This transformations can be combined by just multipling the
    		matrixes togetter. For example a rotation around (px, py) is
    		achieved by first translating a point such that px, py is at
    		(0, 0), then rotating and then translating back:

    		|1 0 px|   |cosine angle   -sine angle  0|   |1 0 -px|
    		|0 1 py| * | sine angle   cosine angle  0| * |0 1 -py|
    		|0 0 1 |   |    0              0        1|   |0 0  1 |

    		(read from right to left)
    		The result matrix is build when calling rotate.

    		The beauty of the approach is no matter how
    		complex your transformation is the complexity is allways:
    		4 multiplications and 4 additions per point (see project)

    		See the book: Computer Graphics by Foley et all, side 201 for more informations."
    	create: make_zero, make_id

    Ancestors
    	ANY
    	DOUBLE_MATH

    Queries
    	Height: INTEGER_32
    	infix "*" (other: [like Current] EV_MODEL_TRANSFORMATION): [like Current] EV_MODEL_TRANSFORMATION
    	item (row, column: INTEGER_32): REAL_64
    	Width: INTEGER_32

    Commands
    	project (point: EV_COORDINATE)
    	put (v: [like item] REAL_64; row, column: INTEGER_32)
    	rotate (an_angle, a_x, a_y: [like item] REAL_64)
    	scale (a_scale_x, a_scale_y, a_x, a_y, an_angle: [like item] REAL_64)
    	scale_abs (a_scale_x, a_scale_y, a_x, a_y: [like item] REAL_64)
    	translate (a_x, a_y: [like item] REAL_64)

    Constraints
    	area not void