Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage > Class Template Reference
[Image Gradient FiltersSinglethreaded Filters]

Computes the Hessian matrix of an image by convolution with the Second and Cross derivatives of a Gaussian. More...

#include <itkHessianRecursiveGaussianImageFilter.h>

Inheritance diagram for itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >:

Inheritance graph
[legend]
Collaboration diagram for itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >:

Collaboration graph
[legend]
List of all members.

Public Types

typedef HessianRecursiveGaussianImageFilter Self
typedef ImageToImageFilter<
TInputImage, TOutputImage > 
Superclass
typedef SmartPointer< SelfPointer
typedef SmartPointer< const
Self
ConstPointer
typedef TInputImage InputImageType
typedef TInputImage::PixelType PixelType
typedef NumericTraits< PixelType
>::RealType 
RealType
typedef float InternalRealType
typedef Image< InternalRealType,
::itk::GetImageDimension<
TInputImage >::ImageDimension > 
RealImageType
typedef NthElementImageAdaptor<
TOutputImage, InternalRealType
OutputImageAdaptorType
typedef OutputImageAdaptorType::Pointer OutputImageAdaptorPointer
typedef RecursiveGaussianImageFilter<
RealImageType, RealImageType
GaussianFilterType
typedef RecursiveGaussianImageFilter<
InputImageType, RealImageType
DerivativeFilterAType
typedef RecursiveGaussianImageFilter<
RealImageType, RealImageType
DerivativeFilterBType
typedef GaussianFilterType::Pointer GaussianFilterPointer
typedef std::vector< GaussianFilterPointerGaussianFiltersArray
typedef DerivativeFilterAType::Pointer DerivativeFilterAPointer
typedef DerivativeFilterBType::Pointer DerivativeFilterBPointer
typedef TOutputImage::Pointer OutputImagePointer
typedef TOutputImage OutputImageType
typedef OutputImageType::PixelType OutputPixelType
typedef PixelTraits< OutputPixelType
>::ValueType 
OutputComponentType

Public Member Functions

 itkStaticConstMacro (ImageDimension, unsigned int,::itk::GetImageDimension< TInputImage >::ImageDimension)
 itkStaticConstMacro (NumberOfSmoothingFilters, unsigned int,::itk::GetImageDimension< TInputImage >::ImageDimension-2)
void SetSigma (RealType sigma)
virtual void GenerateInputRequestedRegion () throw (InvalidRequestedRegionError)
void SetNormalizeAcrossScale (bool normalizeInScaleSpace)
virtual bool GetNormalizeAcrossScale ()

Static Public Member Functions

Pointer New ()

Protected Member Functions

 HessianRecursiveGaussianImageFilter ()
virtual ~HessianRecursiveGaussianImageFilter ()
void PrintSelf (std::ostream &os, Indent indent) const
void GenerateData (void)
void EnlargeOutputRequestedRegion (DataObject *output)

Detailed Description

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
class itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >

Computes the Hessian matrix of an image by convolution with the Second and Cross derivatives of a Gaussian.

This filter is implemented using the recursive gaussian filters

Definition at line 51 of file itkHessianRecursiveGaussianImageFilter.h.


Member Typedef Documentation

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef SmartPointer<const Self> itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::ConstPointer
 

Reimplemented from itk::ImageToImageFilter< TInputImage, TOutputImage >.

Definition at line 59 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef DerivativeFilterAType::Pointer itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::DerivativeFilterAPointer
 

Pointer to a derivative filter.

Definition at line 117 of file itkHessianRecursiveGaussianImageFilter.h.

Referenced by itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::~HessianRecursiveGaussianImageFilter().

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef RecursiveGaussianImageFilter< InputImageType, RealImageType > itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::DerivativeFilterAType
 

Derivative filter type, it will be the first in the pipeline

Definition at line 105 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef DerivativeFilterBType::Pointer itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::DerivativeFilterBPointer
 

Definition at line 118 of file itkHessianRecursiveGaussianImageFilter.h.

Referenced by itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::~HessianRecursiveGaussianImageFilter().

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef RecursiveGaussianImageFilter< RealImageType, RealImageType > itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::DerivativeFilterBType
 

Definition at line 110 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef GaussianFilterType::Pointer itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::GaussianFilterPointer
 

Pointer to a gaussian filter.

Definition at line 113 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef std::vector< GaussianFilterPointer > itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::GaussianFiltersArray
 

Definition at line 114 of file itkHessianRecursiveGaussianImageFilter.h.

Referenced by itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::~HessianRecursiveGaussianImageFilter().

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef RecursiveGaussianImageFilter< RealImageType, RealImageType > itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::GaussianFilterType
 

Smoothing filter type

Definition at line 99 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef TInputImage itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::InputImageType
 

Pixel Type of the input image

Reimplemented from itk::ImageToImageFilter< TInputImage, TOutputImage >.

Definition at line 63 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef float itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::InternalRealType
 

Define the image type for internal computations RealType is usually 'double' in NumericTraits. Here we prefer float in order to save memory.

Definition at line 80 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef PixelTraits<OutputPixelType>::ValueType itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::OutputComponentType
 

Definition at line 127 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef OutputImageAdaptorType::Pointer itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::OutputImageAdaptorPointer
 

