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