Affine Transformations of Arbitrary Geometric Objects

- class AffineTransformable a where
- scale' :: AffineTransformable a => RSdouble -> a -> a
- inverseTransform :: AffineTransformable a => Matrix -> a -> a
- withTransformation :: AffineTransformable a => Matrix -> (a -> a) -> a -> a
- transformAbout :: AffineTransformable a => Point3D -> (a -> a) -> a -> a
- translateToFrom :: AffineTransformable a => Point3D -> Point3D -> a -> a
- rotateToFrom :: AffineTransformable a => Vector3D -> Vector3D -> a -> a
- scaleAlong :: AffineTransformable a => Vector3D -> RSdouble -> a -> a

# Documentation

class AffineTransformable a whereSource

`AffineTransformable`

objects are subject to affine transformations using matrix multiplication.

transform :: Matrix -> a -> aSource

Apply an affine transformation, defined by a 4x4 matrix. (This is the only required method.)

scale :: Vector3D -> a -> aSource

Scale an entity along the `x`

`y`

and `z`

axes. For example, `scale (Vector3D 2 3 4)`

will make an object twice as wide, three times as tall,
and four times as deep. It may be helpful to think of the vector as a control point on the vertex of a unit cube.

translate :: Vector3D -> a -> aSource

Translate an entity along the specified vector.

rotate :: Vector3D -> Angle -> a -> aSource

Rotate an entity about the origin, using the specified vector as the axis of rotation.
See also `transformAbout`

to rotate around an arbitrary point.

rotateX :: Angle -> a -> aSource

Specific rotation around the x-axis.

rotateY :: Angle -> a -> aSource

Specific rotation around the y-axis.

rotateZ :: Angle -> a -> aSource

Specific rotation around the z-axis.

AffineTransformable SurfaceVertex3D | |

AffineTransformable Vector3D | |

AffineTransformable Point3D | |

AffineTransformable Matrix | |

AffineTransformable BoundingBox | |

AffineTransformable Ray3D | |

AffineTransformable a => AffineTransformable [a] | |

AffineTransformable (IO a) | The IO monad itself is AffineTransformable. This is done by wrapping the IO action in an OpenGL transformation. |

AffineTransformable a => AffineTransformable (Maybe a) | |

AffineTransformable a => AffineTransformable (Surface a) | |

AffineTransformable a => AffineTransformable (Curve a) | |

(AffineTransformable a, AffineTransformable b) => AffineTransformable (a, b) | |

(AffineTransformable a, AffineTransformable b, AffineTransformable c) => AffineTransformable (a, b, c) |

scale' :: AffineTransformable a => RSdouble -> a -> aSource

Specific scale preserving proportions.

inverseTransform :: AffineTransformable a => Matrix -> a -> aSource

Apply the inverse of an affine transformation, defined by a 4x4 matrix.

withTransformation :: AffineTransformable a => Matrix -> (a -> a) -> a -> aSource

Apply a function under an affine transformation. `withTransformation m id`

is an identity if `m`

is invertable.

transformAbout :: AffineTransformable a => Point3D -> (a -> a) -> a -> aSource

Apply a function treating a particular point as the origin. For example, combining `transformAbout`

with `rotate`

performs a rotation about an arbitrary point rather than the origin.

translateToFrom :: AffineTransformable a => Point3D -> Point3D -> a -> aSource

Specific translation along the vector between two points. This ordinary use is to set the second point as the center of a model (typically origin_point_3d) and the first point as the desired position of the model.

rotateToFrom :: AffineTransformable a => Vector3D -> Vector3D -> a -> aSource

Specific rotation along the shortest path that brings the second vector in line with the first.

scaleAlong :: AffineTransformable a => Vector3D -> RSdouble -> a -> aSource

Specific scale along an arbitary axis.