DisplayTransform.st
changeset 1250 76824ea90b46
child 3424 f7fc39b128be
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DisplayTransform.st	Thu Oct 07 00:23:08 1999 +0200
@@ -0,0 +1,146 @@
+Object subclass:#DisplayTransform
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Graphics-Transformations'
+!
+
+DisplayTransform comment:'This class represents a base for generic transformations of 2D points between different coordinate systems (including scaling and rotation). The transformations map objects between one coordinate system and another where it is assumed that a nested hierarchy of transformations can be defined.
+
+It is assumed that transformations deal with Integer points. All transformations should return Integer coordinates (even though float points may be passed in as argument).
+
+Compositions of transformations MUST work in the following order. A ''global'' transformation (the argument in #composedWithGlobal:) is defined as a transformation that takes place between the receiver (the ''local'') transformation and any ''global'' point computations, whereas a ''local'' transformation (e.g., the argument in #composedWithLocal:) takes place between the receiver (''global'') and any ''local'' points. For the transformation methods this means that combining a global and a local transformation will result in the following order:
+
+		globalPointToLocal: globalPoint
+			"globalPoint -> globalTransform -> localTransform -> locaPoint"
+			^localTransform globalPointToLocal:
+				(globalTransform globalPointToLocal: globalPoint)
+
+		localPointToGlobal: localPoint
+			"localPoint -> localTransform -> globalTransform -> globalPoint"
+			^globalTransform localPointToGlobal:
+				(localTransform localPointToGlobal: localPoint)
+
+'!
+
+
+!DisplayTransform class methodsFor:'instance creation'!
+
+identity
+	^self new setIdentity! !
+
+!DisplayTransform methodsFor:'accessing'!
+
+inverseTransformation
+	"Return the inverse transformation of the receiver"
+	^self subclassResponsibility! !
+
+!DisplayTransform methodsFor:'composing'!
+
+composedWithGlobal: aTransformation
+	"Return the composition of the receiver and the global transformation passed in.
+	A 'global' transformation is defined as a transformation that takes place
+	between the receiver (the 'local') transformation and any 'global' point
+	computations, e.g., for the methods
+
+		globalPointToLocal: globalPoint
+			globalPoint -> globalTransform -> localTransform -> locaPoint
+
+		localPointToGlobal: localPoint
+			localPoint -> localTransform -> globalTransform -> globalPoint
+
+		"
+	^aTransformation composedWithLocal: self!
+
+composedWithLocal: aTransformation
+	"Return the composition of the receiver and the local transformation passed in.
+	A 'local' transformation is defined as a transformation that takes place
+	between the receiver (the 'global') transformation and any 'local' point
+	computations, e.g., for the methods
+
+		globalPointToLocal: globalPoint
+			globalPoint -> globalTransform -> localTransform -> locaPoint
+
+		localPointToGlobal: localPoint
+			localPoint -> localTransform -> globalTransform -> globalPoint
+
+		"
+	self isIdentity ifTrue:[^ aTransformation].
+	aTransformation isIdentity ifTrue:[^ self].
+	^ CompositeTransform new globalTransform: self
+							localTransform: aTransformation! !
+
+!DisplayTransform methodsFor:'converting'!
+
+asCompositeTransform
+	"Represent the receiver as a composite transformation"
+	^CompositeTransform new
+		globalTransform: self
+		localTransform: self species identity!
+
+asMatrixTransform2x3
+	"Represent the receiver as a 2x3 matrix transformation"
+	^self subclassResponsibility! !
+
+!DisplayTransform methodsFor:'initialize'!
+
+setIdentity
+	"Initialize the receiver to the identity transformation (e.g., not affecting points)"
+	^self subclassResponsibility! !
+
+!DisplayTransform methodsFor:'testing'!
+
+isCompositeTransform
+	"Return true if the receiver is a composite transformation.
+	Composite transformations may have impact on the accuracy."
+	^false!
+
+isIdentity
+	"Return true if the receiver is the identity transform; that is, if applying to a point returns the point itself."
+	^self subclassResponsibility!
+
+isMatrixTransform2x3
+	"Return true if the receiver is 2x3 matrix transformation"
+	^false!
+
+isMorphicTransform
+	"Return true if the receiver is a MorphicTransform, that is specifies the transformation values explicitly."
+	^false!
+
+isPureTranslation
+	"Return true if the receiver specifies no rotation or scaling."
+	^self subclassResponsibility! !
+
+!DisplayTransform methodsFor:'transforming points'!
+
+globalPointToLocal: aPoint
+	"Transform aPoint from global coordinates into local coordinates"
+	^self subclassResponsibility!
+
+globalPointsToLocal: inArray
+	"Transform all the points of inArray from global into local coordinates"
+	^inArray collect:[:pt| self globalPointToLocal: pt]!
+
+localPointToGlobal: aPoint
+	"Transform aPoint from local coordinates into global coordinates"
+	^self subclassResponsibility!
+
+localPointsToGlobal: inArray
+	"Transform all the points of inArray from local into global coordinates"
+	^inArray collect:[:pt| self localPointToGlobal: pt]! !
+
+!DisplayTransform methodsFor:'transforming rects'!
+
+globalBoundsToLocal: aRectangle
+	"Transform aRectangle from global coordinates into local coordinates"
+	^Rectangle encompassing: (self globalPointsToLocal: aRectangle corners)!
+
+localBoundsToGlobal: aRectangle
+	"Transform aRectangle from local coordinates into global coordinates"
+	^Rectangle encompassing: (self localPointsToGlobal: aRectangle corners)! !
+
+!DisplayTransform class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libview2/DisplayTransform.st,v 1.1 1999-10-06 22:22:58 cg Exp $'
+! !