You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
7.6 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkCellLinks.h
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.
=========================================================================*/
/**
* @class vtkCellLinks
* @brief object represents upward pointers from points to list of cells using each point
*
* vtkCellLinks is a supplemental object to vtkCellArray and vtkCellTypes,
* enabling access from points to the cells using the points. vtkCellLinks is
* a list of cell ids, each such link representing a dynamic list of cell ids
* using the point. The information provided by this object can be used to
* determine neighbors and construct other local topological information.
*
* @warning
* vtkCellLinks supports incremental (i.e., "editable") operations such as
* inserting a new cell, or deleting a point. Because of this, it is less
* memory efficient, and slower to construct and delete than static classes
* such as vtkStaticCellLinks or vtkStaticCellLinksTemplate. However these
* other classes are typically meant for one-time (static) construction.
*
* @sa
* vtkCellArray vtkCellTypes vtkStaticCellLinks vtkStaticCellLinksTemplate
*/
#ifndef vtkCellLinks_h
#define vtkCellLinks_h
#include "vtkAbstractCellLinks.h"
#include "vtkCommonDataModelModule.h" // For export macro
class vtkDataSet;
class vtkCellArray;
class VTKCOMMONDATAMODEL_EXPORT vtkCellLinks : public vtkAbstractCellLinks
{
public:
class Link
{
public:
vtkIdType ncells;
vtkIdType* cells;
};
//@{
/**
* Standard methods to instantiate, print, and obtain type information.
*/
static vtkCellLinks* New();
vtkTypeMacro(vtkCellLinks, vtkAbstractCellLinks);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
/**
* Build the link list array. All subclasses of vtkAbstractCellLinks
* must support this method.
*/
void BuildLinks(vtkDataSet* data) override;
/**
* Allocate the specified number of links (i.e., number of points) that
* will be built.
*/
void Allocate(vtkIdType numLinks, vtkIdType ext = 1000);
/**
* Clear out any previously allocated data structures
*/
void Initialize() override;
/**
* Get a link structure given a point id.
*/
Link& GetLink(vtkIdType ptId) { return this->Array[ptId]; }
/**
* Get the number of cells using the point specified by ptId.
*/
vtkIdType GetNcells(vtkIdType ptId) { return this->Array[ptId].ncells; }
/**
* Return a list of cell ids using the point.
*/
vtkIdType* GetCells(vtkIdType ptId) { return this->Array[ptId].cells; }
/**
* Insert a new point into the cell-links data structure. The size parameter
* is the initial size of the list.
*/
vtkIdType InsertNextPoint(int numLinks);
/**
* 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);
/**
* Delete point (and storage) by destroying links to using cells.
*/
void DeletePoint(vtkIdType ptId);
/**
* 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);
/**
* 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);
/**
* 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);
/**
* Reclaim any unused memory.
*/
void Squeeze() override;
/**
* Reset to a state of no entries without freeing the memory.
*/
void Reset() override;
/**
* Return the memory in kibibytes (1024 bytes) 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() override;
/**
* Standard DeepCopy method. Since this object contains no reference
* to other objects, there is no ShallowCopy.
*/
void DeepCopy(vtkAbstractCellLinks* src) override;
protected:
vtkCellLinks()
: Array(nullptr)
, Size(0)
, MaxId(-1)
, Extend(1000)
{
}
~vtkCellLinks() override;
/**
* Increment the count of the number of cells using the point.
*/
void IncrementLinkCount(vtkIdType ptId) { this->Array[ptId].ncells++; }
void AllocateLinks(vtkIdType n);
/**
* Insert a cell id into the list of cells using the point.
*/
void InsertCellReference(vtkIdType ptId, vtkIdType 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&) = delete;
void operator=(const vtkCellLinks&) = delete;
};
//----------------------------------------------------------------------------
inline void vtkCellLinks::InsertCellReference(vtkIdType ptId, vtkIdType 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 = nullptr;
}
//----------------------------------------------------------------------------
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;
vtkIdType ncells = this->Array[ptId].ncells;
for (vtkIdType i = 0; i < ncells; i++)
{
if (cells[i] == cellId)
{
for (vtkIdType 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)
{
vtkIdType newSize = this->Array[ptId].ncells + size;
vtkIdType* cells = new vtkIdType[newSize];
memcpy(cells, this->Array[ptId].cells,
static_cast<size_t>(this->Array[ptId].ncells) * sizeof(vtkIdType));
delete[] this->Array[ptId].cells;
this->Array[ptId].cells = cells;
}
#endif