# Discrete Gauss-Bonnet theorem in Blender

I watched this video from Keenan Crane this morning. The discrete Gauss-Bonnet theorem impresses me so much and I think I can illustrate it in Blender scripting.

The discrete Gauss-Bonnet theorem(quoted from here):

Consider a (connected, orientable) simplicial surface \( \mathbf{K} \) with finitely many vertices \( \mathbf{V} \), edges \( \mathbf{E} \) and faces \( \mathbf{F} \). A discrete analog of the Gauss-Bonnet theorem holds for simplicial surfaces, namely

where \( \chi = |\mathbf{V}| - |\mathbf{E}| + |\mathbf{F}|\) is the *Euler characteristic* of the surface,
and \( d(v) \) is the *angle defect*:

where \( \mathbf{F}_v \) is the faces containing \( v \) and \( \angle_f(v) \) is the interior angle of the face \( f \) at vertex \( v \).

The implementation is straightforward from the above theorem statements. I put my source code on the gist. You can run it as a Blender operator. And remember to check Blenderâ€™s info view for results.

There is one thing worthing noting.
In my first try of implementing this operator,
I traverse `link_edges`

for each vertex to calculate interior angles,
expecting that the adjacent edges are stored in `link_edges`

sequence.

However this does not work as expected. The edges in `link_edges`

are not arranged in any specific order(neither clock-wise nor counter-clock-wise). Therefore I can not make any assumption on it.

Then I try another approach: I traverse faces in `link_faces`

for each vertex,
and find the adjacent edges from the face.
This approach works for me.

I kept both implementations(`AngleDefects`

and `AngleDefects2`

) in my source code,
so you can play around with them.