Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

HierMesh.h

Go to the documentation of this file.
00001 /*
00002     File:           HierMesh.h
00003 
00004     Function:       Provides a recursively-subdividable mesh of quadrilaterals
00005                     or triangles.
00006                     
00007     Author(s):      Andrew Willmott
00008 
00009     Copyright:      (c) 1997-2000, Andrew Willmott
00010  */
00011 
00012 
00013 #ifndef __HierMesh__
00014 #define __HierMesh__
00015 
00016 #include "RadMesh.h"
00017 
00018 // element capable of hierarchical subdivision...
00019 
00020 class HierElem;
00021 typedef Array<HierElem> HierElemList;
00022 typedef HierElem *HierElemPtr;
00023 
00024 class HierElem : public NbRadElem
00025 {
00026 public:
00027                         HierElem();
00028     virtual             ~HierElem();
00029     
00030     virtual Void        SetParent(HierElem &parent);
00031     virtual HierElem    *New() 
00032                         { return(new HierElem); };
00033     
00034     Bool                HasChildren()
00035                         { return(child[0] != 0);};
00036     Void                FreeChildren();
00037 
00038     Void                Draw(Renderer &r);
00039     virtual Void        DrawLeaf(Renderer &r);
00040     Void                DrawQuad(Renderer &r, RenderStyle start, Int code,
00041                                  RadElem *mid);
00042     Void                DrawTri(Renderer &r, RenderStyle start, Int code, 
00043                                 RadElem *mid);
00044     Void                ProjQuad(Renderer &r, RenderStyle start, Int code,
00045                                  RadElem *mid);
00046     Void                ProjTri(Renderer &r, RenderStyle start, Int code,
00047                                 RadElem *mid);
00048     
00049     Void                Reanimate(RadElem *parent);
00050     Void                ConnectNeighbours();
00051     Void                Subdivide();
00052 
00053     Void                SetColour(const Colour &c);
00054 
00055     Void                ColourVertices(Int weights[]);
00056     RadElem             *FindContainer(Coord &coord);
00057                         // find the leaf element containing this coord.
00058 
00059     Void                CreatePatches(PatchList &patches);
00060     Void                CreateElements(PatchList &elements,
00061                                        IndexList &eltParents, Int parent);
00062     GCLReal             RadError();
00063 
00064     // utilities
00065     Int                 CalcMidCode(RadElem *mid);
00066     Void                CollectLeaves(PatchList &leaves);
00067     Void                SplitElement(Int &numElems, HierElemPtr subElems[5]);
00068     Void                CorrectLeaves();
00069         
00070     // Printing and Parsing
00071     Void                Print(ostream &s);  
00072     Void                PrintRec(ostream &s);   
00073     virtual Void        PrintSelf(ostream &s);  
00074     Void                Parse(istream &s);  
00075     virtual Void        ParseSelf(istream &s);  
00076     Void                PrintID(ostream &s);    // Print code ID.
00077     StrConst            Name();
00078 
00079     GCLReal             MemoryUse();
00080 
00081     // Accessor functions
00082     HierElem            *&NbFace(Int i)     
00083                         { return((HierElem*&) nbFace[i]); };
00084 
00085     // Fields   
00086     HierElem            *child[4];          // Children, if subdivided...
00087     HierElem            *parent;    
00088     Int                 level;      // level of the quadtree.
00089     UInt32              treeCode;   // used to encode position in quadtree.
00090 };
00091 
00092 /*
00093     Field explanations.
00094     
00095     treeCode:   Defines the path from the root of the tree to this node.
00096                 At level i of the tree, (3 & (treeCode >> (2 * (level
00097                 - i)))) is the child to follow.  E.g., treeCode =
00098                 011110 for a level 3 patch: the patch is child 2 of
00099                 child 3 of child 1 of the root.  With 32 bit integers,
00100                 this allows for 16 different levels: the lowest will
00101                 have 1/65535 the side length of the highest, so that
00102                 should be plenty. 
00103 */
00104 
00105 // A grid of HierElems
00106 
00107 class HierGrid : public GridBase
00108 {
00109 public:
00110     Void            CreatePatches(PatchList &patches);
00111     Void            Draw(Renderer &r);
00112     Void            ColourVertices(Int weights[]);
00113     RadElem         *FindContainer(Coord &coord);   
00114     Void            Reanimate(RadElem *parent);
00115     
00116     Void            Print(ostream &s);  
00117     Void            Parse(istream &s);  
00118     StrConst        Name();
00119 
00120     RadElemPtr      AddChild(RadElem &quad, Int i, Int j, Int in, Int jn);
00121                     // override.
00122     Void            ConnectChildren();
00123 
00124     GCLReal         MemoryUse();
00125 
00126     // Fields
00127     HierElemList    children;
00128 };
00129 
00130 #endif

Generated at Sat Aug 5 00:26:51 2000 for Radiator by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000