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.

surface_graph_demo

#include "polyscope/surface_mesh.h"

// geometry-central things
geom->requireFaceIndices();

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 /= f.degree();

  positions.push_back(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.

Options

Parameter Meaning Getter Setter Persistent?
enabled is the quantity enabled? bool isEnabled() setEnabled(bool newVal) yes
radius the radius the graph is drawn with double getRadius() setRadius(double val, bool isRelative=true) yes
color the color to draw the graph with glm::vec3 getVectorColor() setVectorColor(glm::vec3 val) yes

(all setters return this to support chaining. setEnabled() returns generic quantity, so chain it last)