

<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

## Basic trigonometry

For example, the circumcenter of a triangle, which is the position of
the dual Voronoi vertex.

### Coding style notes

Throughout, we will (attempt to) provide a type signature for all
functions. To do so for array-based functions, we use
[jaxtyping](https://docs.kidger.site/jaxtyping).

### JAX

The aim is to create a triangulation datastructure compatible with the
JAX library for automatic differentiation and numerical computing. In
practice, this means that we use `jnp` (=`jax.numpy`) instead of
`numpy`, and make sure our code follows JAX’s functional programming
paradigm (see [JAX- the sharp
bits](https://docs.jax.dev/en/latest/notebooks/Common_Gotchas_in_JAX.html)).

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L46"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_polygon_area

``` python

def get_polygon_area(
    pts:Float[Array, 'n_vertices 2']
)->Float[Array, '']:

```

*Area of 2D polygon assuming no self-intersection.*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L40"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_triangle_area

``` python

def get_triangle_area(
    a:Float[Array, 'dim'], b:Float[Array, 'dim'], c:Float[Array, 'dim']
)->Float[Array, '']:

```

*Unoriented area of triangle with vertices a, b, c. Works in dim 2 or
3.*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L34"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_oriented_triangle_area

``` python

def get_oriented_triangle_area(
    a:Float[Array, 'dim'], b:Float[Array, 'dim'], c:Float[Array, 'dim']
)->Float[Array, '*']:

```

*Signed area of triangle with vertices a, b, c. If d=2, returns a
scalar, if d=3, a vector.*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L24"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_circumcenter

``` python

def get_circumcenter(
    a:Float[Array, 'dim'], b:Float[Array, 'dim'], c:Float[Array, 'dim'], zero_clip:float=1e-10
)->Float[Array, 'dim']:

```

*Return circumcenter coordinates of triangle with vertices a, b, c*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L63"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_cot_between_vectors

``` python

def get_cot_between_vectors(
    a:Float[Array, 'dim'], b:Float[Array, 'dim']
)->Float[Array, '']:

```

*Cotangent of angle between two vectors*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L57"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_angle_between_vectors

``` python

def get_angle_between_vectors(
    a:Float[Array, 'dim'], b:Float[Array, 'dim']
)->Float[Array, '']:

```

*Angle between two vectors*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L51"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_signed_angle_between_vectors

``` python

def get_signed_angle_between_vectors(
    a:Float[Array, '2'], b:Float[Array, '2']
)->Float[Array, '']:

```

*Signed angle between two 2d vectors*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L87"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_oriented_voronoi_corner_area

``` python

def get_oriented_voronoi_corner_area(
    a:Float[Array, 'dim'], b:Float[Array, 'dim'], c:Float[Array, 'dim'], zero_clip:float=1e-10
)->Float[Array, '*']:

```

*Compute oriented Voronoi area at corner a of triangle abc. Returns a
vector in 3d.* Returns zero for a degenerate triangle.

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L71"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_voronoi_corner_area

``` python

def get_voronoi_corner_area(
    a:Float[Array, 'dim'], b:Float[Array, 'dim'], c:Float[Array, 'dim'], zero_clip:float=1e-10
)->Float[Array, '*']:

```

*Compute Voronoi area at corner a of triangle abc.* Returns zero for a
degenerate triangle.

``` python
get_voronoi_corner_area(jnp.array([0.,0.]), jnp.array([0.,1.]),  jnp.array([1.,0.]))
```

    Array(-0.25, dtype=float64)

``` python
get_circumcenter(jnp.array([0.,0.]), jnp.array([0.,1.]),  jnp.array([1.,0.]))
```

    Array([0.5, 0.5], dtype=float64)

``` python
get_signed_angle_between_vectors(jnp.array([1.,0.]), jnp.array([0.5,0.5])) * (180/jnp.pi)
```

    Array(45., dtype=float64)

``` python
get_polygon_area(jnp.array([[0.,0.], [0.,1.], [1.,0.]]) ), get_triangle_area(*jnp.array([[0.,0.], [0.,1.], [1.,0.]]) )
```

    (Array(0.5, dtype=float64), Array(0.5, dtype=float64))

``` python
get_circumcenter(jnp.array([0.,0.]), jnp.array([0.,1.]),  jnp.array([1.,0.]))
```

    Array([0.5, 0.5], dtype=float64)

``` python
get_circumcenter(jnp.array([1.,0.]), jnp.array([1.,0.]),  jnp.array([0.,1.]))
```

    Array([0., 0.], dtype=float64)

``` python
get_circumcenter(jnp.array([1.,0.]), jnp.array([2.,0.]),  jnp.array([1.,0.]))
```

    Array([0., 0.], dtype=float64)

``` python
get_voronoi_corner_area(jnp.array([0.,0.]), jnp.array([0.,1.]),  jnp.array([1.,0.]))
```

    Array(-0.25, dtype=float64)

### Normals and rotation matrices in 3D

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L117"
target="_blank" style="float:right; font-size:smaller">source</a>

### quaternion_to_rot_max

``` python

def quaternion_to_rot_max(
    q:Float[Array, '4']
)->Float[Array, '3 3']:

```

*Convert unit quaternion into a 3d rotation matrix.*

See
https://fr.wikipedia.org/wiki/Quaternions_et_rotation_dans_l%27espace

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L110"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_triangle_normal

``` python

def get_triangle_normal(
    a:Float[Array, '3'], b:Float[Array, '3'], c:Float[Array, '3']
)->Float[Array, '3']:

```

*Compute unit normal vector of triangle abc.*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L106"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_perp_2d

``` python

def get_perp_2d(
    x:Float[Array, '... 2']
)->Float[Array, '... 2']:

```

*Get perpendicular vector.*

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L102"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_rot_mat

``` python

def get_rot_mat(
    theta:float
)->Float[Array, '2 2']:

```

*Get 2D rotation matrix from angle in radians.*

### Barycentric coordinates

------------------------------------------------------------------------

<a
href="https://github.com/nikolas-claussen/triangulax/blob/main/triangulax/trigonometry.py#L130"
target="_blank" style="float:right; font-size:smaller">source</a>

### get_barycentric_coordinates

``` python

def get_barycentric_coordinates(
    point:Float[Array, 'dim'], a:Float[Array, 'dim'], b:Float[Array, 'dim'], c:Float[Array, 'dim'],
    zero_clip:float=1e-10, normalize:bool=True
)->Float[Array, '3']:

```

*Compute barycentric coordinates of point with respect to triangle abc.*

``` python
vertices = jnp.array([[0., 0 ], [0., 1.], [1., 0.]])
point1 = jnp.array([0.5, 0.2])

get_barycentric_coordinates(point1, *vertices, normalize=False)
```

    Array([0. , 0.2, 0.5], dtype=float64)

``` python
vertices2 = jnp.array([[0., 0, 0], [0., 1., 0], [1., 0., 0]])
point2 = jnp.array([0.5, 0.2, 0.])

get_barycentric_coordinates(point2, *vertices2, normalize=False)
```

    Array([0. , 0.2, 0.5], dtype=float64)

``` python
point3 = jnp.array([0.5, 0.2, 1.])

get_barycentric_coordinates(point3, *vertices2, normalize=False)
```

    Array([0. , 0.2, 0.5], dtype=float64)
