cs349 - s10 - Lecture 28

# CS349 - Implementing User Interfaces - Spring 2010

## Public Service Annoucements

1. Assignment 3.

# Lecture 28 - Geometry

## A Preliminary to Geometry - Points and vectors

A point is a location in space; what is the difference between two points?

• a vector

Both are designated by two real numbers (in the plane); what's the difference?

• consider translations in the plane
• points change
• vectors don't
• Computer example - addresses and offsets
• offsets are the difference between addresses
• create position independent (relocatable) code by using only offsets.

Thus, we have two kinds of entities, both represented by the same notation. To differentiate

• (x, y, 1) is a point.
• (x, y, 0) is a vector.

Does this make sense?

1. P - P -> V
2. P + V -> P
3. V + V -> V
4. P + P doesn't make sense: it gives (x + x', y + y', 2), which isn't defined
5. aV -> V
6. aP doesn't make sense: it gives (ax, ay, a), which is only defined if a=1..

Important finicky (and practical) point

• The interface we create is, in theory, position independent, but
• to appear on a screen it must be attached to a particular position.
• Thus, when we write
• `DrawRectangle( window, x, y, width, height );`

`window` - indicates the origin to use

`x, y` - is a point at which to start drawing

`width, height` - define vectors that are combined with the starting point to make new points

## Graphical User Interfaces

What does this tell us about graphical user interfaces (more precisely, interfaces that use direct manipulation)?

