# 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
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)*