Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

216 lines
7.2 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkCellLinks.h,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkCellLinks - object represents upward pointers from points to list of cells using each point
// .SECTION Description
// vtkCellLinks is a supplemental object to vtkCellArray and vtkCellTypes,
// enabling access from points to the cells using the points. vtkCellLinks is
// a list of Links, each link represents a dynamic list of cell id's using the
// point. The information provided by this object can be used to determine
// neighbors and construct other local topological information.
// .SECTION See Also
// vtkCellArray vtkCellTypes
#ifndef __vtkCellLinks_h
#define __vtkCellLinks_h
#include "vtkObject.h"
class vtkDataSet;
class vtkCellArray;
class VTK_FILTERING_EXPORT vtkCellLinks : public vtkObject
{
public:
//BTX
class Link {
public:
unsigned short ncells;
vtkIdType *cells;
};
//ETX
static vtkCellLinks *New();
vtkTypeRevisionMacro(vtkCellLinks,vtkObject);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Allocate the specified number of links (i.e., number of points) that
// will be built.
void Allocate(vtkIdType numLinks, vtkIdType ext=1000);
// Description:
// Get a link structure given a point id.
Link &GetLink(vtkIdType ptId) {return this->Array[ptId];};
// Description:
// Get the number of cells using the point specified by ptId.
unsigned short GetNcells(vtkIdType ptId) { return this->Array[ptId].ncells;};
// Description:
// Build the link list array.
void BuildLinks(vtkDataSet *data);
// Description:
// Build the link list array.
void BuildLinks(vtkDataSet *data, vtkCellArray *Connectivity);
// Description:
// Return a list of cell ids using the point.
vtkIdType *GetCells(vtkIdType ptId) {return this->Array[ptId].cells;};
// Description:
// Insert a new point into the cell-links data structure. The size parameter
// is the initial size of the list.
vtkIdType InsertNextPoint(int numLinks);
// Description:
// Insert a cell id into the list of cells (at the end) using the cell id
// provided. (Make sure to extend the link list (if necessary) using the
// method ResizeCellList().)
void InsertNextCellReference(vtkIdType ptId, vtkIdType cellId);
// Description:
// Delete point (and storage) by destroying links to using cells.
void DeletePoint(vtkIdType ptId);
// Description:
// Delete the reference to the cell (cellId) from the point (ptId). This
// removes the reference to the cellId from the cell list, but does not
// resize the list (recover memory with ResizeCellList(), if necessary).
void RemoveCellReference(vtkIdType cellId, vtkIdType ptId);
// Description:
// Add the reference to the cell (cellId) from the point (ptId). This
// adds a reference to the cellId from the cell list, but does not resize
// the list (extend memory with ResizeCellList(), if necessary).
void AddCellReference(vtkIdType cellId, vtkIdType ptId);
// Description:
// Change the length of a point's link list (i.e., list of cells using a
// point) by the size specified.
void ResizeCellList(vtkIdType ptId, int size);
// Description:
// Reclaim any unused memory.
void Squeeze();
// Description:
// Reset to a state of no entries without freeing the memory.
void Reset();
// Description:
// Return the memory in kilobytes consumed by this cell links array.
// Used to support streaming and reading/writing data. The value
// returned is guaranteed to be greater than or equal to the memory
// required to actually represent the data represented by this object.
// The information returned is valid only after the pipeline has
// been updated.
unsigned long GetActualMemorySize();
// Description:
// Standard DeepCopy method. Since this object contains no reference
// to other objects, there is no ShallowCopy.
void DeepCopy(vtkCellLinks *src);
protected:
vtkCellLinks():Array(NULL),Size(0),MaxId(-1),Extend(1000) {};
~vtkCellLinks();
// Description:
// Increment the count of the number of cells using the point.
void IncrementLinkCount(vtkIdType ptId) { this->Array[ptId].ncells++;};
void AllocateLinks(vtkIdType n);
// Description:
// Insert a cell id into the list of cells using the point.
void InsertCellReference(vtkIdType ptId, unsigned short pos,
vtkIdType cellId);
Link *Array; // pointer to data
vtkIdType Size; // allocated size of data
vtkIdType MaxId; // maximum index inserted thus far
vtkIdType Extend; // grow array by this point
Link *Resize(vtkIdType sz); // function to resize data
private:
vtkCellLinks(const vtkCellLinks&); // Not implemented.
void operator=(const vtkCellLinks&); // Not implemented.
};
//----------------------------------------------------------------------------
inline void vtkCellLinks::InsertCellReference(vtkIdType ptId,
unsigned short pos,
vtkIdType cellId)
{
this->Array[ptId].cells[pos] = cellId;
}
//----------------------------------------------------------------------------
inline void vtkCellLinks::DeletePoint(vtkIdType ptId)
{
this->Array[ptId].ncells = 0;
delete [] this->Array[ptId].cells;
this->Array[ptId].cells = NULL;
}
//----------------------------------------------------------------------------
inline void vtkCellLinks::InsertNextCellReference(vtkIdType ptId,
vtkIdType cellId)
{
this->Array[ptId].cells[this->Array[ptId].ncells++] = cellId;
}
//----------------------------------------------------------------------------
inline void vtkCellLinks::RemoveCellReference(vtkIdType cellId, vtkIdType ptId)
{
vtkIdType *cells=this->Array[ptId].cells;
int ncells=this->Array[ptId].ncells;
for (int i=0; i < ncells; i++)
{
if (cells[i] == cellId)
{
for (int j=i; j < (ncells-1); j++)
{
cells[j] = cells[j+1];
}
this->Array[ptId].ncells--;
break;
}
}
}
//----------------------------------------------------------------------------
inline void vtkCellLinks::AddCellReference(vtkIdType cellId, vtkIdType ptId)
{
this->Array[ptId].cells[this->Array[ptId].ncells++] = cellId;
}
//----------------------------------------------------------------------------
inline void vtkCellLinks::ResizeCellList(vtkIdType ptId, int size)
{
int newSize;
vtkIdType *cells;
newSize = this->Array[ptId].ncells + size;
cells = new vtkIdType[newSize];
memcpy(cells, this->Array[ptId].cells,
this->Array[ptId].ncells*sizeof(vtkIdType));
delete [] this->Array[ptId].cells;
this->Array[ptId].cells = cells;
}
#endif