• doing graphics
• separate DrawRectangle into two parts.
1. a point part to place the first vertex
2. a vector part to get from the first vertex to each subsequent vertex
• separate `click and drag' into two parts
1. a point part to locate the object to be dragged
2. a vector part to update geometry while dragging occurs
• make moving the object a vector operation, which depends on the position of a single reference point
• usually the upper left corner of the enclosing rectangle
• moving the object simply moves the reference point
• implemented in all graphics hardware as bitblt
• analysing input
• Where a gesture starts is a point.
• When the tracker is sampled the n'th time, the vector from sample n-1 to sample n is added to the description of the object.
• The we have its location, the first point, separated from the object, the vectors, which is translationally invariant.
• Remember the special properties of invariances like
• translation,
• rotation
• scaling
for humans.
• Getting gestures in a well-defined geometry means that we can apply them directly to stuff on the display.
• The next few sections show how to do it.

## Vector Geometry

We (for some value of we) know a powerful formalism for manipulating the vector part

• linear algebra
1. rotation
2. scaling
3. reflection
• But, remember that vecors are nowhere, so it doesn't matter where the centre of rotation is.

### Implementing Vector Geometry

What you may or may not have learned in vector geometry

#### Reflection

1. `(x,y) -> (-x,y)`
2. `(x,y,0) -> (-x,y,0)`
3. ```( -1  0 ) (x)   (-x)
(  0  1 ) (y) = ( y)
(       ) ( )   (  )```
4. ```( -1  0  ? ) ( x)   (-x)
(  0  1  ? ) ( y) = ( y)
(  0  0  ? ) ( 0)   ( 0)```

#### Scaling

1. `(x,y) -> (Ax,Ay)`
2. `(x,y,0) -> (Ax,Ay,0)`
3. ```(  A  0 ) (x)   (Ax)
(  0  A ) (y) = (Ay)
(       ) ( )   (  )```
4. ```(  A  0  ? ) ( x)   (Ax)
(  0  A  ? ) ( y) = (Ay)
(  0  0  ? ) ( 0)   ( 0)```

#### Rotation

1. `(x,y) -> (x cos(a) - y sin(a),x sin(a) + y cos(a))`
2. `(x,y,0) -> (x cos(a) - y sin(a),x sin(a) + y cos(a),0)`
3. ```( cos(a) -sin(a) ) (x)   (x cos(a) - y sin(a))
( sin(a)  cos(a) ) (y) = (x sin(a) + y cos(a))
(                ) ( )   (  )```
4. ```( cos(a) -sin(a)  ? ) ( x)   (x cos(a) - y sin(a))
( sin(a)  cos(a)  ? ) ( y) = (x sin(a) + y cos(a))
(  0       0      ? ) ( 0)   ( 0                 )```

### Point Geometry

T0 transform points we need reference locations

1. Reflection: line of reflection: the x-axis
2. Scaling: centre of scaling: the origin
3. Rotation: centre of rotation: the origin

#### Reflection

1. `(x,y,1) -> (-x,y,1)`
2. ```( -1  0  0 ) ( x)   (-x)
(  0  1  0 ) ( y) = ( y)
(  0  0  1 ) ( 1)   ( 1)```

#### Scaling

1. `(x,y,1) -> (Ax,Ay,1)`
2. ```(  A  0  0 ) ( x)   (Ax)
(  0  A  0 ) ( y) = (Ay)
(  0  0  1 ) ( 1)   ( 1)```

#### Rotation

1. `(x,y,1) -> (x cos(a) - y sin(a),x sin(a) + y cos(a),1)`
2. ```( cos(a) -sin(a)  0 ) ( x)   (x cos(a) - y sin(a))
( sin(a)  cos(a)  0 ) ( y) = (x sin(a) + y cos(a))
(  0       0      1 ) ( 1)   ( 1                 )```

#### Translation

Points have one more property: their location with respect to the coordinate system.

• A point changes when we translate it, which is different than a vector.
1. `(x,y,1) -> (x + a, y +b,1)`
2. ```(  1  0  a ) ( x)   (x + a)
(  0  1  b ) ( y) = (y + b)
(  0  0  1 ) ( 1)   (  1  )```

#### TranslationRedundancy check

There are two ways to rotate a rectangle which is away from the origin.

1. Consider it as a collection of points
1. Translate to the origin
2. Rotate at the origin
3. Translate back to where it started
2. Consider it as one point plus a collection of vectors
1. Rotate the vectors

You will find both representations in PostScript because one is sometimes more convenient than the other.

But for making a graphical interface it's usually better to stick to one or the other.

### Graphical User Interfaces

Last lecture we talked about points and vectors, how they transform.

How does this help us make graphical user interfaces (more precisely, interfaces that use direct manipulation)?

Let's think for a minute about assignment 5. What needs to be done?

1. drawing
• using painter's algorithm and Xlib - need to know parameters like x, y, width, height
2. selecting
• depends on an inside test
3. transforming
• translate
• rotate
• rescale
• reflect

Here's how we do it.

1. Base all things you draw on a small number of basic figures, such as
• a standard line running from (0, 0) to (1, 0)
• a standard rectangle with corners at (0, 0), (0, 1), (1, 1), (1, 0)
• a standard ellipse with zero eccentricity (a circle), centred at (0, 0), of radius 1.
• and so on.
2. Use transformations to turn this into any quadrilateral shape
• represent transformations by matrices 3x3
1. translation by dx, dy
• point: (x, y, 1) -> (x + dx, y + dy, 1)
• vector: (x, y, 0) -> (x, y, 0)
• Matrix that does this must do its thing in the bottom row
2. rotation by t
• point: (x, y, 1) -> (x cos(t) - y sin(t), x sin(t) + y cos(t), 1)
• vector: (x, y, 0) -> (x cos(t) - y sin(t), x sin(t) + y cos(t), 0)
• Matrix that does this must do its thing in the 2x2 part.
• point: (x, y, 1) -> (-x, y, 1)
• vector: (x, y, 0) -> (-x, y, 0)
• Matrix that does this must do its thing on the diagonal of the 2x2 part
4. rescale by a along the x-axis
• point: (x, y, 1) -> (ax, y, 1)
• vector: (x, y, 0) -> (a, y, 0)

Matrix that does this must do its thing on the diagonal of the 2x2 part

#### Matrices

The matrices you need (transposed if you like column vectors rather than row vectors)

1. Translation (points only)
```( 1.0    0.0   0.0 )
( 0.0    1.0   0.0 )
( dx     dy    1.0 )```
```(  cos(t)   sin(t)   0.0 )
( -sin(t)   cos(t)   0.0 )
(    0.0      0.0    1.0 )```
3. Scale along the x-axis
```(   a    0.0    0.0 )
( 0.0    1.0    0.0 )
( 0.0    0.0    1.0 )```
```( -1.0    0.0    0.0 )
(  0.0    1.0    0.0 )
(  0.0    0.0    1.0 )

```

These are standard transformations. How do we do more interesting and useful work?

• Make the transformations we want as compositions of the basic transformations
• Examples.
1. Rotation about an arbitrary point.
2. Scaling along an arbitrary direction.
3. Scaling about an arbitrary point and along an arbitrary direction.
4. Reflection in an arbitrary line.

These matrices transform points and vectors. Let's see how we do drawing.

1. Store the standard shape in terms of points and vectors.
2. Know how to draw the standard shape in terms of its points and vectors.
3. Store with it a transformation matrix that turns it into the actual shape.
4. Draw the actual shape using the transformed points and vectors.

And let's see how we do the inside test. (We could just use the transformed points, but there's an easier way to do it.)

1. Fact. The transformations above - when applied to a point and a shape - do not affect whether or not the point is inside the shape.
2. This gives us two options for doing the inside test
1. Transform the standard shape into the point's world, using the transformation matrix stored with the point.
2. Transform the point into the standard shape's world, using the inverse of the transformation matrix.

We prefer the second, because we can choose the standard object so that the inside test is easy.

Therefore store the inverse matrix with the shape, along with the transformation matrix.

Exercises.

1. What is the inverse matrix of each of the basic matrices?
2. How do we multiply inverse matrices?