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
"Answer the homogenization of the argument."
^LinearSubspace
basis: (LinearBasis
new
ambient: self;
add: anObject;
yourself)*

**vectorWithProjective:** *aLinearSubspace
"Answer a vector whose homogenization is the argument."
^aLinearSubspace
basis at: 1*

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.

Have fun and keep squeaking.