Skip to content

Misc Quantities

Surface Graph Quantity

The surface graph quantity is a collection of nodes and straight-line edges between them. Each node is given as a position in 3D space—this quantity does not really have any relationship to the underlying surface, execpt that it is managed as a surface quantity.

Nodes will be drawn as spheres, and the connecting edges drawn as cylinders. This quantity can be useful for visualizing paths on the surface, or wireframes.

Example: drawing mesh’s dual with geometry-central.


#include "polyscope/surface_mesh.h"

// geometry-central things

std::vector<Vector3> positions;
std::vector<std::array<size_t, 2>> edgeInds;

// Build the node positions
for (Face f : mesh->faces()) {

  // Compute center for face
  Vector3 c = Vector3::zero();
  for (Vertex v : f.adjacentVertices()) {
    c += geom->inputVertexPositions[v];
  c /=;


// Build the edge indices
for (Edge e : mesh->edges()) {

  // Connect the nodes from the two faces adjacent to each edge
  size_t fa = geom->faceIndices[e.halfedge().face()];
  size_t fb = geom->faceIndices[e.halfedge().twin().face()];

  edgeInds.push_back({fa, fb});

polyscope::getSurfaceMesh("my mesh")->
  addSurfaceGraphQuantity("dual graph", positions, edgeInds);
SurfaceMesh::addSurfaceGraphQuantity(std::string name, const P& nodes, const E& edges)

Add a new surface graph quantity to the structure.

  • nodes is the list of 3D positions for the graph nodes. The type should be adaptable to a list of float-valued 3-vectors.
  • edges is the list of edges for the graph, where each entry is two 0-based indices in to the nodes array. The type should be adaptable to a list of size_t-valued 2-vectors (aka pairs of indices).

The resulting class has color and radius fields which can be set to adjust the appearance of the resulting graph.