00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00054 #ifndef __vtkCellLinks_h
00055 #define __vtkCellLinks_h
00056
00057 #include "vtkObject.h"
00058 class vtkDataSet;
00059 class vtkCellArray;
00060
00061 struct _vtkLink_s {
00062 unsigned short ncells;
00063 int *cells;
00064 };
00065
00066 class VTK_EXPORT vtkCellLinks : public vtkObject
00067 {
00068 public:
00069 static vtkCellLinks *New();
00070 vtkTypeMacro(vtkCellLinks,vtkObject);
00071
00074 void Allocate(int numLinks, int ext=1000);
00075
00077 _vtkLink_s &GetLink(int ptId) {return this->Array[ptId];};
00078
00080 unsigned short GetNcells(int ptId) { return this->Array[ptId].ncells;};
00081
00083 void BuildLinks(vtkDataSet *data);
00084
00086 void BuildLinks(vtkDataSet *data, vtkCellArray *Connectivity);
00087
00089 int *GetCells(int ptId) {return this->Array[ptId].cells;};
00090
00093 int InsertNextPoint(int numLinks);
00094
00098 void InsertNextCellReference(int ptId, int cellId);
00099
00101 void DeletePoint(int ptId);
00102
00106 void RemoveCellReference(int cellId, int ptId);
00107
00111 void AddCellReference(int cellId, int ptId);
00112
00115 void ResizeCellList(int ptId, int size);
00116
00118 void Squeeze();
00119
00121 void Reset();
00122
00129 unsigned long GetActualMemorySize();
00130
00133 void DeepCopy(vtkCellLinks *src);
00134
00135 protected:
00136 vtkCellLinks():Array(NULL),Size(0),MaxId(-1),Extend(1000) {};
00137 ~vtkCellLinks();
00138 vtkCellLinks(const vtkCellLinks&) {};
00139 void operator=(const vtkCellLinks&) {};
00140
00142 void IncrementLinkCount(int ptId) { this->Array[ptId].ncells++;};
00143
00144 void AllocateLinks(int n);
00145
00147 void InsertCellReference(int ptId, unsigned short pos, int cellId);
00148
00149 _vtkLink_s *Array;
00150 int Size;
00151 int MaxId;
00152 int Extend;
00153 _vtkLink_s *Resize(int sz);
00154 };
00155
00156
00157 inline void vtkCellLinks::InsertCellReference(int ptId, unsigned short pos, int cellId)
00158 {
00159 this->Array[ptId].cells[pos] = cellId;
00160 }
00161
00162 inline void vtkCellLinks::DeletePoint(int ptId)
00163 {
00164 this->Array[ptId].ncells = 0;
00165 delete [] this->Array[ptId].cells;
00166 this->Array[ptId].cells = NULL;
00167 }
00168
00169 inline void vtkCellLinks::InsertNextCellReference(int ptId, int cellId)
00170 {
00171 this->Array[ptId].cells[this->Array[ptId].ncells++] = cellId;
00172 }
00173
00174 inline void vtkCellLinks::RemoveCellReference(int cellId, int ptId)
00175 {
00176 int *cells=this->Array[ptId].cells;
00177 int ncells=this->Array[ptId].ncells;
00178
00179 for (int i=0; i < ncells; i++)
00180 {
00181 if (cells[i] == cellId)
00182 {
00183 for (int j=i; j < (ncells-1); j++)
00184 {
00185 cells[j] = cells[j+1];
00186 }
00187 this->Array[ptId].ncells--;
00188 break;
00189 }
00190 }
00191 }
00192
00193 inline void vtkCellLinks::AddCellReference(int cellId, int ptId)
00194 {
00195 this->Array[ptId].cells[this->Array[ptId].ncells++] = cellId;
00196 }
00197
00198 inline void vtkCellLinks::ResizeCellList(int ptId, int size)
00199 {
00200 int *cells, newSize;
00201
00202 newSize = this->Array[ptId].ncells + size;
00203 cells = new int[newSize];
00204 memcpy(cells, this->Array[ptId].cells, this->Array[ptId].ncells*sizeof(int));
00205 delete [] this->Array[ptId].cells;
00206 this->Array[ptId].cells = cells;
00207 }
00208
00209 #endif
00210