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.

185 lines
5.5 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkKCoreLayout.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.
=========================================================================*/
/*----------------------------------------------------------------------------
Copyright (c) Sandia Corporation
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
----------------------------------------------------------------------------*/
/**
* @class vtkKCoreLayout
* @brief Produces a layout for a graph labeled with K-Core
* information.
*
*
* vtkKCoreLayout creates coordinates for each vertex that can be used to
* perform a layout for a k-core view.
* Prerequisite: Vertices must have an attribute array containing their
* k-core number. This layout is based on the algorithm
* described in the paper: "k-core decomposition: a tool
* for the visualization of large scale networks", by
* Ignacio Alvarez-Hamelin et. al.
*
* This graph algorithm appends either polar coordinates or cartesian coordinates
* as vertex attributes to the graph giving the position of the vertex in a layout.
* Input graphs must have the k-core number assigned to each vertex (default
* attribute array storing kcore numbers is "kcore").
*
* Epsilon - this factor is used to adjust the amount vertices are 'pulled' out of
* their default ring radius based on the number of neighbors in higher
* cores. Default=0.2
* UnitRadius - Tweaks the base unit radius value. Default=1.0
*
* Still TODO: Still need to work on the connected-components within each shell and
* associated layout issues with that.
*
* Input port 0: graph
*
* @par Thanks:
* Thanks to William McLendon from Sandia National Laboratories for providing this
* implementation.
*/
#ifndef vtkKCoreLayout_h
#define vtkKCoreLayout_h
#include "vtkGraphAlgorithm.h"
#include "vtkInfovisLayoutModule.h" // For export macro
class VTKINFOVISLAYOUT_EXPORT vtkKCoreLayout : public vtkGraphAlgorithm
{
public:
static vtkKCoreLayout* New();
vtkTypeMacro(vtkKCoreLayout, vtkGraphAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/// Convenience function provided for setting the graph input.
void SetGraphConnection(vtkAlgorithmOutput*);
vtkKCoreLayout();
~vtkKCoreLayout() override;
int FillInputPortInformation(int port, vtkInformation* info) override;
//@{
/**
* Set the name of the vertex attribute array storing k-core labels.
* Default: kcore
*/
vtkSetStringMacro(KCoreLabelArrayName);
//@}
//@{
/**
* Output polar coordinates for vertices if True. Default column names are
* coord_radius, coord_angle.
* Default: False
*/
vtkGetMacro(Polar, bool);
vtkSetMacro(Polar, bool);
vtkBooleanMacro(Polar, bool);
//@}
//@{
/**
* Set whether or not to convert output to cartesian coordinates. If false, coordinates
* will be returned in polar coordinates (radius, angle).
* Default: True
*/
vtkGetMacro(Cartesian, bool);
vtkSetMacro(Cartesian, bool);
vtkBooleanMacro(Cartesian, bool);
//@}
//@{
/**
* Polar coordinates array name for radius values.
* This is only used if OutputCartesianCoordinates is False.
* Default: coord_radius
*/
vtkSetStringMacro(PolarCoordsRadiusArrayName);
vtkGetStringMacro(PolarCoordsRadiusArrayName);
//@}
//@{
/**
* Polar coordinates array name for angle values in radians.
* This is only used if OutputCartesianCoordinates is False.
* Default: coord_angle
*/
vtkSetStringMacro(PolarCoordsAngleArrayName);
vtkGetStringMacro(PolarCoordsAngleArrayName);
//@}
//@{
/**
* Cartesian coordinates array name for the X coordinates.
* This is only used if OutputCartesianCoordinates is True.
* Default: coord_x
*/
vtkSetStringMacro(CartesianCoordsXArrayName);
vtkGetStringMacro(CartesianCoordsXArrayName);
//@}
//@{
/**
* Cartesian coordinates array name for the Y coordinates.
* This is only used if OutputCartesianCoordinates is True.
* Default: coord_y
*/
vtkSetStringMacro(CartesianCoordsYArrayName);
vtkGetStringMacro(CartesianCoordsYArrayName);
//@}
//@{
/**
* Epsilon value used in the algorithm.
* Default = 0.2
*/
vtkSetMacro(Epsilon, float);
vtkGetMacro(Epsilon, float);
//@}
//@{
/**
* Unit Radius value used in the algorithm.
* Default = 1.0
*/
vtkSetMacro(UnitRadius, float);
vtkGetMacro(UnitRadius, float);
//@}
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
protected:
char* KCoreLabelArrayName;
char* PolarCoordsRadiusArrayName;
char* PolarCoordsAngleArrayName;
char* CartesianCoordsXArrayName;
char* CartesianCoordsYArrayName;
bool Cartesian;
bool Polar;
float Epsilon;
float UnitRadius;
private:
vtkKCoreLayout(const vtkKCoreLayout&) = delete;
void operator=(const vtkKCoreLayout&) = delete;
};
#endif