tip_angles_intrinsic

`tip_angles_intrinsic(l_sq, F, use_small_angle_approx=True)`

Computes the angles formed by each vertex within its respective face (the tip angle) using only intrinsic information (squared halfedge edge lengths).

Parameters:

Name Type Description Default
`l_sq` `(m,3) numpy array`

squared halfedge lengths as computed by halfedge_lengths_squared

required
`F` `(m,3) numpy int array`

face index list of a triangle mesh

required
`use_small_angle_approx` `bool, optional (default`

If True, uses a different, more more stable formula for small angles.

`True`

Returns:

Type Description

tip angles for each vertex referenced in `F`

Examples:

TODO

Source code in `src/gpytoolbox/tip_angles_intrinsic.py`
 ``` 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54``` ``````def tip_angles_intrinsic(l_sq, F, use_small_angle_approx=True): """Computes the angles formed by each vertex within its respective face (the tip angle) using only intrinsic information (squared halfedge edge lengths). Parameters ---------- l_sq : (m,3) numpy array squared halfedge lengths as computed by halfedge_lengths_squared F : (m,3) numpy int array face index list of a triangle mesh use_small_angle_approx : bool, optional (default: True) If True, uses a different, more more stable formula for small angles. Returns ------- α : (m,3) numpy array tip angles for each vertex referenced in `F` Examples -------- TODO """ assert F.shape[1] == 3 assert l_sq.shape == F.shape assert np.all(l_sq>=0) #Using cosine rule def cr(a, b, c): cosgamma = (a+b-c) / (2.*np.sqrt(a*b)) gamma = np.arccos(np.clip(cosgamma, -1., 1.)) if use_small_angle_approx: #If c is very small, expect numerical error and use a series approx. small = np.sqrt(np.finfo(c.dtype).eps) #This is quite aggressive, can also try without sqrt i = c