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