# `Monty.Geometry.SurfacePoseVectors`
[🔗](https://github.com/d-led/ex.tbp.monty/blob/v0.1.0/packages/ex_tbp_monty_core/lib/monty/geometry/surface_pose_vectors.ex#L1)

Surface normal and the two principal curvature directions.

Mirrors `tbp/monty/geometry.py::SurfacePoseVectors`.

`value` is a 3×3 matrix in row-major order, in `[z (surface normal),
x (principal curvature 1), y (principal curvature 2)]` order. It is meant to
be a proper rotation (determinant 1, orthonormal rows); like the Python class
this module does not validate that, because Monty itself constructs
degenerate instances when the curvature estimate is flat.

# `t`

```elixir
@type t() :: %Monty.Geometry.SurfacePoseVectors{value: [vector()]}
```

# `vector`

```elixir
@type vector() :: [float()]
```

# `new`

```elixir
@spec new(vector(), vector(), vector()) :: t()
```

Builds pose vectors from three row vectors.

# `principal_curvature_1`

```elixir
@spec principal_curvature_1(t()) :: vector()
```

# `principal_curvature_2`

```elixir
@spec principal_curvature_2(t()) :: vector()
```

# `surface_normal`

```elixir
@spec surface_normal(t()) :: vector()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
