indexing
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.
]"
legal: "See notice at end of class."
status: "See notice at end of class."
date: "$Date: 2006-01-22 18:25:44 -0800 (Sun, 22 Jan 2006) $"
revision: "$Revision: 56675 $"
class interface
EV_MODEL_TRANSFORMATION
create
make_zero
make_id
feature
generating_type: STRING_8
ANY
generator: STRING_8
ANY
height: INTEGER_32 is 3
item (row, column: INTEGER_32): REAL_64
`row'`column'
require
valid_row: (1 <= row) and (row <= height)
valid_column: (1 <= column) and (column <= width)
width: INTEGER_32 is 3
feature
frozen deep_equal (some: ANY; other: like arg #1): BOOLEAN
`some'`other'
ANY
ensure ANY
shallow_implies_deep: standard_equal (some, other) implies Result
both_or_none_void: (some = Void) implies (Result = (other = Void))
same_type: (Result and (some /= Void)) implies some.same_type (other)
symmetric: Result implies deep_equal (other, some)
frozen equal (some: ANY; other: like arg #1): BOOLEAN
`some'`other'
ANY
ensure ANY
definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.is_equal (other))
is_equal (other: like Current): BOOLEAN
`other'
ANY
require ANY
other_not_void: other /= Void
ensure ANY
symmetric: Result implies other.is_equal (Current)
consistent: standard_is_equal (other) implies Result
frozen standard_equal (some: ANY; other: like arg #1): BOOLEAN
`some'`other'
ANY
ensure ANY
definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.standard_is_equal (other))
frozen standard_is_equal (other: like Current): BOOLEAN
`other'
ANY
require ANY
other_not_void: other /= Void
ensure ANY
same_type: Result implies same_type (other)
symmetric: Result implies other.standard_is_equal (Current)
feature
conforms_to (other: ANY): BOOLEAN
`other'
ANY
require ANY
other_not_void: other /= Void
same_type (other: ANY): BOOLEAN
`other'
ANY
require ANY
other_not_void: other /= Void
ensure ANY
definition: Result = (conforms_to (other) and other.conforms_to (Current))
feature
put (v: like item; row, column: INTEGER_32)
`v'`row'`column'
require
valid_row: (1 <= row) and (row <= height)
valid_column: (1 <= column) and (column <= width)
feature
copy (other: like Current)
`other'
ANY
require ANY
other_not_void: other /= Void
type_identity: same_type (other)
ensure ANY
is_equal: is_equal (other)
frozen deep_copy (other: like Current)
copy`other'deep_twin
ANY
require ANY
other_not_void: other /= Void
ensure ANY
deep_equal: deep_equal (Current, other)
frozen deep_twin: like Current
ANY
ensure ANY
deep_equal: deep_equal (Current, Result)
frozen standard_copy (other: like Current)
`other'
ANY
require ANY
other_not_void: other /= Void
type_identity: same_type (other)
ensure ANY
is_standard_equal: standard_is_equal (other)
frozen standard_twin: like Current
`other'
ANY
ensure ANY
standard_twin_not_void: Result /= Void
equal: standard_equal (Result, Current)
frozen twin: like Current
`Current'
twincopycopy
ANY
ensure ANY
twin_not_void: Result /= Void
is_equal: Result.is_equal (Current)
feature
frozen default: like Current
ANY
frozen default_pointer: POINTER
`POINTER'
`p'default
`p'`POINTER'
ANY
default_rescue
ANY
frozen do_nothing
ANY
feature
project (point: EV_COORDINATE)
`point'`Current'
rotate (an_angle: like item; a_x: like item; a_y: like item)
`a_x'`a_y'
scale (a_scale_x: like item; a_scale_y: like item; a_x: like item; a_y: like item; an_angle: like item)
`a_x'`a_y'`an_angle'
`a_scale_x'`a_scale_y'
`angle'`a_x'`a_y'
scale_abs (a_scale_x: like item; a_scale_y: like item; a_x: like item; a_y: like item)
`ax'`ay'
`a_scale_x'`a_scale_y'
`ax'`ay'
translate (a_x: like item; a_y: like item)
`a_x'`a_y'
infix "*" (other: like Current): like Current
require
other_not_void: other /= Void
ensure
result_not_void: Result /= Void
feature
io: STD_FILES
ANY
out: STRING_8
ANYtagged_out
ANY
print (some: ANY)
`some'
ANY
frozen tagged_out: STRING_8
ANYout
ANY
feature
operating_environment: OPERATING_ENVIRONMENT
ANY
invariant
area_not_void: area /= Void
ANY
reflexive_equality: standard_is_equal (Current)
reflexive_conformance: conforms_to (Current)
indexing
copyright: "Copyright (c) 1984-2006, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
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 EV_MODEL_TRANSFORMATION