MatrixTransform2x3.st
author Claus Gittinger <cg@exept.de>
Tue, 18 Jul 2000 14:21:06 +0200
changeset 1380 a999c793cd59
parent 1250 76824ea90b46
child 3111 d4e7cc019d23
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
     1
"{ Package: 'stx:libview2' }"
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
     2
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
     3
DisplayTransform variableFloatSubclass:#MatrixTransform2x3
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:''
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Graphics-Transformations'
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
MatrixTransform2x3 comment:'This class represents a transformation for points, that is a combination of scale, offset, and rotation. It is implemented as a 2x3 matrix containing the transformation from the local coordinate system in the global coordinate system. Thus, transforming points from local to global coordinates is fast and cheap whereas transformations from global to local coordinate systems are relatively expensive.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
Implementation Note: It is assumed that the transformation deals with Integer points. All transformations will return Integer coordinates (even though float points may be passed in here).'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
!MatrixTransform2x3 class methodsFor:'instance creation'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
identity
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	^self new setScale: 1.0!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
new
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	^self new: 6!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
transformFromLocal: localBounds toGlobal: globalBounds
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
	^((self withOffset: (globalBounds center)) composedWithLocal:
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
		(self withScale: (globalBounds extent / localBounds extent) asFloatPoint))
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
			composedWithLocal: (self withOffset: localBounds center negated)
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
	^(self identity)
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
		setScale: (globalBounds extent / localBounds extent) asFloatPoint;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
		setOffset: localBounds center negated asFloatPoint;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
		composedWithGlobal:(self withOffset: globalBounds center asFloatPoint)
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
"!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
withAngle: angle
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
	^self new setAngle: angle!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
withOffset: aPoint
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
	^self identity setOffset: aPoint!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
withRotation: angle
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
	^self new setAngle: angle!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
withScale: aPoint
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
	^self new setScale: aPoint! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
!MatrixTransform2x3 methodsFor:'accessing'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
at: index
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    49
"/        <primitive: 'primitiveFloatArrayAt'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    50
"/        ^Float fromIEEE32Bit: (self basicAt: index)
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    51
          ^ self basicAt: index
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    52
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
at: index put: value
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    55
"/        <primitive: 'primitiveFloatArrayAtPut'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    56
"/        value isFloat 
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    57
"/                ifTrue:[self basicAt: index put: value asIEEE32BitWord]
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    58
"/                ifFalse:[self at: index put: value asFloat].
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    59
"/        ^value
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    60
        ^ self basicAt: index put:value
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    61
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
inverseTransformation
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
	"Return the inverse transformation of the receiver.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
	The inverse transformation is computed by first calculating
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
	the inverse offset and then computing transformations
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
	for the two identity vectors (1@0) and (0@1)"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
	| r1 r2 r3 m |
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
	r3 _ self invertPoint: 0@0.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
	r1 _ (self invertPoint: 1@0) - r3.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	r2 _ (self invertPoint: 0@1) - r3.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
	m _ self species new.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
	m
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
		a11: r1 x; a12: r2 x; a13: r3 x;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
		a21: r1 y; a22: r2 y; a23: r3 y.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
	^m!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
offset
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
	^self a13 @ self a23!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
offset: aPoint
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
	self a13: aPoint x asFloat.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
	self a23: aPoint y asFloat.! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
!MatrixTransform2x3 methodsFor:'comparing'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
= MatrixTransform2x3
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    88
        | length |
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    89
"/        <primitive:'primitiveFloatArrayEqual'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    90
        self class = MatrixTransform2x3 class ifFalse:[^false].
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    91
        length _ self size.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    92
        (length = MatrixTransform2x3 size) ifFalse:[^false].
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    93
        1 to: self size do:[:i| (self at: i) = (MatrixTransform2x3 at: i) ifFalse:[^false]].
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    94
        ^true
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    95
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
hash
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    98
        | result |
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
    99
