By Javier de Sa Souza (sasouza@sinectis.com)
Keywords: Squeak, MathMorphs, Projective Geometry, Linear Algebra,
Geometry.
Abstract: We propose a Projective Geometry framework. Our project lies
over the Linear Algebra objects that were constructed during the MathMorphs
course.
Objetives: We want to represent projective spaces, in particular the
ones that are constructed over linear spaces, such as P(R^n). Finally, we
devised a quite straight forward way to do this.
Specification: With the purpose of modeling projective spaces,
we have added two methods in the linear ambients, one for getting the
projective point associated to a vector (projectiveOf: anObject), and
another one for getting some vector associated a given projective
point (vectorWithProjective: anObject).
Also, we created some classes for projective geometry objects, such as
ProjectiveTuple (homogeneous tuples), ProjectiveSubspace, ProjectiveChart,
ProjectiveBasis and ProjectiveAmbient.
A ProjectiveTuple is a just an homogeneous tuple, i.e. the equivalence class
of a tuple with the following relation: a = b if and only if a is a non null
multiple of b.
A ProjectiveSubspace understands basically the following protocol: dimension,
codimension, basis, asLinearSubspace, includes: anObject, isEmpty,
< aProjectiveSubspace, <= aProjectiveSubspace, = aProjectiveSubspace,
> aProjectiveSubspace, >= aProjectiveSubspace,
intersect: aProjectiveSubapce, + aProjectiveSubspace,
collinear: aProjectiveSubspace, coplanar: aProjectiveSubspace,
skew: aProjectiveSubspace.
A ProjectiveBasis knows some (ordered) projective points, which are called
frame of reference, and a distinguished one which is called unit point.
Once you fix the frame of reference and the unit point of a ProjectiveBasis,
you get a system of coordinates over a projective space. A ProjectiveBasis
understands: frame, unit, coordinatesOf: anObject,
pointWithCoordinates: aProjectiveTuple.
A ProjectiveChart is an object that implements canonic afine coordinate
systems for projective spaces.
A ProjectiveAmbient represents a projective space it self, knows the linear
ambient related to it. Its protocol includes: basis, unit, chart: anInteger,
vectorFromPoint: anObject, pointFromVector: anObject,
coordinatesOf: anObject, pointWithCoordinates: aProjectiveTuple.
There is also an algebra of projective ambients, so a ProjectiveAmbient can
give you its dual, or the space of projective transforms to another space.
Implementation: The default implementation of projectiveOf: anObject,
answers the LinearSubspace generated by anObject, but you can redefine this
method (and vectorWithProjective: too) in concrete subclasses of
LinearAmbient. This is the default implementation done in LinearAmbient:
projectiveOf: anObject
vectorWithProjective: aLinearSubspace
Another example we have done are the ProjectiveTransformations.
A ProjectiveTransformation understands the following protocol:
valueAt: anObject, domain, codomain, image, matrix, inverse, leftInverse,
@ (composition), restrictTo: aProjectiveSubspace,
corestrictTo: aProjectiveSubspace, isCollineation, isProjectivity; and the
nice class method hyperplane: aProjectiveSubspace center: anObject.
If you are looking for implementation details, file in the change set and
use a browser.
Click here to download the change set.
"Answer the homogenization of the argument."
^LinearSubspace
basis: (LinearBasis
new
ambient: self;
add: anObject;
yourself)
"Answer a vector whose homogenization is the argument."
^aLinearSubspace
basis at: 1
Have fun and keep squeaking.