diff options
author | Constantin Jucovschi <cj@ubuntu.localdomain> | 2009-04-24 07:20:22 -0400 |
---|---|---|
committer | Constantin Jucovschi <cj@ubuntu.localdomain> | 2009-04-24 07:20:22 -0400 |
commit | 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 (patch) | |
tree | bd328a4dd4f92d32202241b5e3a7f36177792c5f /applications/rview/rview.tex | |
download | rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.tar.gz rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.tar.xz rasdaman-upstream-8f27e65bddd7d4b8515ce620fb485fdd78fcdf89.zip |
Initial commitv8.0
Diffstat (limited to 'applications/rview/rview.tex')
-rw-r--r-- | applications/rview/rview.tex | 1479 |
1 files changed, 1479 insertions, 0 deletions
diff --git a/applications/rview/rview.tex b/applications/rview/rview.tex new file mode 100644 index 0000000..daab380 --- /dev/null +++ b/applications/rview/rview.tex @@ -0,0 +1,1479 @@ +% Documentation for rView +% (C) 1998-2002 FORWISS, Andreas Dehmel + +\def\rview{\textsf{rView}} +\def\rman{\textsf{RasDaMan}} +\def\wxwin{\textsf{wxWindows}} +\def\dollar{\$} % stupid emacs colouring problem with $ +\def\realnumbers{\mbox{I}\!\mbox{R}} + +\documentclass[11pt]{article} +\usepackage{a4wide} +\usepackage{parskip} + +\title{\hrule \vspace{10mm} \Huge rView 2.0\\A visual frontend to the \rman\ DBMS} + +\author{Andreas Dehmel} + +\date{07 Jan 2002} + +\frenchspacing +\sloppy +\setcounter{secnumdepth}{5} +\setcounter{tocdepth}{5} + +\begin{document} + +\maketitle + +\vspace{10mm} +\hrule + +\thispagestyle{empty} + +%\newpage + +\tableofcontents + +\newpage + +\section{Introduction} + +\rview\ is a frontend to the \rman\ DBMS for visualizing multidimensional raster +data and generally making it easier to use the database. It is based on the +freely available, portable \wxwin\ GUI +(\texttt{http://web.ukonline.co.uk/julian.smart/wxwin/}).\\ +No text displayed in any of its windows is hard-coded into the program, instead +it uses labels which are read in on startup and dereferenced at run-time. The +labels are looked up in a file called \texttt{labels.txt} which \rview\ tries to open as +\texttt{\dollar RVIEWHOME/labels.txt} or, failing that, \texttt{./labels.txt}. If +no \texttt{labels.txt} file could be found, all text displayed in \rview's windows +will default to \texttt{???}. The \texttt{labels.txt} file can contain three types of +lines: + +\begin{description} +\item[Empty lines:] only whitespace (space, tabs) +\item[Commentary lines:] a \# Symbol preceded by nothing or whitespace and followed +by any text. +\item[Label definitions:] These have the form "\texttt{\textsl{label}:\textsl{text associated +with label}}". There must be no whitespace between the label and the colon; whitespace +following the colon will not be stripped. Being line-based, label text may not contain +linefeeds, all other characters are legal. +\end{description} + +Configurations are stored in the file \texttt{.rviewrc} which will be looked for in +\texttt{\dollar HOME}, the current directory and \texttt{\dollar RVIEWHOME} in that order. +The current configurations are saved to \texttt{\dollar HOME/.rviewrc} automatically on +exit. The old \texttt{.rviewrc} file (if existent) will be renamed to \texttt{.rviewrc$\sim$} +before being overwritten so in case the new preferences file is corrupted for some +reason the last settings can be easily restored. Serious errors like segmentation violations +are handled by \rview\ and result in any open databases being closed before the program +is aborted. + + +\section{The Main Window} +\label{MainWindow} + +The main window allows you to enter information about a database and open or +close it; furthermore the following menus are available: + +\subsection{The \texttt{File} Menu} + +The \texttt{File} Menu offers functionality that is available even with the +database closed: + +\begin{description} + +\item[Query:] Opens a query shell. See \ref{QueryWindow}. + +\item[Prefs:] Opens the preferences editor. See \ref{PreferencesEditor}. + +\item[Exit:] Exit \rview. If a database was opened, close it first. + +\end{description} + + +\subsection{The \texttt{Viewers} Menu} + +The \texttt{Viewers} Menu allows you to open / close viewers directly: + +\begin{description} + +\item[Open:] Opens a file. Currently this allows you to open TIFF images +and display them in an image viewer window (\ref{ImageDisplayMode}). + +\item[Close all:] Closes all open viewers (\ref{ObjectViewers}) and \texttt{Results} +windows (\ref{ResultWindow}). + +\end{description} + + +\subsection{The \texttt{Collections} Menu} + +The \texttt{Collections} Menu combines operations on database collections. Its +members can therefore only be called once a database has been opened. After +selecting an item a small dialog-window pops up in which you have to enter +the collection name. + +\begin{description} + +\item[Lookup:] Load a collection of objects from the database into client +memory. On success a \emph{Results}-Window containing all the objects +in the collection is opened (see \ref{ResultWindow}). + +\item[LU scaled:] Load a scaled object from the database. On success a viewer +window similar to flat image mode is opened (see \ref{ImageModeScaled}). + +\item[LU ortho:] Load a 3D object from the database into a partial +\emph{Orthosection} viewer (see \ref{ImageModeOrtho}). In contrast, a +full orthosection viewer is available from the \emph{Results} window. + +\item[Create:] Create an empty collection. + +\item[Delete:] Delete a named collection. + +\end{description} + + +\section{The Query Window} +\label{QueryWindow} + +The query window allows you to write and edit database queries as well as load +and save them. On disk, queries are identified by a \texttt{.ql} extension as well +as the headline "\texttt{-- rview-Query}" which will not be displayed in the query +window.\\ +The \texttt{File} menu allows you to \texttt{Open} a query on disk, \texttt{Save} the +current query to disk or \texttt{Close} the query window. The \texttt{Edit} menu +operates on selections, allowing you to \texttt{Cut}, \texttt{Copy} or \texttt{Paste} the +current selection.\\ +The \texttt{List} menu provides a shortcut to all the queries stored in the +directory described by the \texttt{query path} variable (see \ref{PreferencesEditor}). +To achieve this the entire directory is scanned for files named +\texttt{*.ql}. The resulting set of files is then appended to the \texttt{List} menu +in alphabetical order. The \texttt{List} menu is built every time a query +window is opened or a query is loaded from / saved to a different directory. +This behaviour is new in version 1.8, formerly it was only built when a new +query window was opened.\\ +At the bottom of the query editor are three buttons for query control: +\texttt{Clear} deletes the current query and provides you with an empty window. +\texttt{Execute} executes the query (requires an open database). Errors +during execution are reported to the user; the error position is displayed +by selecting the erroneous parts of the query. If the query was executed +without any errors and the resulting collection is not empty, a result window is +opened (see \ref{ResultWindow} for MDD, \ref{ResultStrings} for scalar return +types). \texttt{Update Data} opens a TIFF image for use as \texttt{\dollar 1} argument +in an update query. If a query window has update data associated with it a string +of the form \texttt{q$n_q$d$n_d$} is appended to its title where \texttt{$n_q$} is a +decimal number representing the query window and \texttt{$n_d$} is a decimal number +representing the image viewer. Likewise a string of the form \texttt{d$n_d$q$n_q$} is +appended to the image viewer's title. If a query window or its update data +window is closed this information string is removed from the remaining window's +title bar. If new update data is opened the title bars of the old data viewer and +the query window are updated accordingly. + + +\section{The Preferences Window} +\label{PreferencesEditor} + +The preferences window can be used to configure many aspects of the program. +Its upper part is a scrollable window with the actual configuration items +while the bottom row contains \texttt{OK} and \texttt{Cancel} buttons. Changes +made to the preferences only become active after clicking on the \texttt{OK} +button or pressing \texttt{<return>} in one of the text widgets. Clicking on +\texttt{Cancel} discards all changes made to the preferences since the window +was opened. Preferences are automatically saved when \rview\ is quit. + +\subsection{Misc Prefs} + +\begin{description} + +\item[Pathname of data files:] the full pathname of the directory \rview\ will +use by default when loading / saving images and similar data. This field will +also be updated automatically to the last directory accessed. + +\item[Pathname of query files:] the full pathname of the directory +containing the query files (file extension \texttt{.ql}). This path will also +be updated automatically to the last directory accessed in a query load +or save operation. + +\item[Font used for queries:] here you can specify the font that should +be used in the query windows (\ref{QueryWindow}). Fonts are specified like this:\\ +\begin{tabular}{rcl} +\textsl{font} & = & \lbrack \textsl{keyword} \rbrack * \\ +\textsl{keyword} & = & \textsl{family} $\vert$ \textsl{style} $\vert$ \textsl{weight} $\vert$ \textsl{psize}\\ +\textsl{family} & = & \lbrack decorative $\vert$ default $\vert$ modern $\vert$ roman $\vert$ script $\vert$ swiss $\vert$ teletype \rbrack\\ +\textsl{style} & = & \lbrack italic $\vert$ slant \rbrack\\ +\textsl{weight} & = & \lbrack bold $\vert$ light \rbrack\\ +\textsl{psize} & = & \lbrack 0-9 \rbrack +\\ +\end{tabular} +\\ +where \texttt{psize} is the point-size of the font. The default font is \texttt{default 12}. +Changes take effect the next time a query window is opened. See also \ref{Platforms}. + +\item[Maximum width, Maximum height:] The maximum dimensions of viewer windows. +At the moment this is used to limit the size of an image viewer window (\ref{ImageDisplayMode}). +The size specified here should under no circumstances exceed the screen size. + +\item[Convertor parameters:] parameter string for convertors (TIFF, VFF). This allows +to e.g.\ determine the TIFF compression type (e.g.\ \texttt{comptype=lzw}) or the default +VFF dimension ordering (e.g.\ \texttt{dorder=xyz}). For a list of parameters see the +conversion module documentation. +\end{description} + +\subsection{Images} + +\begin{description} + +\item[Dither images:] This option makes a difference on displays with $\le$ 8bpp only. +When selected, images are converted to the display using error-diffused dithering +instead of a simple match to the closest colour. This results in much better quality +at the expense of speed. Changes take effect the next time an image viewer is opened +or the size of an existing image changes. +\item[Dither best:] If this option is disabled, dithering may not have the highest +possible quality but will be fast enough even for animations. Using \texttt{Dither best} +involves a substantial amount of computational overhead and is therefore \emph{not} +recommended for large images. +\item[RGBSpace:] The default settings for colourspace mapping (see \ref{ColourspaceMapping}). +You can choose between three range models which will be explained in \ref{ColourspaceMapping}, +or switch it off by default. +\item[Edit:] This lets you edit the default settings of the colourspace mapping +(see \ref{ColourspaceMapping}). + +\item[Image mode:] The default mode to use in image viewers. See +\ref{ImageDisplayMode}. + +\item[Movie mode:] The default action to take when a movie has ended. The options are +\texttt{Once} (stop playback), \texttt{Same dir} (restart the movie using the same playback +direction) and \texttt{Switch dir} (switch playback direction). See \ref{ImageDisplayMode}. + +\item[Scaling factor:] The default scaling factor to use when opening a viewer for +scaled images (see \ref{ImageModeScaled}). + +\item[Renderer:] Various settings for the renderers (surface, voxel) in image viewers. +If the \texttt{For type} box is checked the voxel settings specified here (threshold values, +weight quantisation and voxel colours) are ignored and base type specific defaults are used +instead. See \ref{Renderers}. + +\item[Height fields:] Default settings for heightfield rendering. See +\ref{HeightFieldRenderer}. + +\item[Orthosections:] Default settings for orthosection viewers. See +\ref{ImageModeOrtho}. + +\item[Thumbnails:] Default settings for the thumbnail viewers. See +\ref{ThumbnailDisplayMode}. + +\end{description} + +\subsection{Charts} +Default settings for the chart viewer. See \ref{ChartDisplayMode}. + +\subsection{Tables} +Default settings for the table viewer. A value of -1 for \texttt{Step X} and \texttt{Step Y} +means the viewer will make a guess at the grid size depending on the base type of the +object. See \ref{TableDisplayMode}. + +\subsection{Sound} +Default settings for the sound player. See \ref{SoundDisplayMode}. + +\subsection{Communication} + +Settings for the data formats to use for data transfer and data storage. The +transfer data format is always used to send MDD \emph{to} the server. When +loading data from the server, it's normally a suggested format that's used +in case the data is uncompressed, but can also be enforced if the transfer +parameters contain the tuple \texttt{exactformat=1}. The available options are +the same for transfer and storage. If both data formats differ, the data +will be converted in the server to the storage format prior to actual +storage. Usually a light-weight data format should be chosen as transfer +format (e.g.\ \texttt{RLE} or even raw data \texttt{Array}). It's important to +note that no lossy compression scheme should be used for transfering MDD +to the server because the server might have to retile the data, meaning +it'll be decompressed and recompressed with a potential accumulation of +loss. Using a lossy format as storage format only avoids this problem +because the storage format will only be applied to the actual tiles +stored.\\ +The data formats currently available are the following, but they may be extended +any time: + +\begin{description} +\item[Lossless:]\ \\ +\vspace{-6mm} +\begin{description} +\item[Array:] raw data transfer, no compression +\item[RLE:] Run Length Encoding +\item[ZLib:] ZLib compression +\item[SepRLE:] Run Length Encoding with base type separation +\item[SepZLib:] ZLib compression with base type separation +\item[HaarWave:] Haar Wavelet compression +\end{description} +\item[Lossy:] (the numbers shown in the list widget are the filter lengths)\\ +\vspace{-6mm} +\begin{description} +\item[Daubechies*Wavelet:] the standard Daubechies wavelet series +\item[LeastAsym*Wavelet:] the least asymmetric Daubechies wavelet series +\item[Coiflet*Wavelet:] the Coiflet wavelet series +\end{description} +\end{description} + +In addition, the compression algorithms can be configured considerably by +writing parameters as a comma-separated list over primitive tuples of the +form \textsl{keyword=value} into the corresponding parameter window. Newlines +are allowed and there is no length limit on the parameter list. String +values can be written without quotes if they don't contain spaces or commas, +otherwise the string must be embedded in (double) quotes. Currently +available parameters can be seen in figures +\mbox{\ref{FigureParamsComm} -- \ref{FigureParamsZerotree}}. + +\newcommand{\BeginKeyTable}{% + \begin{figure}[hptb]\begin{center}\begin{tabular}{|c|c|c|p{90mm}|}% + \hline% + \textbf{Keyword} & \textbf{Type} & \textbf{Default} & \textbf{Description}\\% + \hline% +} +\newcommand{\EndKeyTable}[2]{% + \hline% + \end{tabular}% + \caption{#1} #2% + \end{center}\end{figure}% +} + +\BeginKeyTable +\texttt{exactformat} & int & 0 & +If \texttt{exactformat} is 0, the transfer format will be used by the server for +data stored in uncompressed format only; it it's $\ne$ 0, the server will always +repack the data to the exact format requested by the client\\ +\EndKeyTable{Keywords for client-server communication}{\label{FigureParamsComm}} + +\BeginKeyTable +\texttt{predinter} & string & --- & +The name of the interchannel predictor which correlates cells across channels +($\rightarrow$ atomic types within structured types). Possible values: +\texttt{delta} (normal difference) and \texttt{scaledelta} (rescale to same +dynamic range, then use difference)\\ +\texttt{predintra} & string & --- & +The name of the intrachannel predictor which correlates cells to its spatial +neighbours. Possible values: \texttt{hyperplane} (predict from previous hyperplane, +e.g.\ previous scanline in a 2D image), \texttt{neighbours} (predict from arithmetic +average of all neighbouring cells already seen) and \texttt{weighted} (additionally +weigh the neighbouring cell values according to their offset in each dimension)\\ +\texttt{intermap} & string & --- & +Comma-separated list of channel mappings of the form +\texttt{\textit{ch-num}:\textit{pred-num}} where \texttt{\textit{ch-num}} is the +number of the channel being mapped and \texttt{\textit{pred-num}} is the number +of the channel it's predicted by. e.g.\ typical for RGB images where green predicts +red and blue: \texttt{0:1,2:1}\\ +\texttt{intralist} & string & --- & +Comma-separated list of channel numbers where intrachannel prediction is used. +If the first character is an exclamation mark, the inverse list is used.\\ +\texttt{hypernorm} & int & 0 & +For intrachannel \texttt{hyperplane} prediction: the number of the dimension +orthogonal to the (moving) predictor hyperplane, i.e.\ the direction in which +prediction takes place\\ +\texttt{predweight} & double & 0.5 & +For intrachannel \texttt{weighted} prediction: the amount by which a cell weight +decreases for each offset $\ne$ 0 in a dimension\\ +\EndKeyTable{Keywords for predictors}{\label{FigureParamsPredict}} + +\BeginKeyTable +\texttt{zlevel} & int & 6 & +The zlib compression level ($0\ldots9$)\\ +\EndKeyTable{Keywords for ZLib compression stream}{\label{FigureParamsZLib}} + +\BeginKeyTable +\texttt{wavestr} & string & \texttt{zlib} & +The compression stream name to use: \texttt{none}, \texttt{rle}, \texttt{zlib} or +\texttt{arith}\\ +\texttt{mrlevels} & int & 0 & +Maximum number of hierarchical levels to do multiresolution analysis on. +0 means all levels\\ +\texttt{banditer} & string & \texttt{leveldet} & +The name of the band iterator. Possible values: \texttt{isolevel}, \texttt{leveldet} +and \texttt{isodetail}\\ +\EndKeyTable{Keywords for wavelets}{\label{FigureParamsWavelet}} + +\BeginKeyTable +\texttt{wqtype} & string & \texttt{zerotree} & +The quantization type to use. Possible values are \texttt{perband} and \texttt{zerotree}. +\texttt{zerotree} is much more efficient regarding storage space but involves rather +much overhead. \texttt{perband} is simpler but compresses worse and is harder to +configure.\\ +\texttt{enhancelv} & int & 0 & +Number of hierarchical levels (starting from coarsest one) over which to enhance +wavelet-coefficients at the boundary (to avoid boundary artifacts at low rates). +0 disables it.\\ +\texttt{qwavdbg} & int & 0 & +Level for debug-version: perform additional statistics during encoding; +higher levels do everything lower levels do. 1: residuum and logarithmic +histogram; 2: linear histogram for all bands; 3: effect of zeroing each +band on signal-to-noise ratio\\ +\EndKeyTable{Keywords for lossy wavelets}{\label{FigureParamsQWavelet}} + +\BeginKeyTable +\texttt{qrtype} & string & \texttt{const} & +The quantizer type (statistics module), setting the bits per band. Values +are \texttt{const}, \texttt{linear}, \texttt{expnt}, \texttt{gauss} and \texttt{custom} +where \texttt{custom} can't be selected directly\\ +\texttt{qntype} & string & \texttt{linear} & +The quantization type, either \texttt{linear} or \texttt{expnt}\\ +\texttt{bitscale} & double & 1.0 & +Set the scaling factor of the bit allocation curve relative to the size of +the base type\\ +\texttt{cutoff} & double & 1.0 & +The band number relative to the total number of wavelet subbands starting +from which all bands are ignored (quantized to 0)\\ +\texttt{nullzone} & double & 0.0 & +Coefficients whose absolute value is smaller than \texttt{nullzone} are set to 0\\ +\texttt{relqbits} & string & --- & +The string is a comma-separated ($\Rightarrow$ the string must be enclosed in +double quotes) list of floating point values, encoding the number of bits +relative to the number of bits in the base type each wavelet band should be +encoded with. Implicitly sets the quantizer type to \texttt{custom}.\\ +\EndKeyTable{Keywords for \emph{perband} lossy wavelet compression}{\label{FigureParamsPerband}} + +\BeginKeyTable +\texttt{zttype} & string & \texttt{band1} & +The type of the zerotree encoding to use. \texttt{band1} is one-pass with a four symbol +alphabet whereas \texttt{band2} is two-pass with dominant pass (four symbol alphabet) and +a subordinate pass (two symbol alphabet).\\ +\texttt{psnr} & double & 100.0 & +The signal-to-noise ratio to use during encoding. Higher values mean better +quality\\ +\EndKeyTable{Keywords for \emph{zerotree} lossy wavelet compression}{\label{FigureParamsZerotree}} + +The \texttt{exactformat} parameter must be added to the parameters for the +transfer format, not the one for the storage format. Transfer- and storage +formats are used like this: + +\begin{center} +\begin{tabular}{|c|p{70mm}|p{50mm}|} +\hline +\textbf{Direction} & \textbf{Transfer format} & \textbf{Storage format}\\ +\hline +Insert & Used for transfer to the server & Used for actually storing the data\\ +\hline +Retrieval & Depending on the value of \texttt{exactformat}: +\begin{itemize} +\item += 0: used for data stored in uncompressed format, ignored for all +other data. +\item +$\ne$ 0: used for all data, repacking on the server if necessary +\end{itemize} +& ignored\\ +\hline +\end{tabular} +\end{center} + +\pagebreak[4] + + +\section{The Results Window} +\label{ResultWindow} + +This window is the starting point for visualizing MDD objects downloaded from +the database as a result of selecting \texttt{Collections->Lookup} from the +main window (\ref{MainWindow}) or executing a query (\ref{QueryWindow}). All +MDD objects are owned by this window, so closing viewers does not remove any +data but the viewers' own from memory. Double-clicking on an entry in the results +list opens a viewer of the type set by \texttt{Display Mode}. Currently available +display modes are + +\begin{description} + +\item[Image modes:]\ \\ +\begin{description} +\item[Flat image] is a 2D mode and means a simple orthogonal projection that works +with data of any dimensionality (see \ref{ImageModeFlat}). +\item[Volumetric] can only be used to visualize volumetric data (i.e.\ 3D) like tomograms. +It consists of two renderer types, a surface-oriented renderer which only displays the +textured surfaces of the data\-cube and is therefore very fast and a voxel renderer that +can also display the inner structure of a data cube at the expense of a substantial amount +of computational overhead. You may switch between these two modes any time (see +\ref{ImageModeVolumetric}). +\item[Orthosection] can only be used to visualize volumetric data which is rendered +as three orthogonal slices with user-configurable thickness through the volume +(see \ref{ImageModeOrtho}). +\item[Height field] is a heightfield renderer that displays arbitrarily dimensioned data as a +shaded 3D heightfield (see \ref{HeightFieldRenderer}). +\end{description} + +\item[Other modes:]\ \\ +\begin{description} +\item[Chart] is a 1D mode that can display data as simple chart diagrams (see +\ref{ChartDisplayMode}). +\item[Table] is the most generic of all modes in that can display data of any +dimensionality and base type as a table of numeric values (see \ref{TableDisplayMode}). +\item[Sound] can be used to play MDD objects as sound samples (see \ref{SoundDisplayMode}). +\end{description} + +\end{description} + +There can only be one open viewer for each object for each display mode, so opening an +object in flat image and height field or chart mode is possible whereas opening two flat +image viewers on one object is not.\\ +There are two menus available here:\\ + +\subsection{Item} + +This menu offers three items: \texttt{Open all} opens viewers of the type specified by +\texttt{Display Mode} for all objects in the results list. \texttt{Thumbnail All} opens +a thumbnail viewer window containing all objects in the results list. \texttt{Close} +closes the results window and all its viewer windows and frees all memory +allocated by the objects in the results list. + +\subsection{Selection} + +The operations in this menu deal with selections of objects. The available menu +items are + +\begin{description} +\item[Select all:] Mark all objects in the collection as selected. +\item[Clear:] Clear the current selection. +\item[Open:] Open the selected objects in the viewer mode specified by \texttt{Display +Mode}. +\item[Thumbnails:] Open a thumbnail viewer containing only the selected objects +rather than the entire collection. +\item[Delete:] Delete the selected objects and thus free the memory allocated to +them. Use this if you're short on memory and only need a part of the collection +for future work. This does not affect persistent objects in the database. +\item[Change Endian:] Changes the endianness of the selected objects. +\item[Type Manager:] Allows you to change the base types of the selected objects +by building new objects consisting only of selected type members. See +\ref{TypeManager}. +\item[Info:] Additional information about the selected objects. Not yet implemented. +\end{description} + + +\subsection{Other options} + +You can also scale the selected objects using the \texttt{Scale/Resample} widgets to the +right of the control field. The writable field contains comma- or space-separated +scaling factors for each dimension. If there are fewer scaling factors than dimensions, +the last scaling factor available will be used for all dimensions that don't have +an explicit scaling factor assigned to them. e.g.\ resampling a 3D object using +\texttt{"2.0"} scales the entire object by 2 in all dimensions, \texttt{"2.0, 3.0, 4.0"} +scales the object by 2 in the first dimension, by 3 in the second and by 4 in the +third while \texttt{"2.0, 1.5"} scales the object by 2 in the first dimension and +by 1.5 in the second and third dimension.\\ +Different algorithms are used for simple scaling, upsampling and downsampling. +Simple scaling just uses nearest neighbours and is therefore very fast. The downsides +are blockiness when scaling up and aliasing when scaling down. Resampling addresses +these problems at the expense of speed. Downsampling averages over subcubes whereas +upsampling performs n-linear interpolation. Therefore care should be taken when +resampling that the scaling factors specified are either all larger or all smaller +than 1.0. Also note that especially upsampling is very time- and memory-consuming. + +\subsection{The Type Manager} \label{TypeManager} + +The Type Manager allows you to build new mdd objects out of existing ones by +copying selected member variables of the source objects only. The Type Manager +can be opened by selecting a menu entry from the \texttt{Results window} +(\ref{ResultWindow}). This will open a new window which graphically represents +the base type of the selected object(s). There is a checkbox for each member +variable; each checkbox is labeled "\textsl{varname} (\textsl{type})" where \textsl{varname} +is the name of the member variable (if available) and \textsl{type} is the type of +this member variable. Structures are recursively grouped together and bounded by +a rectangular box each. The member variables that should be copied into the +newly created object have to be selected using the mouse. If the conversion +is executed and the resulting base type is not known to \rview, the user is +requested to enter a type name. Unless the resulting object is intended to +be written into the database again, the name doesn't matter. \rview's visualization +techniques recognize all atomic types and a structure containing 3 bytes +(interpreted as RGB). + + +\section{Scalar results} \label{ResultStrings} + +If the result of a query is a (collection of) scalar(s) or an interval, +it will be displayed as a scrollable window where each line shows the +string-representation of a value. There are no further operations possible +on results of this type. + + +\section{Object viewers} +\label{ObjectViewers} + +All object viewers share certain basic components which will be explained here before +the individual modes are examined in more detail.\\ +Most importantly there's the projection string which lets you specify the dimensions +to visualize as well as pick areas of interest only rather than the entire object. +The projection string is of the form +\\ + +\begin{tabular}{rcl} +\textsl{projection} & = & $\underbrace{\mbox{\textsl{dim\_desc}}, \ldots , \mbox{\textsl{dim\_desc}}}_{\mbox{\textsl{dimension} times}}$ \\ +\textsl{dim\_desc} & = & \textsl{desc} $\vert$ \textsl{desc:desc} \lbrack\textsl{map\_dim}\rbrack\\ +\textsl{desc} & = & \textsl{coordinate} $\vert$ *\\ +\textsl{coordinate} & = & \lbrack 0-9 \rbrack +\\ +\textsl{map\_dim} & = & \lbrack 0-9 \rbrack +\\ +\end{tabular} + +where * and *:* are synonymous, meaning the entire range of this dimension. If +$\mbox{\textsl{dim\_desc}}_i$ is of the form \textsl{coordinate} a projection to this coordinate in +dimension $i$ is performed; dimension $i$ is a \emph{fixed dimension}. If +$\mbox{\textsl{dim\_desc}}_i$ is of the form \textsl{desc:desc} this is interpreted as \textsl{low:high} +pair of coordinates in dimension $i$ and the entire range between \textsl{low} and \textsl{high} +is selected; dimension $i$ is a \emph{free dimension}. The optional addition of \textsl{map\_dim} +in square brackets allows re-ordering dimensions in \emph{some modes} (e.g.\ flat images and +tables); in this case \textsl{map\_dim} is the number of the dimension that should be associated +with this interval, starting from 0. This mechanism allows things like transposing. If the +number of free dimensions is not equal to the dimensionality of the display mode an error +in the projection string is reported.\\ +\textbf{Examples:} Assuming a 3D-object with the spatial domain +\lbrack 0:200, 100:400, 200:600 \rbrack\ the following projection strings result in \ldots\\ + +\begin{description} +\item[*:*, *:*, *:*] -- Everything (3D). +\item[0, *:*, *:*] -- A projection to 0 in the first dimension and all data in the other +two dimensions, i.e.\ an object [100:400, 200:600] (2D). +\item[0, 200, *:*] -- A projection to 0 in the first and 200 in the second dimension, +all data in the third dimension (1D). +\item[100:150, *:300, 300:*] -- The coordinates 100 to 150 in the first dimension, +100 to 300 in the second dimension and 300 to 600 in the third dimension (3D). +\item[0, *:*\lbrack 2\rbrack, *:*\lbrack 1\rbrack] -- Like the 2nd example but transposed, +i.e.\ an object [200:600, 100:400]. +\end{description} + +Pressing \texttt{<return>} in the projection string widget or clicking on the \texttt{OK}-button +next to it updates the display accordingly. If there is at least one fixed dimension, clicking +on the + and - buttons increases or decreases the value of a fixed dimension, allowing you +to move through a datacube along a given axis. If there is more than one fixed dimension, +the writable field between the + and - buttons can be used to specify which one should +be affected by the + and - buttons. Enter the number of the dimension along which you want +to move here, starting from 0.\\ +\\ +All but the thumbnail viewers (see \ref{ThumbnailDisplayMode}) also provide the following +menu entries, listed under \texttt{Data}: + +\begin{description} +\item[Insert:] Insert the entire object into the database. This will pop up a +dialog box asking you for the name of the collection the object should be stored in. + +\item[Insert proj:] Insert the object's current projection only into the +database. + +\item[Save:] Save the raw MDD to disk. The resulting file is just the array data +without any spatial information, therefore this option should only be used on +1-dimensional data, e.g.\ TIFF-encoded images. + +\item[Close:] Close the viewer. + +\end{description} + +Additionally, all but the thumbnail viewer have a \texttt{View} menu with at +least two entries \texttt{Load} and \texttt{Save}. A "view" contains all meta +information required to visualize the current MDD as it is displayed in the +viewer's visualization area, e.g.\ renderer configuration, colourspace mapping +parameters, current rotation etc.; this meta information can be saved to and loaded +from a file with these two menu entries. A view is specific to one viewer type, +so a volumetric viewer's view file can not be loaded into a height field renderer. +Views can be used to easily memorize efficient visualization parameters for later +use (such as a good viewing angle for voxel rendering), or for visualizing the +effects of signal processing algorithms on an MDD as a sequence of images of the +same size/rotation/lighting/$\ldots$.\\ +Note that a view may contain very MDD-specific properties, such as the +MDD's numeric range used by the colourspace mapper or the spatial extent +for the projection string. Therefore a view should only be used for either +the same MDD or MDD with sufficiently similar properties, otherwise unwanted +side-effects may occur.\\ +Most modes also offer additional menus for specific features, such as saving the +current visualization to a TIFF image, or displaying the current rotation +numerically.\\ +Now follows a detailed description of the currently available display modes. + + +\subsection{Image viewers} +\label{ImageDisplayMode} + +The image display modes are the primary modes for graphical representation of MDD +objects. Next to simple orthogonal projections for displaying 2D images it also +includes 3D renderers which are described in more detail in \ref{Renderers}.\\ +There are various additional menus in this mode. \texttt{Data} contains the new +entry \texttt{Save TIFF} which saves the currently visible image to disk as a TIFF file. +The \texttt{Settings} menu contains configuration options dependent on the image +mode. The one entry available in all modes is the \textbf{Colourspace} menu, see +\ref{ColourspaceMapping}. Another possible entry, \textbf{Movie playback}, is +shared in flat and height field modes (sections \ref{ImageModeFlat}, +\ref{HeightFieldRenderer}) and allows the following choices on what to do +when the end of the movie has been reached (using \texttt{a = \textsl{start}} and +\texttt{b = \textsl{end}} of the movie): + +\begin{description} +\item[Once:] Just stop playback. +\item[Same direction:] Rewind the movie and restart using the same playback direction, +thus the sequence is \texttt{a $\rightarrow$ b, a $\rightarrow$ b, $\ldots$} or +\texttt{b $\rightarrow$ a, b $\rightarrow$ a, $\ldots$}, depending on the initial playback +direction. +\item[Switch direction:] Switch playback direction so the movie oscillates between +end-points and the sequence is \texttt{a $\rightarrow$ b, b $\rightarrow$ a, $\ldots$} or +\texttt{b $\rightarrow$ a, a $\rightarrow$ b, $\ldots$}, depending on the initial playback +direction. +\end{description} + +Movie mode is possible whenever the dimensionality of the MDD object exceeds the +dimensionality of the visualization mode (both flat and height field images are 2D, +therefore movies are possible if the MDD object has dimensionality three or higher). +The actual movie playback can be controlled with additional buttons created below +the projection string's +/- buttons. These new buttons, +which can only be used in \texttt{Flat} and \texttt{Height} mode, behave like auto-repeating ++/- buttons and allow displaying a datacube as a movie. "$<$" corresponds to "-" +and "$>$" corresponds to "+". In case of more than one free dimension the same +rules apply that are used for the +/- buttons (see \ref{ObjectViewers}). + +In all image modes except for the one for scaled images (see \ref{ImageModeScaled}) you +can mark a rectangle by dragging its outline while holding down the \texttt{ctrl} key. +The pixel coordinates of the dragged box relative to the upper left corner of the image +will be displayed in the upper left corner of the box in the format +$x_{low}:x_{high}, y_{low}:y_{high}$. Using the left mouse button for the +drag will always start a new box, using the right mouse button will adjust the size of +the existing box by moving the nearest corner to the position of the mouse pointer. To +remove the box simply click inside the image with the \texttt{ctrl} key held down. + + +\subsubsection{Flat Images} \label{ImageModeFlat} + +This mode visualizes orthogonal 2D projections of the MDD object. There are no +restrictions on dimensionality, but only two dimensions can be displayed +simultaneously. The scale slider can be used to scale the image by any factor +between 0\% and 500\% using a simple nearest neighbour algorithm which is +much faster than the resampling procedure available in the Results window +(\ref{ResultWindow}) but also of considerably worse quality. The size of the image +and hence the redraw time is determined by the size given by the projection string +times the scaling factor and is therefore independent of the view window size. +Flat mode is the recommended viewing mode for actual 2D images or movies +whereas for 3D data one the the volumetric renderers is the better choice +(see \ref{ImageModeVolumetric}). +%In flat mode the orientation of the horizontal axis is from top-to-bottom. + + +\subsubsection{Scaled Images} \label{ImageModeScaled} + +This class is very similar to flat images (see \ref{ImageModeFlat}) in that it +performs orthogonal 2D projections of the MDD object. This mode is intended +for very large MDD objects that are only transfered in part and/or scaled down +from the server but never reside in client memory in their entirety. Hence there +is no scale slider nor movie controls.\\ +In contrast to the other image modes, a box is dragged without holding down the +\texttt{ctrl} key and the dragged box will always have the same aspect ratio +as the visible image. The available functionality is represented by four buttons +below the projection string, + +\begin{description} +\item[To Box:] scale up the image within the dragged box to fill the entire +area currently visible. +\item[Back:] return to the previous view. +\item[Zoom In:] magnify the currently visible image by 2 without changing the +size of the resulting image, i.e.\ the area of the unscaled image covered by the +new view is only $\frac{1}{4}$th that of the original view. The upper left corner +remains the same for both views. +\item[Zoom Out:] the inverse operation of \texttt{Zoom In}. The visible image +of the new view can become smaller than in the previous view, however. +\end{description} + +A \emph{view} comprises all meta data that uniquely identifies a visualization +of an MDD object, i.e.\ a scaling factor, a bounding box (n-D interval) and +the two free dimensions. Whenever either parameter is changed, the currently +active view is saved on a stack before the new view is activated. Pressing the +\texttt{Back} button retrieves just this meta data from the stack in client memory +whereas the corresponding data is reloaded from the \rman\ server; except for +the view meta data no data is cached by \rview. There is no limit on the depth +of the view stack.\\ +Note that the projection string is for the entire, unscaled object, whereas the +drag box coordinates are relative to the current view. Any changes to the projection +string will be translated to the current view before they're applied. Also, +changing the projection string equals the definition of a new view and +stacking of the previous one. + + +\subsubsection{The Renderers} +\label{Renderers} + +For the various renderers, some new functionality is available in the viewer +window. The \texttt{BBox} checkbox determines whether the renderer should draw the object's +bounding box as well. Also there are two new menu entries in the \texttt{Settings} +menu: + +\begin{description} +\item[Renderer:] Allows changing parameters needed by the 3D renderers. See +\ref{RendererModel}. +\item[Renderer controls:] Allows animating rendered images by continuous +rotation (see \ref{RendererControls}). + +\end{description} % settings menu + +Renderers also have an additional entry \texttt{Show} in the \texttt{View} menu +which displays the current rotation matrix, z-offset and scale in a small window. +The rotation matrix ($3\times 3$) is represented by three rotations around the +coordinate axes, first $x$, then $y$, then $z$; the angles are in units of $\pi$ +rather than degrees. All entries in this window can also be altered manually.\\ +The renderers always use an image the size of the view window, so it's not a good +idea to make the view window substantially larger than the area covered by the +object's bounding box, because although the renderers don't operate outside the +object's bounding box the image will be larger than necessary and therefore take +longer to display, in particular when the display is remote over a network. + +\paragraph{Renderer Basics} \label{RendererModel} % hardspace to make linefeed possible +\ \\ +First let's specify the coordinate system: x is the +horizontal axis, oriented left to right, y is the vertical axis, oriented bottom to +top and z is the depth axis (parallel to the screen normal), oriented into the screen. +The observer is at position $(0, 0, 0)$ where the line $(0, 0, x)$ is projected to +the pixel in the image center. All renderers use perspective projection of +the data cube to the \emph{projection plane}, a plane parallel to the screen surface +that intersects the z-axis at position $(0, 0, z_p), \quad z_p > 0$. The value of $z_p$ +determines how much effect perspective projection will have, i.e.\ how quickly an object +gets smaller as its $z$ component increases. The smaller the value of $z_p$ +the higher the impact of perspective projection. Values between $256$ and $512$ +generally produce good results, with larger values recommended for large objects. +The value of $z_p$ can be changed in the \texttt{Image settings} window which is +opened by selecting the \texttt{Settings $\rightarrow$ Renderer} menu available +in the image viewer.\\ +Parts of the data cube lying too close to (or even behind) the viewer can't be +rendered, therefore the cube has to be clipped. In order to do this the intersection +of the cube with the \emph{clipping plane} has to be calculated. The clipping plane +is a plane parallel to the projection plane, intersecting the z-axis at position +$(0, 0, c_z), \quad c_z > 0$. In effect the cube is "cut open" so data formerly inside the +cube will be mapped to the new surface. Generally speaking, the value of $c_z$ should +be smaller than $z_p$. Values in the area of $\frac{z_p}{2}$ give good results, but +if you want to slice through the cube without moving it closer to the viewer this +can be achieved easily by incrementing the value of $c_z$ in the \texttt{Image +Settings} window.\\ +Using the \texttt{Scale} slider scales the data cube itself, not the rendered +image which means that you can also get z-clipping effects by scaling the +cube. It also means that you still get smooth edges in an upscaled renderer +display and the texels aren't as noticable as their edges are parallel +to the data cube's edges rather than parallel to the coordinate system.\\ +You can switch on/off lighting in the \texttt{Image settings} window; currently +this will only have an effect in voxel mode. Let $l$ be the normalized vector +from the voxel to the light source, $n$ the outward-oriented surface normal and +$\alpha$ the angle between the two ($\cos\alpha = l \cdot n$). Furthermore let +$\beta$ be the \emph{light angle} and $\gamma$ the \emph{scintillation angle} +specified in the \texttt{Image settings} window; both describe the range of angles +$\alpha$ for which the corresponding parameter should have any effect: + +\begin{center} +\begin{tabular}{rlrl} +$\lbrack \beta, 180 \rbrack$ & ambient light only & $\lbrack \gamma, 180 \rbrack$ & no scintillation \\ +$\lbrack 0, \beta )$ & ambient light + shading & $\lbrack 0, \gamma )$ & scintillation \\ +\end{tabular} +\end{center} + +One way to express this with normalized weighting factors would be + +\begin{displaymath} +w_l(\alpha,\beta) = \left\lbrace\begin{array}{rl} +\frac{\cos\alpha - \cos\beta}{1 - \cos\beta} & \mbox{if} \cos\alpha > \cos\beta\\ +0 & \mbox{otherwise}\\ +\end{array} \right. , \qquad +w_s(\alpha,\gamma) = \left\lbrace\begin{array}{rl} +\frac{\cos\alpha - \cos\gamma}{1 - \cos\gamma} & \mbox{if} \cos\alpha > \cos\gamma\\ +0 & \mbox{otherwise}\\ +\end{array} \right. +\end{displaymath} + +Note that values greater than 90 (degrees) for $\beta$ or $\gamma$ are unphysical; +they do help to bring out details in dark areas, however. It is advisable to +decrease the level of ambient light when increasing the light angle. +Using these weighting factors a voxel is shaded according to the equation +\begin{displaymath} +pixel = voxel \cdot (amb + w_l(\alpha,\beta) \cdot (1 - amb)) + voxel_{grey} \cdot gain \cdot w_s(\alpha,\gamma). +\end{displaymath} +The $amb$ parameter determines the level of ambient light and should be in the +interval \hbox{\lbrack 0, 1\rbrack} where 0 means no ambient light (surfaces not hit +by the light source are totally black) and 1 means full intensity provided by ambient +light (which is equivalent to shading off). The first part of the formula thus +performs a darkening of the actual voxel colour by giving it a base intensity +determined by $amb$ and additional intensity depending on the surface orientation. +$voxel_{grey}$ is the greyscale value associated with the voxel colour which, +when multiplied by $w_s(\alpha,\gamma)$, produces a shaded greyscale version of the voxel, +so the second part of the formula adds a weighted version of the shaded greyscale +voxel scaled by $gain$ to the shaded voxel. The $gain$ parameter has to be $\ge 0$ and the +higher it is the brighter those surfaces where $\alpha < \gamma$ will become. This +also influences the actual colour of a voxel by forcing a shift towards white the +more directly the voxel is facing the light source.\\ +The position of the light source is described by the \texttt{Direction} and \texttt{Distance} +fields in the \texttt{Image settings} window. The possible directions are encoded as a string +consisting of arbitrary combinations of direction aliases or $\epsilon$ (the empty +word) for each dimension. Those aliases are \texttt{l, r} (left, right) for the first dimension, +\texttt{d, u} (down, up) for the second dimension and \texttt{f, b} (front, back) for the +third dimension. Only one direction alias may be specified for each dimension, so \texttt{l} +and \texttt{r} are mutually exclusive. Thus the direction string lets you specify the +26 vertices on the surface of a 3D cube bisected in each dimension through its center +(plus the 27th vertex +in the center, but that choice wouldn't be very sensible). Examples would be \texttt{ur} +(corresponding to $(1,1,0)^T$), \texttt{uf} ($(0,1,-1)^T$) or \texttt{dlb} ($(-1,-1,1)^T$). +Use the \texttt{Distance} field to determine at which distance from the origin along the +direction vector the light source should be situated.\\ +For more tuning parameters regarding normal approximation see section \ref{VoxelRenderer} +about the voxel renderer. + +\paragraph{Navigating} \label{RenderNavigation} +\ \\* +The data cube can be rotated by moving the mouse while holding down the left +mouse button. Moving the mouse horizontally rotates around the y-axis (positive +angles by moving to the right), moving the mouse vertically rotates around the +x-axis (positive angles by moving to the bottom). This system may be improved +to something more intuitive in the future.\\ +The cube can be moved along the z-axis by moving the mouse vertically while +holding down the right mouse button. Moving upwards brings the cube closer +to the viewer while moving downwards takes to object further away. + +\paragraph{The Renderer Controls} \label{RendererControls} +\ \\* +This window is opened using the \texttt{Settings $\rightarrow$ Renderer Controls} menu +in an image viewer and makes it possible +to animate rendered images. The window consists of three sliders representing the +three rotation axes with a button labeled "0" to the right of each. Clicking on one of +the "0" buttons resets the corresponding slider to 0, thus terminating rotation around +that axis. Rotation starts when you click the lower left button labeled \texttt{Start} which +will then change to \texttt{Stop}. The slider values can be changed at any time, even +after animation has been started; dragging the cube directly with the mouse is +still possible when animation is in progress, too. You can stop the animation by clicking +on the \texttt{Stop} button in the \texttt{Renderer controls} window or by clicking on the +button labeled \texttt{\lbrack \rbrack} in the image viewer window which is also used +for stopping movie playback. + +\paragraph{Volumetric renderers} \label{ImageModeVolumetric} +\ \\ +The volumetric renderers can only handle 3D data with base type sizes of 1 to 4 or +8 bytes where base types of size 4 may be \texttt{long} or \texttt{float} and a base type +of size 8 is interpreted as double. Two volumetric renderers are combined in +one image viewer and the user may freely switch between modes by using the new +menu \texttt{Modes}. The third is an orthosection viewer (see \ref{ImageModeOrtho}) +which is uses a separate window. + +\subparagraph{Surface renderer} \noindent \label{SurfaceRenderer} +\ \\* +The surface renderer only visualizes the surfaces of the data cube by texture-mapping +the data on the cube's surface to the polygons representing it (which may be +rotated and scaled in any way). While this is very fast it has the drawback that +data inside the cube can not be visualized at all unless z-clipping is applied +to the cube (see the basic model). This mode is recommended for rotating or +positioning the cube before switching to a better but more time-consuming +mode like the voxel renderer, for instance. It's also the mode of choice for +data where not all three dimensions are spatial (e.g.\ movies). + +\subparagraph{Voxel renderer} \noindent \label{VoxelRenderer} +\ \\* +The voxel renderer is recommended for visualizing data where all three dimensions +are spatial (i.e.\ volume data). Data is visualized by casting rays through +the volume and calculating the frontmost intersection of each ray with a +non-empty pixel. In order to get good results over a wide range of input +data a lot of configuration options are available in the \texttt{Renderer} +menu.\\ +A few definitions first: an \emph{empty pixel} is one whose value lies outside +the threshold interval +$$ti = \lbrack pixel\_threshold\_low, pixel\_threshold\_high \rbrack .$$ +These threshold values are base type dependent; if you specified \texttt{For mode} +in the preferences window, \rview\ tries to find sensible defaults for these +parameters, depending on the type, otherwise the values given in the preferences +are used. A special case is the RGB base type where there are two thresholding +models: a pixel is interpreted as empty if all its colour components are outside +the threshold interval (\texttt{RGB brightness} off) or it's considered empty if the +average of its colour components is outside the threshold interval +(\texttt{RGB brightness} on).\\ +Since data obtained by computer tomograms and similar techniques usually +includes a fair amount of noise the naive approach of simply using the +frontmost non-empty pixel intersected by the ray usually doesn't produce +any meaningful results. What's needed is some kind of averaging procedure that +makes the ray penetrate deeper into the data until a weight criterium is met +and then average over the non-empty pixels that were intersected. Simply +adding these pixel values produced poor results as well, however. A technique +that gave very good results was first calculating a weight for each pixel +using the formula $w = \vert \frac{v + 2^q - 1}{2^q} \vert$ for integers and +$w = \vert \frac{v}{2^q} \vert$ for floating point types, where $v$ is the +pixel value (in RGB mode this is the average of the colour components) and $q$ +is the \emph{weight quantisation}. Thus the weight is proportional to the pixel +value and inversely proportional to $2^q$. The weighted sum of pixels $s$ is updated +using $s = s + w*p$ where $p$ is the pixel value; note that in RGB mode $s$ and +$p$ are 3D vectors over the RGB colourspace. Since $w$ was proportional +to $v$ the update value is proportional to $v^2$, i.e.\ "brighter" pixels have +a much stronger influence on $s$ than "darker" ones. Additionally the sum of +weights $n$ is updated using $n = n + w$. If $n$ overflows the \emph{weight +threshold} $w_{max}$, the ray is terminated and the pixel value used in this +position is $\frac{s}{n}$, otherwise the search for the next non-empty pixel +continues. If there are no more non-empty pixels and the pixel value $\frac{s}{n}$ +computed so far is bigger than the lower pixel threshold, this pixel value is +used, otherwise the pixel is considered transparent.\\ +Summarizing: $q$ determines how much the weight is correlated with the pixel +value where small values of $q$ mean a strong dependence and large values +a weak dependence (since +$\lim_{q \longrightarrow \infty}{\vert \frac{v + 2^q - 1}{2^q} \vert} = 1$ and +$\lim_{q \longrightarrow \infty}{\vert \frac{v}{2^q} \vert} = 0$, both of which +are monotonous decreasing in $q$). +The default value of 4 gives good results with most tomograms. The weight threshold +$w_{max}$ determines how far the ray will penetrate into the volume. If that +value is too small, normally invisible noise will prematurely abort the ray and +thus have a noticable effect on the display (seemingly random, dark blotches instead +of a smooth surface). Another problem is that typically the pixel colour doesn't +change rapidly from one pixel to its neighbour but rather slowly over a number +of pixels, so for instance a white object on a black background is usually surrounded +by several layers of grey-level pixels. When $w_{max}$ is too small the ray will stop +in those grey-levels rather than in the white object. Trying to remedy this by just increasing +the lower pixel threshold doesn't work well and even with large values the results +still look poor. So if you can't see far enough into the cube you should first try +increasing $w_{max}$. If $w_{max}$ is too large, on the other hand, you get an x-ray +effect where the entire object becomes transparent. Also note that the further the +ray penetrates into the volume the longer the rendering takes.\\ +If you're using lighting there are some more tuning parameters available from the +\texttt{Image settings} window in the voxel section which deal with normal approximation, +namely \texttt{Kernel size} and \texttt{Kernel type}. The kernel is a symmetric +function that will be folded with the sample values, thus producing a smoothed +normal vector that can compensate for sample noise. The kernel type determines how +this smoothing is performed. \texttt{Average} gives each sample the same weight, the other +two are functions over the distance $d$ (L$_2$-norm) of a cell from the kernel center. +\texttt{Linear} is the function $1 - \frac{d}{s \sqrt{3}}$ and \texttt{Gauss} is the function +$e^{-\frac{d}{2}}$ where $s$ is the kernel size.\\ +The kernel size parameter is the maximum distance of a point in the kernel from the +kernel center using the L$_{\infty}$ norm. Therefore a kernel size of $n$ results in a +kernel cube of size $(2n + 1)^3$. A kernel size of 0 means no smoothing (and hence the +kernel type is irrelevant), the normal is approximated directly from the sample values, +therefore this mode produces very bad results with noisy data. For typical samples a +kernel size of 1 or 2 is much more recommended, although the rendering will take +substantially longer due to the kernel cube's size (27 cells for a kernel size of 1, +125 cells for a kernel size of 2). In theory the normal vectors could be cached, however +this would require 12 bytes of storage for each cell, so a greyscale tomogram of size +10MB would require 120MB for the normal vector field which seems excessive.\\ +One problem when shading volumetric data is that the entire image tends to darken +considerably. This is a problem especially when plotting isosurfaces. To overcome +this limitation there's the option to ignore the voxel colours and assign the same +intensity to each voxel instead, which should be a bright colour (e.g.\ white); in this case +the sample values are only used to approximate the object's surface but not for texturing +it as well. Of course this only makes sense when shading is active since otherwise only +the object's outline could be seen, therefore this option is ignored with lighting +deactivated. The colour to assign to each voxel can be specified in the \texttt{Voxel colour} +field; this is a floating point number in order to be able to handle all base types. +The default value of this parameter depends upon the setting of +\texttt{For mode} in the preferences window (i.e.\ when on \rview\ tries to find a sensible +default for the MDD's base type). A value of 255 for a greyscale image is pure white, +for instance. A more complicated example is RGB: in that case the colour is encoded as +a number with the red component in bits 0-7, the green component in bits 8-15 +and the blue component in bits 16-23, so red is 255, green is 65280, blue is +16711680 and pure white (the default) is 16777215. Alternatively you can specify +the voxel colour as a hexadecimal value starting with a \texttt{0x} prefix which is +easier for selecting RGB colours (e.g.\ \texttt{0xff00} for green).\\ +\emph{Tuning}: bad image quality when rendering with lighting is usually the cause of the +kernel size being too small or the pixel/weight threshold values being wrong. If the +ray doesn't penetrate deep enough you get the aliasing effects described above. If +on the other hand the ray penetrates too deep the surface normal will get approximated +wrongly because the ray terminated a substantial distance away from the actual surface. +If the image is too dark you should try ignoring the voxel colour and using a very +bright default colour instead. Only experimentation will result in the best compromise of all +parameters.\\ +Examples:\\ +For \texttt{tomo\_cubed} use \texttt{pixelThresholdLow = 16}, \texttt{weightThreshold = 16} and +\texttt{kernelSize = 2}. When ignoring the voxel colours set \texttt{lAngle = 180}, +\texttt{Ambient = 0} and \texttt{Gain = 0.5}. For \texttt{frog\_cubed} set \texttt{pixelThresholdLow = 32}, +\texttt{weightThreshold = 8} and \texttt{kernelSize = 2}. When ignoring the voxel colours set +\texttt{lAngle = 180}, \texttt{Ambient = 0.0} and \texttt{Gain = 0.0}. + + +\subparagraph{Orthosection renderer} \label{ImageModeOrtho} +\ \\ +This viewer mode renders volume images as three orthogonal sections through the +volume, as commonly used in the visualization of medical images. The resulting +image can be rotated and translated along the z-axis by using the mouse like in +the other rendered modes.\\ +This viewer comes in two variants, depending on how it's opened: + +\begin{description} +\item[partial:] when opened from the main window's \emph{Collections} menu +(see \ref{MainWindow}); in this mode only the data for the three sections currently +visible is held in main memory and new data is loaded from the database +when required (but not during a drag operation). +\item[full:] when opened from the results window (see \ref{ResultWindow}); in +this mode the data for the entire MDD is present in main memory and therefore +sections can be changed arbitrarily without requiring further database accesses. +\end{description} + +For both modes there are several new widgets in the control area: + +\begin{itemize} +\item +For each of the three dimensions there's a slider representing the position where each +hyperplane intersects the axis orthogonal to it. To the right of the slider is a +text widget where positions can be entered manually. As soon as the mouse pointer +touches the slider's well (that area within which the bar slides), the section it +represents is crossed out in the display to facilitate navigation; the cross is +removed when the mouse pointer leaves the well. The slider is dragged as usual +by holding down the left (or right) mouse button. Depending on the mode (\emph{partial} +or \emph{full}), the dragged section is displayed as a solid grey area or the actual +image data. +\item +Towards the bottom right is a text widget labelled \emph{Thick} where the thickness +of a section in cells can be entered. Note that the handling of thick sections is +not optimized in any way and in case the viewer is used in partial mode the cells +intersected by several sections are loaded from the database for each slice, leading +to an expansion of the data volume transferred by a factor of 3 in the worst case +(although the amount of overlap is neglectable for thin slices). If you want to +work with thick sections extensively, use the viewer in \emph{full} mode. +\item +Below the thickness widget are two more widgets labelled \emph{Auto} and +\emph{Load}. These determine how the display is updated in partial mode +when sections have changed. Dragging a section in partial mode displays +the section as a filled grey surface to show that the cell values are +unknown. If \emph{Auto} is checked, the new section is automatically loaded +from the database after the mouse button used to drag the slider is released, +otherwise the display is not updated automatically. The \emph{Load} button can +be used to explicitly request an update at any time; this is necessary in case +\emph{Auto} isn't checked or the database was closed during the drag and the +new data couldn't be loaded when the mouse button was released. +\end{itemize} + +\textbf{Current limitations of the Partial mode:} +\begin{itemize} +\item +There is no section cache, so moving the slider will always access the database, +no matter whether the sections were already loaded at an earlier time in the session. +\item +Colourspace mapping in any but \emph{type range} mode is problematic because due to +the partial character, there is no information about the value range of the entire +MDD, so some defaults are assumed. This can be easily remedied manually by opening +the colourspace editor and entering min/max values to use for the translation, but +it isn't done automatically yet; automatic updates could also lead to unwanted +side-effects because if a new slice changed the min/max values currently used, +the colours of the other two sections would be affected as well. +\end{itemize} + + + +\paragraph{Height field renderer} \label{HeightFieldRenderer} +\ \\ +This mode can be used on data of any dimensionality $d$ with an atomic base type. It +performs a mapping of the form $y_i = f(x_{1,i}, \ldots, x_{d,i})$ where all but two +of the $x_{j,i}$ are constant, namely $x_{m,i}$ and $x_{n,i}$ (i.e.\ $m$ and $n$ are +free dimensions as described in \ref{ObjectViewers} and have to be given by the +projection string). In other words the value of the cell at position +$(x_{1,i}, \ldots, x_{d,i})$ is interpreted as height information. +When connecting all the vertices $(x_{m,i},y_i,x_{n,i})$ +thus obtained, a surface in 3D space is created which is rendered using shaded +polygons, the colour of which can be set via \texttt{VoxelColour} (see the +\texttt{Image settings} window). Note that this field also accepts hexadecimal +numbers starting with a \texttt{0x} prefix. If the value of the colour is less then +256 it will be interpreted as a grey level, otherwise a colour of the form +\texttt{0xbbggrr}. You can force RGB mode on by setting bit 24 of the colour +value (required for pure reds). Forcing on RGB mode overrides colourspace mapping, +if it was turned on.\\ +A primitive light model is always used, namely $pixel = colour \cdot \frac{cos(\alpha)+1}{2}$ +where $\alpha$ is the angle between the surface normal and the light source. When +switching on lighting the full lighting model described in section \ref{RendererModel} is used. +Further options for this mode are the grid size $g$ and the height scaling factor $s$ +which are used to create the set of surface vertices +$S = \lbrace (i \cdot g, j \cdot g, s \cdot m(i,j) \quad \vert \quad l_0 \le i \le h_0, l_1 \le j \le h_1 \rbrace$ +where $m$ is the given 2D projection with the domain $\lbrack l_0:h_0, l_1:h_1 \rbrack$ +of the original nD data $M$ ($m \subseteq M$).\\ +You can also do animations with this mode when the dimensionality of the MDD object +is higher than 2. Using the movie playback buttons (or +/-) you can slice through the +data like in \texttt{flat} mode, but with a different rendering technique.\\ +This mode should not be used on large data sets because the number of polygons to render +is $2 (h_0 - l_0) (h_1 - l_1)$, so even a moderately sized image containing 512*512 +pixels would result in over half a million polygons which take several seconds to +render. As a general rule of thumb a size of 100*100 should not be exceeded (which +still requires about 20000 polygons). In case of bigger data it's recommended to scale +it down prior to using the height field renderer, e.g.\ by using the scaling functionality +provided in the \texttt{Results Window} (\ref{ResultWindow}). + + +\subsubsection{Colourspace mapping} +\label{ColourspaceMapping} + +Colourspace mapping can be used for visualizing MDD objects of all atomic base types. +The idea is to map an object's data $d$ of the data type $D$ with a potentially very +large range to the RGB colour space using a function $f_{cm}: D \rightarrow (r,g,b)$, +often with the restriction that small changes in the object values result in small +changes of the resulting colour, i.e.\ for a given $C \in \realnumbers$ + +$$\| f_{cm}(v_2) - f_{cm}(v_1) \|_2 \le C \vert v_2 - v_1 \vert \qquad \forall v_1, v_2 \in d .$$ + +This is achieved by using a transfer function $f_{tf}(x, \mu, \sigma)$ for each colour component +that maps a number $x \in D$ to the interval $\lbrack 0, 1 \rbrack$ where $\mu$ is the +position of the peak and $\sigma$ is the variation. The colourspace mapping is then +described by the equation + +\begin{displaymath} +f_{cm}(x) = +\left( \begin{array}{c} +r(x) \\ g(x) \\ b(x) +\end{array} \right) += +\left( \begin{array}{c} +f_{tf}(x, \mu_r, \sigma_r) \\ +f_{tf}(x, \mu_g, \sigma_g) \\ +f_{tf}(x, \mu_b, \sigma_b) \\ +\end{array} \right) . +\end{displaymath} + +In most cases it is desirable that $f_{tf}$ has a single, global maximum so a colour can +be easily associated with an intensity range. These thoughts led to modelling the default +transfer function $f^{gauss}_{tf}$. All in all there are four transfer functions available, +but not all of them meet all the criteria mentioned above: + +\begin{itemize} +\item +$f^{gauss}_{tf}(x, \mu, \sigma) = e^\frac{-(x - \mu)^2}{\sigma^2}$\\ +a standard gaussian. In this case +$C = \sqrt{\frac{6}{e}} \mbox{max}_{i \in \{r,g,b\}} \vert \frac{1}{\sigma_i} \vert$ +(see appendix \ref{CalculateC}). This function is symmetric, smooth and has a distinct +peak. + +\item +$f^{linear}_{tf}(x, \mu, \sigma) = \left\lbrace \begin{array}{rl} +1 - \left|\frac{x - \mu}{\sigma} \right| & | x - \mu | < \sigma\\ +0 & \mbox{otherwise}\\ +\end{array} \right.$\\ +a triangular spike that can for instance be used to perform +a mapping to greyscales directly proportional to the input value. The function +is symmetric and has a distinct peak but isn't smooth. + +\item +$f^{rect}_{tf}(x, \mu, \sigma) = \left\lbrace \begin{array}{rl} +1 & | x - \mu | < \sigma\\ +0 & \mbox{otherwise}\\ +\end{array} \right.$\\ +a rectangular pulse in case quantisation effects are +explicitly wanted. The function is symmetric, has an extended peak but is +neither smooth nor continuous. + +\item +$f^{asympt}_{tf}(x, \mu, \sigma) = \left\lbrace \begin{array}{rl} +0 & x < \mu\\ +1 - e^\frac{-(x - \mu)}{\sigma} & \mbox{otherwise} +\end{array} \right.$\\ +an asymmetric mapping function that starts at position +$\mu$ and converges to 1 for $x \rightarrow \infty$. The function is smooth and +continuous but asymmetric and without a peak. + +\end{itemize} + +You can choose the mapping function you wish by using the widget in the lower right +of the colourspace mapping editor. It's quite easy to extend \rview\ to support +many more mapping functions.\\ +The default values for the $\mu$ and $\sigma$ are + +$$\mu_r = max, \quad \mu_g = min + \frac{2(max-min)}{3}, \quad \mu_b = min + \frac{max-min}{3} +\qquad \mbox{and}$$ +$$\sigma_r = \sigma_g = \sigma_b = \frac{max-min}{6 \sqrt{\ln 2}}$$ + +where $max$ and $min$ can be either the extreme values present in the entire object +(default), the extreme values the base type can represent (\texttt{Full range} on) or the +extreme values that occur in the currently selected projection of the object (\texttt{Proj range} +on). The default values of the $\sigma$-parameters are chosen in such a way that the sum of two +neighbouring gaussians halfway between their mean values is 1, i.e.\ apart from areas of the +input range that don't lie between two means the intensity doesn't change drastically.\\ +Colourspace mapping is available in Image and Thumbnail viewers (\ref{ImageDisplayMode}, +\ref{ThumbnailDisplayMode}). The parameters can be changed using the +\texttt{Settings $\rightarrow$ Colourspace} menu which will become available once colourspace +mapping has been enabled and results in the \texttt{Colourspace setup} window being opened. +This window contains a canvas showing the three mapping functions that make up the normalized +mapping function $f_{cm}^{norm}: \lbrack 0,1 \rbrack \rightarrow (r,g,b)$, each +plotted in the colour it encodes. If \texttt{Draw sum} is checked the sum of the three +mapping functions will also be plotted in black, scaled to $\frac{1}{3}$ the height of +each of the mapping functions with the dotted line representing the value 1. The relation +between $f_{cm}^{norm}$ and $f_{cm}$ is that $\mu_i = min + (max - min)*\mu_i^{norm}$ and +$\sigma_i = (max - min)*\sigma_i^{norm}$ for $i \in \{r, g, b\}$.\\ +In the lower half of the +window are widgets displaying the values of the $\mu_i^{norm}$ (E$(x)$), the +$\sigma_i^{norm}$ (s$(x)$), $i \in \{r,g,b\}$ and the values of $max$ and $min$ currently +used. Values can be changed by either entering the new values in the widgets directly +and pressing \texttt{<return>} or by dragging the curves. For a drag the mouse pointer has +to be close to the mean value of the curve you want to drag; if the curves are very close +together, red takes precedence over green, which in turn takes precedence over blue. +Holding down the left mouse button and moving left/right moves the function's mean value. +Holding down the right mouse button and moving up/down increases/decreases the function's +variance. The functions will be immediately redrawn to reflect your latest changes.\\ +If the \texttt{Update} checkbox in the lower half of the window is checked these changes +will also be propagated to the viewer window owning this colourspace mapper. If this +viewer's image is very big or the display mode very time-consuming (e.g.\ the Voxel +renderer) this might take too long so it is advisable to disable the immediate update +in these situations.\\ +Clicking \texttt{OK} makes the current setup permanent for this viewer and closes the +\texttt{Colourspace setup} window. \texttt{Cancel} discards the changes, reverts the +viewer to the state it had before editing and also closes the window. + + +\subsection{Chart viewers} +\label{ChartDisplayMode} + +This is a 1D mode that visualizes the data as a $(x, f(x))$ graph. There are three +modes available from the \texttt{Modes} menu: + +\begin{description} +\item[Bar:] Bar chart, every value is represented by a filled rectangle. +\item[Line:] Consecutive values are connected by straight lines. +\item[Spline:] The values are connected using spline interpolation, thereby +making it a smooth curve. +\end{description} + +\texttt{Chart} mode is available for all atomic base types. A special case is +the RGB type where the three components are plotted slightly shifted against +each other in their corresponding colours.\\ +\texttt{Step} is the width in pixels of two consecutive values on the horizontal +axis, so larger values will stretch the graph horizontally; in \texttt{Bar} mode this +is also the width of each bar. A coordinate system is plotted optionally, depending +on the value of \texttt{CO-System}. In case a coordinate system is requested it can +be configured in the following ways: \texttt{Y markers} is the step size of the markers +on the vertical axis. Since the base type may be in a floating point format this is +a floating point number. \texttt{X markers} does the same for the markers on the horizontal +axis but is an integer number because all coordinates are integers. You have to press +\texttt{<return>} in the corresponding widget for changes to have any effect. + + +\subsection{Table viewers} +\label{TableDisplayMode} + +This is a 2D mode that displays the data numerically. In contrast to the other display +modes this one is totally independent of the base type and can display any MDD object +for which schema information exists. The first free dimension is mapped to the horizontal, +the second free dimension to the vertical axis by default. The current grid size in pixels +is displayed as \texttt{Step X} and \texttt{Step Y}. If the default values given in the +preferences (\ref{PreferencesEditor}) are -1, \rview\ will +make a guess at the grid size based on font size and base type. The grid size can +be changed by explicitly entering new values into the corresponding widgets and +pressing \texttt{<return>}. If \texttt{CO-System} is checked the coordinate system will +be displayed.\\ +There are three number bases available from the \texttt{Base} menu: \texttt{Decimal}, \texttt{Octal} +and \texttt{Hex}. The grid size will be adapted automatically if the default grid size +was -1. \texttt{Octal} and \texttt{Hex} are also available for floating point types; in +the case of a \texttt{double} base type the format is two numbers separated by a colon. + + +\subsection{Sound viewers} +\label{SoundDisplayMode} + +This is a 1D mode that can play digital sound samples. 2D data is allowed and will +be interpreted as multichannel sound where the second free dimension describes the +channels. There are six buttons for controlling playback. The meaning of each, from left +to right, is: + +\begin{description} +\item[{\boldmath $\ll$}] Set playback position to start +\item[{\boldmath $\|$}] Pause/resume playback +\item[{\boldmath $>$}] Start playback (from beginning) +\item[{\boldmath $\lbrack\rbrack$}] Stop playback +\item[{\boldmath $\gg$}] Set playback position to end +\item[{\boldmath $\longrightarrow$ \mbox{\rm or} $\longleftrightarrow$}] Toggle between normal and looped playback. When in +loop mode the sample will be repeated indefinitely (until loop mode is switched off +or playback is stopped manually). +\end{description} + +Below these playback controls are options concerning the sample format and the latency. +Enter the \texttt{Frequency} in Hz in the writable field to the left. Standard sample frequencies +are 8000Hz, 11025Hz, 22050Hz, 44100Hz and 48000Hz and the sound hardware may have trouble +handling anything else. The \texttt{Format} widget can be used to specify the sample format. +You can only select formats where the size of a sample is the same as the size of the MDD +base type. Currently four formats are supported: + +\begin{description} +\item[8 bit sl:] 8 bit signed linear, sample midpoint is at \texttt{0x00} +\item[8 bit usl:] 8 bit unsigned linear, sample midpoint is at \texttt{0x80} +\item[8 bit ulaw:] 8 bit $\mu$-law (a logarithmic format used e.g.\ in ISDN) +\item[16 bit sl:] 16 bit signed linear, sample midpoint is at \texttt{0x0000} +\end{description} + +The \texttt{Latency} widget determines how many samples will be created ahead of the +actual playback. Small values have the advantage that playback reacts to user +input with no noticeable delays; however they make playback very vulnerable to +jitter in the buffer fill code which will be most noticeable on a machine +under load, leading to audible dropouts. Large values have the advantage of +being very stable regarding dropouts but are slow to react to user input +(i.e.\ the sound will keep playing a little after a stop or pause). A good compromise +is usually between 100ms and 300ms, depending on the machine and its load.\\ +The slider at the bottom of the window represents the position of the currently +audible signal in the sample. You can also drag it to an arbitrary position during +playback to set the playback position there. Like with stop and pause there will +be a small delay between the dragging and the playback actually changing due to +latency. + + +\subsection{Thumbnail viewers} +\label{ThumbnailDisplayMode} + +This mode is unusual in that it can contain images of any number of objects as well +as a series of images created from one object. By default one thumbnail image of each object +is displayed, scaled to be \texttt{Thumbnail width} pixels wide while maintaining the +aspect ratio (i.e.\ an object of size 400*600 and a thumbnail width of 100 will result +in a thumbnail image of 100*150 pixels). It's also possible to restrict the thumbnails +to part of the objects using the projection string (e.g.\ \texttt{30:70, 20:80} instead +of \texttt{*:*, *:*}). \texttt{Thumbnail width} may have any value between 10 and 2000, so +in most cases it can be used to produce magnified views as well as small thumbnails. +\texttt{Thumbnail columns} specifies how many thumbnails should be fitted on one +row.\\ +Objects with more than two dimensions can also be displayed as a series of thumbnails, +similar to the movie mode in the image viewers (see \ref{ImageDisplayMode}). In order +to do this the number of free dimensions has to be three, where two are needed for the +image and one for the dimension to iterate over. By default the first two free +dimensions are used for the image and the third for the iteration. This behaviour +can be changed by setting \texttt{ProjDim} to the number of the dimension that should +be iterated over, starting from 0 (e.g.\ with a projection string of +\texttt{10:100, *:*, 5, 1:*} the default dimension to iterate over is described by +\texttt{1:*}, setting \texttt{ProjDim} to 1 would change that to \texttt{*:*}). The iteration +step can be set using \texttt{ProjStep}; this is the number the coordinate of the +iteration dimension should be incremented by after each thumbnail image. The larger +this number the fewer thumbnails will be created for each object.\\ +Beneath each thumbnail is a small descriptive text of the form \texttt{MDD \textsl{mdd} +\lbrack \textsl{view} \rbrack} where \textsl{mdd} is the number of the MDD object in +the same order as listed in the results window (\ref{ResultWindow}), starting from 0, +and \textsl{view} is the number of the view in case the object was displayed as a series +of thumbnails. Note that \texttt{ProjStep} will also be reflected by \textsl{view}.\\ +Thumbnail viewers also provide colourspace mapping for objects of atomic base types +(\ref{ColourspaceMapping}); use and configuration is identical to image viewers +(\ref{ImageDisplayMode}) but due to the nature of the thumbnail mode as a container +of many objects, \texttt{Proj range} is not available. + + +\section{Platform specifics} +\label{Platforms} + +\subsection{Unix} + +\begin{itemize} +\item +Changing the font to use for query windows (\ref{QueryWindow}) has no effect. This is +a bug of the X-version of \wxwin. +\end{itemize} + +\subsection{NT} + +\begin{itemize} +\item +Exiting \rview\ with an open database crashes the program. +\end{itemize} + + +\hrule + + +% Appendix +\newpage + +\begin{appendix} + +\section{Colourspace mapping smoothness constant C} +\label{CalculateC} + +Let $g_i(x) = e^{-\frac{(x - \mu_i)^2}{\sigma_i^2}}, \quad i \in \{r,g,b\}$. Then + +$$\| f_{cm}(v_2) - f_{cm}(v_1) \|_2 = \sqrt{\sum\limits_{i \in \{r,g,b\}} (g_i(v_2) - g_i(v_1))^2}$$ + +According to the mean value theorem $g_i(v_2) - g_i(v_1) = g'_i(\xi) (v_2 - v_1), \quad +\xi \in \lbrack v_1, v_2 \rbrack$, so the above can be rewritten to +$$\sqrt{\sum\limits_{i \in\{r,g,b\}} (g'_i(\xi_i)(v_2 - v_1))^2} \le +\sqrt{3} \cdot \vert g'_{max} \vert \cdot \vert v_2 - v_1 \vert, \quad +\mbox{i.e.} \quad C = \sqrt{3} \cdot \vert g'_{max} \vert \quad$$ +$$\mbox{where} \quad \vert g'_{max} \vert = \mbox{max}_{i \in \{r,g,b\}, x \in \realnumbers} \vert g'_i(x) \vert.$$ + +$g'_i(x) = -2\frac{x - \mu_i}{\sigma_i^2} g_i(x)$ and +$g''_i(x) = -\frac{2}{\sigma_i^2} g_i(x) + 4\frac{(x - \mu_i)^2}{\sigma_i^4}g_i(x) = +\frac{2}{\sigma_i^2} g_i(x) (2\frac{(x - \mu_i)^2}{\sigma_i^2} - 1)$. $g'_i(x)$ has +a local extreme value where $g''_i(x) = 0$, +i.e.\ $2\frac{(x - \mu_i)^2}{\sigma_i^2} = 1 \Longleftrightarrow x_{0,1} = \mu_i \pm \frac{\sigma_i}{\sqrt{2}}.$ +Due to the symmetry $\vert g'_i(\mu_i + x) \vert = \vert g'_i(\mu_i - x) \vert$ it suffices to +examine the value of $g'_i(x)$ on one of these points only, e.g.\ $x_0 = \mu_i + \frac{\sigma_i}{\sqrt{2}}$: +$\vert g'_i(x_0) \vert = \vert \frac{\sqrt{2}}{\sigma_i} e^{-\frac{1}{2}} \vert = +\sqrt{\frac{2}{e}} \vert \frac{1}{\sigma_i} \vert$. Therefore the solution to the problem is +$C = \sqrt{\frac{6}{e}} \mbox{max}_{i \in \{r,g,b\}} \vert \frac{1}{\sigma_i} \vert$. + +\end{appendix} + +\end{document} |