/*!
\page introduction Introduction to Hugin's source code


This page will give a short overview about some aspects of Hugin's source code.

\section model Panorama Model
   Holds the Panorama state. It contains the following objects:
   - the source images in a vector<HuginBase::SrcPanoImage>
   - the control points in a HuginBase::CPVector
   - the parameters to optimise in a HuginBase::OptimizeVector
   - the output options in PanoramaOptions (mostly the parameters on the stitcher tab)

   In GUI this class should not modified directly. Use instead a command object 
   that inherit from PanoCommand (otherwise it will break undo/redo functionality). 
   Consider it in GUI as read only.

\subsection vecSPI List of SrcPanoImage
   The HuginBase::SrcPanoImage holds all parameter of a single images.
   The access the individual image parameters use the get* and set* methods.

   If you want to modify several parameters in one rush, use a HuginBase::VariableMapVector instead.

\subsection coordTransform Coordination transformation
   If you need to transform coordinates from image to panorama space or vice versa, 
   use HuginBase::PTools::Transform.

   If you want to transform from image to panospace, create the transformation stack
   with HuginBase::PTools::Transform::createInvTransform. If you want to transform
   coordinates from panorama space to the coordinates of a single image use
   HuginBase::PTools::Transform::createTransform. Both require a HuginBase::SrcPanoImage to describe the
   image and a HuginBase::PanoramaOptions to describe the panospace.

   Now you can transfrom the coordinates with HuginBase::PTools::Transform::transformImgCoord. 
   There are some cases, where it is not possible to transform the coordinates, e.g. in rectilinear
   transformation or when the project has non-zero translation parameters. 
   So always check the return value of transformImgCoord, if the transformation could be executed.

   Example
\code
      HuginBase::PTools::Transform trans;
      trans.createInvTransform(srcImage,options);
      trans.transformImgCoord(x_out,y_out,x_in,y_in);
\endcode
   
\section GUI GUI

\subsection HuginGUI Hugin GUI
   The GUI is written using the wxWindows toolkit.  My idea was that
   the gui should not be a monolithic block, but split into smaller
   parts (for example the different tabs in the main frame are a idea
   how the GUI should be split in different panels that will recieve
   notifications when the model changed and will update themselves
   accordingly. These panels can also use the Commands inherited from
   PanoCommand to modify the model. The model should never be changed
   directly. By using PT::PanoCommand and a CommandHistory to execute
   them, it is very easy to implement undo/redo
   functionality. PT::Panorama will notify a PT::PanoramaObserver
   which can then notify the GUI and interested subwindows. MainFrame
   is a good candidate for PT::PanoramaObserver.

   XRC is used for the GUI design. Each custom Panel should have its
   own XRC file, so that people can work with on different parts of
   the GUI without to much trouble. The MainFrame will then use the
   unknown class to load the different custom Panel. CPEditorPanel
   is an example how this can be done. Note that there is only a
   global namespace for all xrc files. Names in the xrc files should
   therefore start with a prefix that indicates the parent panel.

 \subsection PTBatcherGUI
   PTBatcherGUI stores a list of project files in a Batch class.

*/
