Automatic generation produced by ISE Eiffel

```

Classes
Clusters
Cluster hierarchy
Chart
Relations
Flat contracts
Go to:
note
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 |

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.
]"
legal: "See notice at end of class."
status: "See notice at end of class."
date: "\$Date: 2009-06-10 20:59:07 -0800 (Wed, 10 Jun 2009) \$"
revision: "\$Revision: 79202 \$"

class interface
EV_MODEL_TRANSFORMATION

create
make_zero
-- Create a transformation matrix with all elements 0.0

make_id
-- Create an identity transformation matrix

feature -- Access

arc_cosine (v: REAL_64): REAL_64
-- Trigonometric arccosine of radian v
-- in the range [0, pi].
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

arc_sine (v: REAL_64): REAL_64
-- Trigonometric arcsine of radian v
-- in the range [-pi/2, +pi/2].
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

arc_tangent (v: REAL_64): REAL_64
-- Trigonometric arctangent of radian v
-- in the range [-pi/2, +pi/2].
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

ceiling (v: REAL_64): REAL_64
-- Least integral greater than or equal to v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

cosine (v: REAL_64): REAL_64
-- Trigonometric cosine of radian v approximated
-- in the range [-pi/4, +pi/4].
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

dabs (v: REAL_64): REAL_64
-- Absolute of v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

Euler: REAL_64 = 2.7182818284590452353602874713526625
-- Logarithm base
-- (from MATH_CONST)

exp (x: REAL_64): REAL_64
-- Exponential of v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

floor (v: REAL_64): REAL_64
-- Greatest integral less than or equal to v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

generating_type: TYPE [detachable EV_MODEL_TRANSFORMATION]
-- Type of current object
-- (type of which it is a direct instance)
-- (from ANY)
ensure -- from ANY
generating_type_not_void: Result /= Void

generator: STRING_8
-- Name of current object's generating class
-- (base class of the type of which it is a direct instance)
-- (from ANY)
ensure -- from ANY
generator_not_void: Result /= Void
generator_not_empty: not Result.is_empty

Height: INTEGER_32 = 3
-- Number of rows in the matrix.

item (row, column: INTEGER_32): REAL_64
-- Entry at position (row, column)
require
valid_row: (1 <= row) and (row <= Height)
valid_column: (1 <= column) and (column <= Width)

log (v: REAL_64): REAL_64
-- Natural logarithm of v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

log10 (v: REAL_64): REAL_64
-- Base 10 logarithm of v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

log_2 (v: REAL_64): REAL_64
-- Base 2 logarithm of v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

Pi: REAL_64 = 3.1415926535897932384626433832795029
-- (from MATH_CONST)

Pi_2: REAL_64 = 1.5707963267948966192313216916397514
-- (from MATH_CONST)

Pi_4: REAL_64 = 0.7853981633974483096156608458198757
-- (from MATH_CONST)

sine (v: REAL_64): REAL_64
-- Trigonometric sine of radian v approximated
-- in range [-pi/4, +pi/4].
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

sqrt (v: REAL_64): REAL_64
-- Square root of v.
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

Sqrt2: REAL_64 = 1.4142135623730950488016887242096981
-- Square root of 2
-- (from MATH_CONST)

tangent (v: REAL_64): REAL_64
-- Trigonometric tangent of radian v approximated
-- in range [-pi/4, +pi/4].
-- (from DOUBLE_MATH)
ensure -- from DOUBLE_MATH
instance_free: class

Width: INTEGER_32 = 3
-- Number of columns in the matrix.

feature -- Comparison

frozen deep_equal (a: detachable ANY; b: like arg #1): BOOLEAN
-- Are a and b either both void
-- or attached to isomorphic object structures?
-- (from ANY)
ensure -- from ANY
instance_free: class
shallow_implies_deep: standard_equal (a, b) implies Result
both_or_none_void: (a = Void) implies (Result = (b = Void))
same_type: (Result and (a /= Void)) implies (b /= Void and then a.same_type (b))
symmetric: Result implies deep_equal (b, a)

frozen equal (a: detachable ANY; b: like arg #1): BOOLEAN
-- Are a and b either both void or attached
-- to objects considered equal?
-- (from ANY)
ensure -- from ANY
instance_free: class
definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.is_equal (b))

frozen is_deep_equal alias "≡≡≡" (other: EV_MODEL_TRANSFORMATION): BOOLEAN
-- Are Current and other attached to isomorphic object structures?
-- (from ANY)
require -- from ANY
other_not_void: other /= Void
ensure -- from ANY
shallow_implies_deep: standard_is_equal (other) implies Result
same_type: Result implies same_type (other)
symmetric: Result implies other.is_deep_equal (Current)

is_equal (other: EV_MODEL_TRANSFORMATION): BOOLEAN
-- Is other attached to an object considered
-- equal to current object?
-- (from ANY)
require -- from ANY
other_not_void: other /= Void
ensure -- from ANY
symmetric: Result implies other ~ Current
consistent: standard_is_equal (other) implies Result

frozen standard_equal (a: detachable ANY; b: like arg #1): BOOLEAN
-- Are a and b either both void or attached to
-- field-by-field identical objects of the same type?
-- Always uses default object comparison criterion.
-- (from ANY)
ensure -- from ANY
instance_free: class
definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.standard_is_equal (b))

frozen standard_is_equal alias "≜" (other: EV_MODEL_TRANSFORMATION): BOOLEAN
-- Is other attached to an object of the same type
-- as current object, and field-by-field identical to it?
-- (from ANY)
require -- from ANY
other_not_void: other /= Void
ensure -- from ANY
same_type: Result implies same_type (other)
symmetric: Result implies other.standard_is_equal (Current)

feature -- Status report

conforms_to (other: ANY): BOOLEAN
-- Does type of current object conform to type
-- of other (as per Eiffel: The Language, chapter 13)?
-- (from ANY)
require -- from ANY
other_not_void: other /= Void

same_type (other: ANY): BOOLEAN
-- Is type of current object identical to type of other?
-- (from ANY)
require -- from ANY
other_not_void: other /= Void
ensure -- from ANY
definition: Result = (conforms_to (other) and other.conforms_to (Current))

feature -- Element change

put (v: like item; row, column: INTEGER_32)
-- Put v to position (row, column)
require
valid_row: (1 <= row) and (row <= Height)
valid_column: (1 <= column) and (column <= Width)

feature -- Duplication

copy (other: EV_MODEL_TRANSFORMATION)
-- Update current object using fields of object attached
-- to other, so as to yield equal objects.
-- (from ANY)
require -- from ANY
other_not_void: other /= Void
type_identity: same_type (other)
ensure -- from ANY
is_equal: Current ~ other

frozen deep_copy (other: EV_MODEL_TRANSFORMATION)
-- Effect equivalent to that of:
--		`copy` (other . `deep_twin`)
-- (from ANY)
require -- from ANY
other_not_void: other /= Void
ensure -- from ANY
deep_equal: deep_equal (Current, other)

frozen deep_twin: EV_MODEL_TRANSFORMATION
-- New object structure recursively duplicated from Current.
-- (from ANY)
ensure -- from ANY
deep_twin_not_void: Result /= Void
deep_equal: deep_equal (Current, Result)

frozen standard_copy (other: EV_MODEL_TRANSFORMATION)
-- Copy every field of other onto corresponding field
-- of current object.
-- (from ANY)
require -- from ANY
other_not_void: other /= Void
type_identity: same_type (other)
ensure -- from ANY
is_standard_equal: standard_is_equal (other)

frozen standard_twin: EV_MODEL_TRANSFORMATION
-- New object field-by-field identical to other.
-- Always uses default copying semantics.
-- (from ANY)
ensure -- from ANY
standard_twin_not_void: Result /= Void
equal: standard_equal (Result, Current)

frozen twin: EV_MODEL_TRANSFORMATION
-- New object equal to Current
-- `twin` calls `copy`; to change copying/twinning semantics, redefine `copy`.
-- (from ANY)
ensure -- from ANY
twin_not_void: Result /= Void
is_equal: Result ~ Current

feature -- Basic operations

frozen default: detachable EV_MODEL_TRANSFORMATION
-- Default value of object's type
-- (from ANY)

frozen default_pointer: POINTER
-- Default value of type POINTER
-- (Avoid the need to write p.`default` for
-- some p of type POINTER.)
-- (from ANY)
ensure -- from ANY
instance_free: class

default_rescue
-- Process exception for routines with no Rescue clause.
-- (Default: do nothing.)
-- (from ANY)

frozen do_nothing
-- Execute a null action.
-- (from ANY)
ensure -- from ANY
instance_free: class

feature -- Basic operation

product alias "*" (other: like Current): like Current
-- Calculate result := Current * other.
require
other_not_void: other /= Void
ensure
result_not_void: Result /= Void

project (point: EV_COORDINATE)
-- Project point using Current transformation.

rotate (an_angle: like item; a_x: like item; a_y: like item)
-- Set values of matrix describing a
-- rotation around the point (a_x, a_y) for
-- angle (clockwise).

scale (a_scale_x: like item; a_scale_y: like item; a_x: like item; a_y: like item; an_angle: like item)
-- Build a matrix describing a rotation around (a_x, a_y) for -an_angle, a scale
-- of a_scale_x in x direction and a scale of a_scale_y in
-- y direction and a rotation of angle around (a_x, a_y)

scale_abs (a_scale_x: like item; a_scale_y: like item; a_x: like item; a_y: like item)
-- Build a matrix describing a translation to -ax -ay, a scale
-- of a_scale_x in x direction and a scale of a_scale_y in
-- y direction and a translation to ax ay.

translate (a_x: like item; a_y: like item)
-- Build a matrix describing a translation for
-- a_x a_y pixel.

feature -- Output

Io: STD_FILES
-- Handle to standard file setup
-- (from ANY)
ensure -- from ANY
instance_free: class
io_not_void: Result /= Void

out: STRING_8
-- New string containing terse printable representation
-- of current object
-- (from ANY)
ensure -- from ANY
out_not_void: Result /= Void

print (o: detachable ANY)
-- Write terse external representation of o
-- on standard output.
-- (from ANY)
ensure -- from ANY
instance_free: class

frozen tagged_out: STRING_8
-- New string containing terse printable representation
-- of current object
-- (from ANY)
ensure -- from ANY
tagged_out_not_void: Result /= Void

feature -- Platform

Operating_environment: OPERATING_ENVIRONMENT
-- Objects available from the operating system
-- (from ANY)
ensure -- from ANY
instance_free: class
operating_environment_not_void: Result /= Void

invariant
area_not_void: area /= Void

-- from ANY
reflexive_equality: standard_is_equal (Current)
reflexive_conformance: conforms_to (Current)

note
source: "[
Eiffel Software
356 Storke Road, Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"

end -- class EV_MODEL_TRANSFORMATION

Classes
Clusters
Cluster hierarchy
Chart
Relations
Flat contracts
Go to:
```

-- Generated by Eiffel Studio --
For more details: eiffel.org