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

VertexJoin.cc

Go to the documentation of this file.
00001 /*
00002 File: VertexJoin.cc
00003 
00004 Function: Join up disconnected mesh.
00005 
00006 Author: Andrew Willmott 
00007 
00008 Notes: Call SetBounds, and then AddVertex to get new ids for the 
00009 vertices. When finished call GetFinalVertexList() to retrieve
00010 the new list of vertices.
00011 */
00012 
00013 #include "gcl/VertexJoin.h"
00014 #include <stdio.h>
00015 
00016  #define VJ_DBG if (0) printf
00017 
00018  Void VertexJoin::Init(const Point &min, const Point &max, Int numVertices)
00019 {
00020 Int i, gridSize;
00021 
00022 VJ_DBG("Starting init [%d]\n", numVertices);
00023 vertices = new PointList;
00024 vertices->PreAllocate(numVertices);
00025 nextList.SetSize(numVertices);
00026 idList.SetSize(numVertices);
00027 
00028 SELF.max = max;
00029 SELF.min = min;
00030 
00031 // for now, we hard-code the grid size
00032 cells[0] = 32;
00033 cells[1] = 32;
00034 cells[2] = 32;
00035 gridSize = cells[0] * cells[1] * cells[2];
00036 grid = new Int[gridSize];
00037 
00038 for (i = 0; i < gridSize; i++)
00039 grid[i] = -1;
00040 
00041 for (i = 0; i < numVertices; i++)
00042 nextList[i] = -1;
00043 
00044 VJ_DBG("done\n");
00045 }
00046 
00047  Int VertexJoin::AddVertex(const Point &where, Int id)
00048 {
00049 Int vcell[3], *indexPtr;
00050 Vector bDelta, delta;
00051 
00052 // find cell of the grid.
00053 
00054 VJ_DBG("Adding point...\n");
00055 
00056 bDelta = max - min;
00057 delta = where - min;
00058 
00059 VJ_DBG("d1: %g %g %g d2: %g %g %g\n",
00060 bDelta[0], bDelta[1], bDelta[2], delta[0], delta[1], delta[2]);
00061 
00062 delta /= bDelta; 
00063 delta *= Vector(cells[0], cells[1], cells[2]);
00064 
00065 VJ_DBG("where: %g %g %g delta: %g %g %g\n",
00066 where[0], where[1], where[2], delta[0], delta[1], delta[2]);
00067 
00068 vcell[0] = (Int) delta[0];
00069 if (vcell[0] >= cells[0]) vcell[0] = cells[0] - 1;
00070 vcell[1] = (Int) delta[1];
00071 if (vcell[1] >= cells[1]) vcell[1] = cells[1] - 1;
00072 vcell[2] = (Int) delta[2];
00073 if (vcell[2] >= cells[2]) vcell[2] = cells[2] - 1;
00074 
00075 VJ_DBG("cell %d %d %d from %d %d %d\n", vcell[0], vcell[1], vcell[2],
00076 cells[0], cells[1], cells[2]);
00077 indexPtr = grid + (vcell[0] + vcell[1] * cells[0] +
00078 vcell[2] * cells[0] * cells[1]);
00079 
00080 // okay, now we search for a vertex match 
00081 while (*indexPtr >= 0)
00082 {
00083 VJ_DBG("index %d\n", *indexPtr);
00084 // return current index if we match...
00085 if ((id == idList[*indexPtr]) && 
00086 MatchVertex(where, (*vertices)[*indexPtr]))
00087 {
00088 VJ_DBG("hit at index %d\n", *indexPtr);
00089 return(*indexPtr);
00090 }
00091 
00092 // find next entry in linked list... 
00093 indexPtr = &(nextList[*indexPtr]);
00094 }
00095 
00096 // no match... so add the new vertex.
00097 
00098 *indexPtr = vertices->NumItems();
00099 VJ_DBG("adding new vertex at index %d\n", *indexPtr);
00100 vertices->Append(where);
00101 idList[*indexPtr] = id;
00102 return(*indexPtr);
00103 }
00104 
00105 
00106  PointList *VertexJoin::GetFinalVertexList()
00107 {
00108 PointList *result;
00109 
00110 delete grid;
00111 grid = 0;
00112 result = vertices;
00113 vertices = 0;
00114 idList.SetSize(0);
00115 nextList.SetSize(0);
00116 
00117 return(result);
00118 }
00119 
00120  Bool VertexJoin::MatchVertex(const Point &a, const Point &b)
00121 {
00122 // hack for now
00123 const GCLReal eps = 1e-5;
00124 
00125 return(len(a - b) < eps);
00126 }
00127 

Generated at Sat Aug 5 00:17:04 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /