haar_lib/math/
linear.rs

1//! $y = ax + b$の直線
2use std::ops::{Add, Mul, Sub};
3
4/// $y = ax + b$の直線を表す。
5#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Default)]
6pub struct Linear<T> {
7    /// ‍直線の傾き
8    pub a: T,
9    /// 直線のy切片
10    pub b: T,
11}
12
13impl<T> Linear<T> {
14    /// $y = ax + b$の一次関数を返す。
15    pub fn new(a: T, b: T) -> Self {
16        Self { a, b }
17    }
18}
19
20impl<T: Add<Output = T> + Mul<Output = T> + Copy> Linear<T> {
21    /// `x`に値を代入した結果を返す。
22    pub fn apply(&self, x: T) -> T {
23        self.a * x + self.b
24    }
25}
26
27impl<T: Sub<Output = T> + Mul<Output = T> + Copy> Linear<T> {
28    /// x方向に`dx`だけ平行移動した直線を返す。
29    pub fn mov_x(&self, dx: T) -> Self {
30        Self {
31            a: self.a,
32            b: self.b - self.a * dx,
33        }
34    }
35}