"/        <primitive:'primitiveFloatArrayHash'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   100
"/        result _ 0.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   101
"/        1 to: self size do:[:i| result _ result + (self basicAt: i) ].
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   102
"/        ^result bitAnd: 16r1FFFFFFF
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   103
        result _ 0.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   104
        1 to: self size do:[:i| result _ result + (self basicAt: i) hash ].
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   105
        ^result bitAnd: 16r1FFFFFFF
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   106
! !
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
!MatrixTransform2x3 methodsFor:'composing'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
composedWithLocal: aTransformation
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
	"Return the composition of the receiver and the local transformation passed in"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
	aTransformation isMatrixTransform2x3 ifFalse:[^super composedWith: aTransformation].
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
	^self composedWithLocal: aTransformation asMatrixTransform2x3 into: self class new!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
composedWithLocal: aTransformation into: result
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   116
        "Return the composition of the receiver and the local transformation passed in.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   117
        Store the composed matrix into result."
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   118
        | a11 a12 a13 a21 a22 a23 b11 b12 b13 b21 b22 b23 matrix |
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   119
"/        <primitive: 'm23PrimitiveComposeMatrix'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   120
        matrix _ aTransformation asMatrixTransform2x3.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   121
        a11 _ self a11.                 b11 _ matrix a11.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   122
        a12 _ self a12.                 b12 _ matrix a12.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   123
        a13 _ self a13.                 b13 _ matrix a13.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   124
        a21 _ self a21.                 b21 _ matrix a21.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   125
        a22 _ self a22.                 b22 _ matrix a22.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   126
        a23 _ self a23.                 b23 _ matrix a23.
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   127
        result a11: (a11 * b11) + (a12 * b21).
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   128
        result a12: (a11 * b12) + (a12 * b22).
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   129
        result a13: a13 + (a11 * b13) + (a12 * b23).
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   130
        result a21: (a21 * b11) + (a22 * b21).
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   131
        result a22: (a21 * b12) + (a22 * b22).
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   132
        result a23: a23 + (a21 * b13) + (a22 * b23).
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   133
        ^result
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   134
! !
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
!MatrixTransform2x3 methodsFor:'converting'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
asMatrixTransform2x3
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
	^self! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
!MatrixTransform2x3 methodsFor:'element access'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
a11
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
	^self at: 1!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
a11: value
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
	 self at: 1 put: value!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
a12
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
	^self at: 2!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
a12: value
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
	 self at: 2 put: value!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
a13
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
	^self at: 3!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
a13: value
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
	 self at: 3 put: value!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
a21
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
	 ^self at: 4!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
a21: value
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
	 self at: 4 put: value!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
a22
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
	 ^self at: 5!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
a22: value
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
	 self at: 5 put: value!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
a23
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
	 ^self at: 6!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
a23: value
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
	 self at: 6 put: value! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
!MatrixTransform2x3 methodsFor:'initialize'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
setIdentiy
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
	"Initialize the receiver to the identity transformation (e.g., not affecting points)"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
	self
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
		a11: 1.0; a12: 0.0; a13: 0.0;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
		a21: 0.0; a22: 1.0; a23: 0.0.! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
!MatrixTransform2x3 methodsFor:'printing'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
printOn: aStream
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
	aStream 
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
		nextPutAll: self class name;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
		nextPut: $(;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
		cr; print: self a11; tab; print: self a12; tab; print: self a13;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
		cr; print: self a21; tab; print: self a22; tab; print: self a23;
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
		cr; nextPut:$).! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
!MatrixTransform2x3 methodsFor:'private'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
setAngle: angle
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
	"Set the raw rotation angle in the receiver"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
	| rad s c |
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
	rad := angle degreesToRadians.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
	s := rad sin.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
	c := rad cos.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
	self a11: c.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
	self a12: s negated.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
	self a21: s.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
	self a22: c.!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
setOffset: aPoint
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
	"Set the raw offset in the receiver"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
	| pt |
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
	pt _ aPoint asPoint.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
	self a13: pt x asFloat.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
	self a23: pt y asFloat.!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