Definition at line 93 of file itkHessianRecursiveGaussianImageFilter.h.

Referenced by itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::~HessianRecursiveGaussianImageFilter().

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef NthElementImageAdaptor< TOutputImage, InternalRealType > itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::OutputImageAdaptorType
 

Output Image Nth Element Adaptor This adaptor allows to use conventional scalar smoothing filters to compute each one of the components of the gradient image pixels.

Definition at line 92 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef TOutputImage::Pointer itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::OutputImagePointer
 

Pointer to the Output Image

Reimplemented from itk::ImageSource< TOutputImage >.

Definition at line 121 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef TOutputImage itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::OutputImageType
 

Type of the output Image

Reimplemented from itk::ImageSource< TOutputImage >.

Definition at line 125 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef OutputImageType::PixelType itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::OutputPixelType
 

Definition at line 126 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef TInputImage::PixelType itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::PixelType
 

Definition at line 64 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef SmartPointer<Self> itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::Pointer
 

Reimplemented from itk::ImageToImageFilter< TInputImage, TOutputImage >.

Definition at line 58 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef Image<InternalRealType, ::itk::GetImageDimension<TInputImage>::ImageDimension > itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::RealImageType
 

Definition at line 82 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef NumericTraits<PixelType>::RealType itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::RealType
 

Definition at line 65 of file itkHessianRecursiveGaussianImageFilter.h.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef HessianRecursiveGaussianImageFilter itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::Self
 

Standard class typedefs.

Reimplemented from itk::ImageToImageFilter< TInputImage, TOutputImage >.

Definition at line 56 of file itkHessianRecursiveGaussianImageFilter.h.

Referenced by itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::~HessianRecursiveGaussianImageFilter().

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
typedef ImageToImageFilter<TInputImage,TOutputImage> itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::Superclass
 

Reimplemented from itk::ImageToImageFilter< TInputImage, TOutputImage >.

Definition at line 57 of file itkHessianRecursiveGaussianImageFilter.h.


Constructor & Destructor Documentation

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::HessianRecursiveGaussianImageFilter  )  [protected]
 

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
virtual itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::~HessianRecursiveGaussianImageFilter  )  [inline, protected, virtual]
 

Definition at line 150 of file itkHessianRecursiveGaussianImageFilter.h.

References itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::DerivativeFilterAPointer, itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::DerivativeFilterBPointer, itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::GaussianFiltersArray, itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::OutputImageAdaptorPointer, itk::ProgressAccumulator::Pointer, and itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::Self.


Member Function Documentation

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
void itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::EnlargeOutputRequestedRegion DataObject output  )  [protected, virtual]
 

Give the process object a chance to indictate that it will produce more output than it was requested to produce. For example, many imaging filters must compute the entire output at once or can only produce output in complete slices. Such filters cannot handle smaller requested regions. These filters must provide an implementation of this method, setting the output requested region to the size they will produce. By default, a process object does not modify the size of the output requested region.

Reimplemented from itk::ProcessObject.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
void itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::GenerateData void   )  [protected, virtual]
 

Generate Data

Reimplemented from itk::ImageSource< TOutputImage >.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
virtual void itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::GenerateInputRequestedRegion  )  throw (InvalidRequestedRegionError) [virtual]
 

HessianRecursiveGaussianImageFilter needs all of the input to produce an output. Therefore, HessianRecursiveGaussianImageFilter needs to provide an implementation for GenerateInputRequestedRegion in order to inform the pipeline execution model.

See also:
ImageToImageFilter::GenerateInputRequestedRegion()

Reimplemented from itk::ImageToImageFilter< TInputImage, TOutputImage >.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
virtual bool itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::GetNormalizeAcrossScale  )  [virtual]
 

Define which normalization factor will be used for the Gaussian

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::itkStaticConstMacro NumberOfSmoothingFilters  ,
unsigned  int,
::itk::GetImageDimension< TInputImage >::ImageDimension-  2
 

Number of smoothing filters.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::itkStaticConstMacro ImageDimension  ,
unsigned  int,
::itk::GetImageDimension< TInputImage >::ImageDimension 
 

Image dimension.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
Pointer itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::New  )  [static]
 

Method for creation through the object factory.

Reimplemented from itk::Object.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
void itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::PrintSelf std::ostream &  os,
Indent  indent
const [protected, virtual]
 

Methods invoked by Print() to print information about the object including superclasses. Typically not called by the user (use Print() instead) but used in the hierarchical print process to combine the output of several classes.

Reimplemented from itk::ImageToImageFilter< TInputImage, TOutputImage >.

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
void itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::SetNormalizeAcrossScale bool  normalizeInScaleSpace  ) 
 

Define which normalization factor will be used for the Gaussian

template<typename TInputImage, typename TOutputImage = Image< SymmetricSecondRankTensor< typename NumericTraits< typename TInputImage::PixelType>::RealType, ::itk::GetImageDimension<TInputImage>::ImageDimension >, ::itk::GetImageDimension<TInputImage>::ImageDimension >>
void itk::HessianRecursiveGaussianImageFilter< TInputImage, TOutputImage >::SetSigma RealType  sigma  ) 
 

Set Sigma value. Sigma is measured in the units of image spacing.


The documentation for this class was generated from the following file:
Generated at Thu May 25 01:07:51 2006 for ITK by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2000