```1
2
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
55
56
57
58
59
60
61
62
63
```
``````// Take a look at the license at the top of the repository in the LICENSE file.

use glib::translate::*;

use crate::{ffi, Path, PathDirection, PathPoint};

impl PathPoint {
/// Calculates the curvature of the path at the point.
///
/// Optionally, returns the center of the osculating circle as well.
/// The curvature is the inverse of the radius of the osculating circle.
///
/// Lines have a curvature of zero (indicating an osculating circle of
/// infinite radius. In this case, the @center is not modified.
///
/// Circles with a radius of zero have `INFINITY` as curvature
///
/// Note that certain points on a path may not have a single curvature,
/// such as sharp turns. At such points, there are two curvatures --
/// the (limit of) the curvature of the path going into the point,
/// and the (limit of) the curvature of the path coming out of it.
/// The @direction argument lets you choose which one to get.
///
/// <picture>
///   <source srcset="curvature-dark.png" media="(prefers-color-scheme: dark)">
///   <img alt="Osculating circle" src="curvature-light.png">
/// </picture>
/// ## `path`
/// the path that @self is on
/// ## `direction`
/// the direction for which to return the curvature
///
/// # Returns
///
/// The curvature of the path at the given point
///
/// ## `center`
/// Return location for
///   the center of the osculating circle
#[doc(alias = "gsk_path_point_get_curvature")]
#[doc(alias = "get_curvature")]
pub fn curvature(
&self,
path: &Path,
direction: PathDirection,
) -> (f32, Option<graphene::Point>) {
unsafe {
let mut center = graphene::Point::uninitialized();
let ret = ffi::gsk_path_point_get_curvature(
self.to_glib_none().0,
path.to_glib_none().0,
direction.into_glib(),
center.to_glib_none_mut().0,
);

if ret == 0.0 {
(ret, None)
} else {
(ret, Some(center))
}
}
}
}
``````