setScale: aPoint
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
	"Set the raw scale in the receiver"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
	| pt |
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
	pt _ aPoint asPoint.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
	self a11: pt x asFloat.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
	self a22: pt y asFloat.! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
!MatrixTransform2x3 methodsFor:'testing'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
isIdentity
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   227
        "Return true if the receiver is the identity transform; that is, if applying to a point returns the point itself."
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   228
"/        <primitive: 'm23PrimitiveIsIdentity'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   229
        ^self isPureTranslation and:[self a13 = 0.0 and:[self a23 = 0.0]]
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   230
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
isMatrixTransform2x3
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
	"Return true if the receiver is 2x3 matrix transformation"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
	^true!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
isPureTranslation
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   237
        "Return true if the receiver specifies no rotation or scaling."
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   238
"/        <primitive: 'm23PrimitiveIsPureTranslation'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   239
        ^self a11 = 1.0 and:[self a12 = 0.0 and:[self a22 = 0.0 and:[self a21 = 1.0]]]
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   240
! !
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
!MatrixTransform2x3 methodsFor:'transforming points'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
globalPointToLocal: aPoint
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   245
        "Transform aPoint from global coordinates into local coordinates"
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   246
"/        <primitive: 'm23PrimitiveInvertPoint'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   247
        ^(self invertPoint: aPoint) rounded
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   248
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
invertPoint: aPoint
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
	"Transform aPoint from global coordinates into local coordinates"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
	| x y det a11 a12 a21 a22 detX detY |
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
	x _ aPoint x asFloat - (self a13).
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
	y _ aPoint y asFloat - (self a23).
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
	a11 _ self a11.	a12 _ self a12.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
	a21 _ self a21.	a22 _ self a22.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
	det _ (a11 * a22) - (a12 * a21).
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
	det = 0.0 ifTrue:[^0@0]. "So we have at least a valid result"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
	det _ 1.0 / det.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
	detX _ (x * a22) - (a12 * y).
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
	detY _ (a11 * y) - (x * a21).
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
	^(detX * det) @ (detY * det)!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
localPointToGlobal: aPoint
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   265
        "Transform aPoint from local coordinates into global coordinates"
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   266
"/        <primitive: 'm23PrimitiveTransformPoint'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   267
        ^(self transformPoint: aPoint) rounded
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   268
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
transformPoint: aPoint
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
	"Transform aPoint from local coordinates into global coordinates"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
	| x y |
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
	x _ (aPoint x * self a11) + (aPoint y * self a12) + self a13.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
	y _ (aPoint x * self a21) + (aPoint y * self a22) + self a23.
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
	^x @ y! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
!MatrixTransform2x3 methodsFor:'transforming rects'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
globalBounds: srcRect toLocal: dstRect
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   280
        "Transform aRectangle from global coordinates into local coordinates"
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   281
"/        <primitive:'m23PrimitiveInvertRectInto'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   282
        ^super globalBoundsToLocal: srcRect
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   283
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
globalBoundsToLocal: aRectangle
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
	"Transform aRectangle from global coordinates into local coordinates"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
	^self globalBounds: aRectangle toLocal: Rectangle new!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
localBounds: srcRect toGlobal: dstRect
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   290
        "Transform aRectangle from local coordinates into global coordinates"
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   291
"/        <primitive:'m23PrimitiveTransformRectInto'>
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   292
        ^super localBoundsToGlobal: srcRect
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   293
!
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
localBoundsToGlobal: aRectangle
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
	"Transform aRectangle from local coordinates into global coordinates"
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
	^self localBounds: aRectangle toGlobal: Rectangle new! !
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
!MatrixTransform2x3 class methodsFor:'documentation'!
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
version
1380
a999c793cd59 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1250
diff changeset
   302
    ^ '$Header: /cvs/stx/stx/libview2/MatrixTransform2x3.st,v 1.2 2000-07-18 12:21:06 cg Exp $'
1250
76824ea90b46 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
! !