JpGraph PHP Cross Reference Developer Tools

Source: /docs/chunkhtml/ch23.html - 313 lines - 29103 bytes - Text - Print

   1  <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Chapter 23. Filled contour graphs</title><link rel="stylesheet" type="text/css" href="manual.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.0"><link rel="home" href="index.html" title="JpGraph Manual"><link rel="up" href="pt05.html" title="Part V. Additional graph types available in the professional version"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 23. Filled contour graphs</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center">Part V. Additional graph types available in the professional version</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="chapter" title="Chapter 23. Filled contour graphs"><div class="titlepage"><div><div><h2 class="title"><a name="chapter.filled-contour-graphs"></a>Chapter 23. Filled contour graphs</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="ch23.html#id2594434">23.1. Filled Contour graphs</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch23.html#id2594607">23.1.1. Creating a filled contour graph</a></span></dt><dt><span class="sect2"><a href="ch23.html#id2594628">23.1.2. Enabling and disabling contour lines</a></span></dt><dt><span class="sect2"><a href="ch23.html#id2594656">23.1.3. Specifying a filled contour</a></span></dt><dt><span class="sect2"><a href="ch23.html#id2594673">23.1.4. Adjusting the labels in the contour</a></span></dt><dt><span class="sect2"><a href="ch23.html#id2595002">23.1.5. Selecting the adaptive method to use</a></span></dt></dl></dd></dl></div>
   2      
   3      <div class="sect1" title="Filled Contour graphs"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2594434"></a>Filled Contour graphs</h2></div></div></div>
   4          
   5          <p>
   6              </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
   7                  <p>This section describes additional functionality available in the pro-version
   8                      v3.1p and above.</p>
   9              </div><p>
  10          </p>
  11          <p>The use of filled ContourPlots requires the inclusion of the module
  12                  "<code class="filename">jpgraph_contourf.php</code>". The filled version of contour graphs
  13              supports the following additional features compared to the regular contour graphs</p>
  14          <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
  15                      <p>Filled contour plots</p>
  16                  </li><li class="listitem">
  17                      <p>Labelling of isobar lines in the contour plots</p>
  18                  </li><li class="listitem">
  19                      <p>Two user selectable adaptive algorithms to determine the contours, one
  20                          rectangular and one triangular based adaptive mesh algorithm.</p>
  21                  </li></ul></div><p>The enhanced contour plot is contained in the new plot <code class="code">class
  22                  FilledContourPlot</code>.</p>
  23          <p>As a quick introduction the two examples below shows two contour graphs which makes
  24              use of these additional features</p>
  25          <p>
  26              <table xmlns="" frame="void" id="id2594508">
  27                  <tbody xmlns="">
  28                      <tr>
  29                          <td>
  30                              <div class="figure"><a name="fig.contour2_ex1"></a><p class="title"><b>Figure 23.1. Filled contour with labels <code class="uri"><a class="uri" href="example_src/contour2_ex1.html" target="_top">(<code class="filename">contour2_ex1.php</code>)</a></code> </b></p><div class="figure-contents">  <span class="inlinemediaobject"><img src="images/contour2_ex1.png" alt="Filled contour with labels (contour2_ex1.php)"></span> </div></div><br class="figure-break">
  31                          </td>
  32                          <td>
  33                              <div class="figure"><a name="fig.contour2_ex2"></a><p class="title"><b>Figure 23.2. Filled contour with no isobar lines <code class="uri"><a class="uri" href="example_src/contour2_ex2.html" target="_top">(<code class="filename">contour2_ex2.php</code>)</a></code> </b></p><div class="figure-contents">  <span class="inlinemediaobject"><img src="images/contour2_ex2.png" alt="Filled contour with no isobar lines (contour2_ex2.php)"></span> </div></div><br class="figure-break">
  34                          </td>
  35                      </tr>
  36                  </tbody>
  37              </table>
  38          </p>
  39          <p>All basic formatting, such as specifying colors and number/location of the isobar
  40              lines are handled in exactly the same way as described in the previous section for basic
  41              contours.</p>
  42          <div class="sect2" title="Creating a filled contour graph"><div class="titlepage"><div><div><h3 class="title"><a name="id2594607"></a>Creating a filled contour graph</h3></div></div></div>
  43              
  44              <p>The filled contour graph follows the exact same principles as for the non filled
  45                  graph described above. The core difference is that a filled graph is created as an
  46                  instance of <code class="code">class FilledContourPlot</code>, i.e.</p>
  47              <p>
  48                  </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
  49  2
  50  3
  51  </pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
  52  </span><span class="hl-var">$filledContour</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">FilledContourPlot</span><span class="hl-brackets">(</span><span class="hl-var">$data</span><span class="hl-brackets">)</span><span class="hl-code">;
  53  </span><span class="hl-inlinetags">?&gt;</span></pre></td></tr></table></div><p>
  54              </p>
  55          </div>
  56          <div class="sect2" title="Enabling and disabling contour lines"><div class="titlepage"><div><div><h3 class="title"><a name="id2594628"></a>Enabling and disabling contour lines</h3></div></div></div>
  57              
  58              <p>Contour lines are controlled with the method</p>
  59              <p>
  60                  </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
  61                          <p><code class="code">FilledContourPlot::ShowLines($aFlg,$aColorWithFilled='black')</code></p>
  62                          <p>The <code class="code">$aFlg</code> is a boolean that determines if contour lines
  63                              should be shown or not. by default they are enabled. The second argument
  64                                  <code class="code">$aColorWithFilled</code> determines what color the contour
  65                              lines should have when the contour is filled. If the contour is not
  66                              filled then the contour lines will have the color of the isobar.</p>
  67                      </li></ul></div><p>
  68              </p>
  69          </div>
  70          <div class="sect2" title="Specifying a filled contour"><div class="titlepage"><div><div><h3 class="title"><a name="id2594656"></a>Specifying a filled contour</h3></div></div></div>
  71              
  72              <p>In order to have the contour filled the method</p>
  73              <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
  74                      <p><code class="code">ContourPlot::SetFilled($aFlg)</code> Determines if the contour
  75                          should be filled or not.</p>
  76                  </li></ul></div>
  77              <p>should be called.</p>
  78              <p>Since there are <span class="italic">n</span> isobar lines and there needs to be <span class="italic">n+1</span> colors to fill the graph there is a choice of what
  79                  side should the color for isobar line <span class="italic">n</span> fill. The area above or the area below the isobar. In
  80                  this library we use the convention that the color for isobar line <span class="italic">n</span> is used to fill the area up to the next highest
  81                  isobar <span class="italic">n+1</span>. </p>
  82              <p>If the colors are specified manually it is important that one more color than the
  83                  number of isobar lines are specified. The convention is such that the color
  84                  specified in the first position (position = 0 ) in the color array is used to fill
  85                  the area below the lowest specified isobar.</p>
  86              <p>An example will make this clear.</p>
  87              <p>The graph below only uses three isobar lines (to keep things simple) which means
  88                  that we need four colors. To create such a graph we use the lines</p>
  89              <div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
  90  2
  91  3
  92  4
  93  5
  94  6
  95  7
  96  8
  97  9
  98  10
  99  11
 100  12
 101  </pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags">&lt;?php</span><span class="hl-code">
 102  </span><span class="hl-var">$data</span><span class="hl-code"> = </span><span class="hl-reserved">array</span><span class="hl-brackets">(</span><span class="hl-code"> ... </span><span class="hl-brackets">)</span><span class="hl-code">;
 103   
 104  </span><span class="hl-var">$isobar_colors</span><span class="hl-code"> = </span><span class="hl-reserved">array</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">lightgray</span><span class="hl-quotes">'</span><span class="hl-code">,</span><span class="hl-quotes">'</span><span class="hl-string">teal:1.3</span><span class="hl-quotes">'</span><span class="hl-code">,</span><span class="hl-quotes">'</span><span class="hl-string">orange</span><span class="hl-quotes">'</span><span class="hl-code">,</span><span class="hl-quotes">'</span><span class="hl-string">red</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
 105   
 106  </span><span class="hl-comment">//</span><span class="hl-comment"> Create a new contour graph with three isobar lines</span><span class="hl-comment"></span><span class="hl-code">
 107  </span><span class="hl-var">$cp</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">ContourPlot</span><span class="hl-brackets">(</span><span class="hl-var">$data</span><span class="hl-code">,</span><span class="hl-number">3</span><span class="hl-brackets">)</span><span class="hl-code">;
 108   
 109  </span><span class="hl-comment">//</span><span class="hl-comment"> Specify the colors manually</span><span class="hl-comment"></span><span class="hl-code">
 110  </span><span class="hl-var">$cp</span><span class="hl-code">-&gt;</span><span class="hl-identifier">SetIsobarColors</span><span class="hl-brackets">(</span><span class="hl-var">$isobar_colors</span><span class="hl-brackets">)</span><span class="hl-code">;
 111   
 112  </span><span class="hl-inlinetags">?&gt;</span></pre></td></tr></table></div>
 113              <p>
 114                  </p><div class="figure"><a name="fig.contour2_ex3"></a><p class="title"><b>Figure 23.3. Manual colors for contour <code class="uri"><a class="uri" href="example_src/contour2_ex3.html" target="_top">(<code class="filename">contour2_ex3.php</code>)</a></code> </b></p><div class="figure-contents">  <span class="inlinemediaobject"><img src="images/contour2_ex3.png" alt="Manual colors for contour (contour2_ex3.php)"></span> </div></div><p><br class="figure-break">
 115              </p>
 116              <p>as can be seen from the labels in the graph the algorithm has resulted in three
 117                  isobar lines (as specified) at values <span class="italic">6.2</span>, <span class="italic">10.5</span> and <span class="italic">14.8</span>. The first color "gray" is used to fill the area
 118                  below the smallest isobar (<span class="italic">6.2</span>).</p>
 119              <p>It should be noted that by specifying <code class="code">SetFilled(false)</code> a non filled
 120                  contour graph can be created. However, the visual appearance compared with the
 121                      <code class="code">class ContourPlot</code> will be slightly different. The reason is that
 122                  the filled contour plot class uses an adaptive algorithm that gives better fidelity
 123                  than the simpler non adaptive algorithm used in the standard (non-filled) contour
 124                  plot class. The contour corresponds to creating a contour with the plain contour
 125                  plot algorithm (class ContourPlot) using an interpolation factor of ~3-4.</p>
 126          </div>
 127          <div class="sect2" title="Adjusting the labels in the contour"><div class="titlepage"><div><div><h3 class="title"><a name="id2594673"></a>Adjusting the labels in the contour</h3></div></div></div>
 128              
 129              <p>In order to make it easier to follow the contour labels can be added inside the
 130                  contour. The labels are placed using a heuristic algorithm that tries to place
 131                  enough labels to make the plot easy to read but not as many labels as to make it
 132                  crowded.</p>
 133              <p>There are two main characteristic of the labels that can be controlled.</p>
 134              <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
 135                      <p>The font and color of the labels which are controlled by the two methods
 136                              <code class="code">FilledContourPlot::SetFont()</code> and
 137                              <code class="code">FilledContourPlot::SetFontColor()</code></p>
 138                  </li><li class="listitem">
 139                      <p>Whether or not the label should follow the gradient of the isobar line at
 140                          the point where the label is displayed or if it should always be drawn
 141                          horizontally.</p>
 142                  </li></ul></div>
 143              <p>To enable or disable the display of the labels as well as determining if the label
 144                  should follow the gradient or not the method</p>
 145              <p>
 146                  </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
 147                          <p><code class="code">FilledContourPlot::ShowLabel($aFlg,$aFollowGradient)</code></p>
 148                      </li></ul></div><p>
 149              </p>
 150              <p>is used. The two examples below show two variants of the same contour where the
 151                  left graph have labels which follows the gradient and the right graph have labels
 152                  that are always oriented horizontally.</p>
 153              <p>
 154                  <table xmlns="" frame="void" id="id2594914">
 155                      <tbody xmlns="">
 156                          <tr>
 157                              <td>
 158                                  <div class="figure"><a name="fig.contour2_ex4"></a><p class="title"><b>Figure 23.4. Labels that follows the gradients <code class="uri"><a class="uri" href="example_src/contour2_ex4.html" target="_top">(<code class="filename">contour2_ex4.php</code>)</a></code> </b></p><div class="figure-contents">  <span class="inlinemediaobject"><img src="images/contour2_ex4.png" alt="Labels that follows the gradients (contour2_ex4.php)"></span> </div></div><br class="figure-break">
 159                              </td>
 160                              <td>
 161                                  <div class="figure"><a name="fig.contour2_ex5"></a><p class="title"><b>Figure 23.5. Labels that are always horizontal. In this example we have also shown how to change the colors. <code class="uri"><a class="uri" href="example_src/contour2_ex5.html" target="_top">(<code class="filename">contour2_ex5.php</code>)</a></code> </b></p><div class="figure-contents">  <span class="inlinemediaobject"><img src="images/contour2_ex5.png" alt="Labels that are always horizontal. In this example we have also shown how to change the colors. (contour2_ex5.php)"></span> </div></div><br class="figure-break">
 162                              </td>
 163                          </tr>
 164                      </tbody>
 165                  </table>
 166              </p>
 167          </div>
 168          <div class="sect2" title="Selecting the adaptive method to use"><div class="titlepage"><div><div><h3 class="title"><a name="id2595002"></a>Selecting the adaptive method to use</h3></div></div></div>
 169              
 170              <p>
 171                  </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
 172                      <p>This section can be skipped without loss of continuity. The default method
 173                          "rectangular" recursive adaptation is good enough for most
 174                          circumstances.</p>
 175                  </div><p>
 176              </p>
 177              <p>In order to fully understand the effect of selecting which adaptive method to use
 178                  it is first necessary to understand some background on how contours are created
 179                  algorithmically. </p>
 180              <p>Determining general contours for a function of two independent variables is
 181                  equivalent to the problem of finding the equivalence class of all coordinate pairs <span class="italic">(x,y)</span> for which for <span class="italic">C=f(x,y)</span> which in general is a non-linear problem. This
 182                  is an example of a problem that is computational very expensive to mathematically
 183                  solve correct but quite tractable if we view a sampled version of the function. This
 184                  means that we in general do not have access to <span class="italic">f(x,y)</span> instead we only know of its values at a number
 185                  of grid points. This is also the cause of visually different contour plots for the
 186                  same input data.</p>
 187              <p>The difference lay in the core problem that in order to draw a continues contour
 188                  we need to interpolate the unknown values in between the known sample points. This
 189                  is therefore a degree of freedom where the actual choice of how we do the
 190                  interpolation will cause the contour to be visually different depending on our
 191                  choice.</p>
 192              <p>While it would take to far in this manual to describe the full adaptive algorithm
 193                  in all details we will show the different principles that underlying the two methods
 194                  hat the user can select between.</p>
 195              <p>In order to determine the isobars the given data points are considered to be
 196                  vertices in a grid where each vertice is connected with an edge. There are two basic
 197                  ways to connect the points with edges; rectangular and triangular. In the first way
 198                  four points are connected to form a square and in the second way three point are
 199                  connected to form a triangle. The so created square or triangles will be referred to
 200                  as a submesh consisting of four and three sides respectively.</p>
 201              <p>To determine the isobars each submesh is recursively divided until each side is
 202                  small enough to only have one crossing isobar. The exact position of the crossing is
 203                  determined by linear interpolation between the two corresponding vertices.</p>
 204              <p>The figures below shows the sequences for the triangle recursive division. The
 205                  recursion continues until each edge has exactly one crossing of an isobar.</p>
 206              <p>
 207                  </p><div class="informaltable">
 208                      <table border="0"><colgroup><col class="c1"><col class="c2"><col class="c3"></colgroup><tbody><tr><td align="center">
 209                                      <div class="figure"><a name="id2595141"></a><p class="title"><b>Figure 23.6. Triangulation step 0</b></p><div class="figure-contents">
 210                                          
 211                                          <div class="mediaobject"><img src="images/tri_step0.png" alt="Triangulation step 0"></div>
 212                                      </div></div><br class="figure-break">
 213                                  </td><td align="center">
 214                                      <div class="figure"><a name="id2595170"></a><p class="title"><b>Figure 23.7. Triangulation step 1</b></p><div class="figure-contents">
 215                                          
 216                                          <div class="mediaobject"><img src="images/tri_step1.png" alt="Triangulation step 1"></div>
 217                                      </div></div><br class="figure-break">
 218                                  </td><td align="center">
 219                                      <div class="figure"><a name="id2595196"></a><p class="title"><b>Figure 23.8. Triangulation step 2</b></p><div class="figure-contents">
 220                                          
 221                                          <div class="mediaobject"><img src="images/tri_step2.png" alt="Triangulation step 2"></div>
 222                                      </div></div><br class="figure-break">
 223                                  </td></tr></tbody></table>
 224                  </div><p>
 225              </p>
 226              <p> In the same way the sequence of figures below shows the principle for the
 227                  quadratic recursive subdivsion of the mesh for first three steps. </p>
 228              <p>
 229                  </p><div class="informaltable">
 230                      <table border="0"><colgroup><col class="c1"><col class="c2"><col class="c3"></colgroup><tbody><tr><td align="center">
 231                                      <div class="figure"><a name="id2595278"></a><p class="title"><b>Figure 23.9. "Rectangularization" step 0</b></p><div class="figure-contents">
 232                                          
 233                                          <div class="mediaobject"><img src="images/rect_step0.png" alt='"Rectangularization" step 0'></div>
 234                                      </div></div><br class="figure-break">
 235                                  </td><td align="center">
 236                                      <div class="figure"><a name="id2595302"></a><p class="title"><b>Figure 23.10. "Rectangularization" step 1</b></p><div class="figure-contents">
 237                                          
 238                                          <div class="mediaobject"><img src="images/rect_step1.png" alt='"Rectangularization" step 1'></div>
 239                                      </div></div><br class="figure-break">
 240                                  </td><td align="center">
 241                                      <div class="figure"><a name="id2595327"></a><p class="title"><b>Figure 23.11. "Rectangularization" step 2</b></p><div class="figure-contents">
 242                                          
 243                                          <div class="mediaobject"><img src="images/rect_step2.png" alt='"Rectangularization" step 2'></div>
 244                                      </div></div><br class="figure-break">
 245                                  </td></tr></tbody></table>
 246                  </div><p>
 247              </p>
 248              <p> Needless to say these two variants give slightly different visual appearance of
 249                  the resulting contour plot and neither of the two method can be considered "the
 250                  right method". Triangularization tends to work better (and faster) for high
 251                  frequency contour plots and gives a more "edgy" result. The quadratic subdivision
 252                  might require more recursive steps for high frequency contours but in general gives
 253                  a smoother look of the resulting contour.</p>
 254              <p>By default the library uses a rectangular mesh division and that is the method
 255                  that has been used in all the previous examples. As an illustration the effect of
 256                  the method have the two figures below shows the same data as we have used in the
 257                  previous figures to display a contour plot with 7 isobars. The left figures uses a
 258                  rectangular division (the default) and the right figure uses a triangular
 259                  division.</p>
 260              <p>
 261                  </p><div class="informaltable">
 262                      <table border="0"><colgroup><col class="c1"><col class="c2"></colgroup><tbody><tr><td>
 263                                      <div class="figure"><a name="fig.contour2_ex6"></a><p class="title"><b>Figure 23.12. 7 Isobars, "rect" method <code class="uri"><a class="uri" href="example_src/contour2_ex6.html" target="_top">(<code class="filename">contour2_ex6.php</code>)</a></code> </b></p><div class="figure-contents">  <span class="inlinemediaobject"><img src="images/contour2_ex6.png" alt='7 Isobars, "rect" method (contour2_ex6.php)'></span> </div></div><br class="figure-break">
 264                                  </td><td>
 265                                      <div class="figure"><a name="fig.contour2_ex7"></a><p class="title"><b>Figure 23.13. 7 Isobars, "tri" method <code class="uri"><a class="uri" href="example_src/contour2_ex7.html" target="_top">(<code class="filename">contour2_ex7.php</code>)</a></code> </b></p><div class="figure-contents">  <span class="inlinemediaobject"><img src="images/contour2_ex7.png" alt='7 Isobars, "tri" method (contour2_ex7.php)'></span> </div></div><br class="figure-break">
 266                                  </td></tr></tbody></table>
 267                  </div><p>
 268              </p>
 269              <p>As can be seen in this case the triangular method favour elongated contours from
 270                  southwest to northeast while the rectangular method favours circular contours. </p>
 271              <p>The way to choose what method to use is by the method</p>
 272              <p>
 273                  </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
 274                          <p><code class="code">FilledContourPlot::SetMethod($aMethod)</code>
 275                          </p>
 276                          <p>The possible options for <code class="code">$aMethod</code> are</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
 277                                      <p>"rect" - Rectangualr algortihm (default)</p>
 278                                  </li><li class="listitem">
 279                                      <p>"tri" - Triangular algorithm</p>
 280                                  </li></ol></div>
 281                      </li></ul></div><p>
 282              </p>
 283              <p>
 284                  </p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3>
 285                      <p>It is possible to show the triangulation used by calling the method
 286                              <code class="code">FilledContourPlot::ShowTriangulation($aFlg)</code>. In the two
 287                          figures below the triangulation for the "rect" and "tri" method in the
 288                          previous examples are shown.</p>
 289                      <p>
 290                          <table xmlns="" frame="void" id="id2595547">
 291                              <tbody xmlns="">
 292                                  <tr>
 293                                      <td>
 294                                          <div class="figure"><a name="id2595567"></a><p class="title"><b>Figure 23.14. Rectangular sub-division</b></p><div class="figure-contents">
 295                                              
 296                                              <div class="mediaobject"><img src="images/contour_rectang.png" alt="Rectangular sub-division"></div>
 297                                          </div></div><br class="figure-break">
 298                                      </td>
 299                                      <td>
 300                                          <div class="figure"><a name="id2595593"></a><p class="title"><b>Figure 23.15. Triangular sub-division</b></p><div class="figure-contents">
 301                                              
 302                                              <div class="mediaobject"><img src="images/contour_triangulation.png" alt="Triangular sub-division"></div>
 303                                          </div></div><br class="figure-break">
 304                                      </td>
 305                                  </tr>
 306                              </tbody>
 307                          </table>
 308                      </p>
 309                  </div><p>
 310              </p>
 311          </div>
 312      </div>
 313  </div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"><a accesskey="u" href="pt05.html">Up</a></td><td width="40%" align="right"> </td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></body></html>

title

Description

title

Description

title

Description

title

title

Body