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
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
|
|
|
|
|