Source code for compas.datastructures.mesh.curvature
from __future__ import print_function
from __future__ import absolute_import
from __future__ import division
from math import pi
from compas.geometry import angle_points
__all__ = [
'trimesh_mean_curvature',
'trimesh_gaussian_curvature'
]
def trimesh_mean_curvature(mesh):
pass
[docs]def trimesh_gaussian_curvature(mesh):
r"""Compute the gaussian curvature at the vertices of a triangle mesh using the angular deficit.
Parameters
----------
mesh : compas.oatastructures.Mesh
The triangle mesh data structure.
Returns
-------
list of float
Per vertex curvature values.
Warnings
--------
This function will not check if the provided mesh is actually a triangle mesh.
It will just treat it as such...
Notes
-----
The angular deficit at a vertex is defined as the difference between a full
circle angle (:math:`2\pi`) and the sum of the angles in the adjacent trianlges.
.. math::
k_{G}(v_{i}) = 2\pi - \sum_{j \in N(i)} \teta_{ij}
where :math:`N(i)` are the triangles incident on vertex :math:`i` and :math:`\teta_{ij}`
is the angle at vertex :math:`i` in triangle :math:`j`.
"""
pi2 = 2 * pi
key_xyz = {key: mesh.vertex_attributes(key, 'xyz') for key in mesh.vertices()}
curvature = []
for key in mesh.vertices():
angles = []
o = key_xyz[key]
for u in mesh.vertex_neighbors(key):
fkey = mesh.halfedge[key][u]
if fkey is not None:
vertices = mesh.face_vertices(fkey)
v = vertices[vertices.index(key) - 1]
a = key_xyz[u]
b = key_xyz[v]
angles.append(angle_points(o, a, b))
curvature.append(pi2 - sum(angles))
return curvature
# ==============================================================================
# Main
# ==============================================================================
if __name__ == "__main__":
import doctest
doctest.testmod(globs=globals())