Skip to main content

use_curve/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_point::Point2;
5
6/// A normalized curve parameter in `[0, 1]`.
7#[derive(Debug, Clone, Copy, PartialEq)]
8pub struct CurveParameter {
9    value: f64,
10}
11
12impl CurveParameter {
13    /// Creates a normalized curve parameter.
14    #[must_use]
15    pub const fn new(value: f64) -> Option<Self> {
16        if value.is_finite() && value >= 0.0 && value <= 1.0 {
17            Some(Self { value })
18        } else {
19            None
20        }
21    }
22
23    /// Returns the parameter value.
24    #[must_use]
25    pub const fn value(self) -> f64 {
26        self.value
27    }
28}
29
30/// A sampled 2D curve point.
31#[derive(Debug, Clone, Copy, PartialEq)]
32pub struct CurveSample2 {
33    parameter: CurveParameter,
34    point: Point2,
35}
36
37impl CurveSample2 {
38    /// Creates a curve sample.
39    #[must_use]
40    pub const fn new(parameter: CurveParameter, point: Point2) -> Self {
41        Self { parameter, point }
42    }
43
44    /// Returns the parameter.
45    #[must_use]
46    pub const fn parameter(self) -> CurveParameter {
47        self.parameter
48    }
49
50    /// Returns the sampled point.
51    #[must_use]
52    pub const fn point(self) -> Point2 {
53        self.point
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::{CurveParameter, CurveSample2};
60    use use_point::Point2;
61
62    #[test]
63    fn creates_curve_samples() {
64        let parameter = CurveParameter::new(0.5).expect("valid parameter");
65        let sample = CurveSample2::new(parameter, Point2::new(1.0, 2.0));
66
67        assert_eq!(sample.parameter().value(), 0.5);
68        assert_eq!(sample.point(), Point2::new(1.0, 2.0));
69        assert_eq!(CurveParameter::new(1.5), None);
70    }
71}