use crate::common::Result; use crate::{Exceptions, Point}; use super::{Direction, RegressionLineTrait}; #[inline(always)] pub fn intersect( l1: &T, l2: &T2, ) -> Result { if !(l1.isValid() && l2.isValid()) { return Err(Exceptions::ILLEGAL_STATE); } let d = l1.a() * l2.b() - l1.b() * l2.a(); let x = (l1.c() * l2.b() - l1.b() * l2.c()) / d; let y = (l1.a() * l2.c() - l1.c() * l2.a()) / d; Ok(Point { x, y }) } #[allow(dead_code)] #[inline(always)] pub fn opposite(dir: Direction) -> Direction { if dir == Direction::Left { Direction::Right } else { Direction::Left } } #[inline(always)] pub fn UpdateMinMax(min: &mut T, max: &mut T, val: T) { *min = std::cmp::min(*min, val); *max = std::cmp::max(*max, val); } #[inline(always)] pub fn UpdateMinMaxFloat(min: &mut f64, max: &mut f64, val: f64) { *min = f64::min(*min, val); *max = f64::max(*max, val); } // template>> pub fn ToString>(val: T, len: usize) -> Result { let mut len = len; let mut val = val.into(); let mut result: String = vec!['0'; len].iter().collect(); len -= 1; // std::string result(len--, '0'); if (val < 0) { return Err(Exceptions::format_with("Invalid value")); } while len >= 0 && val != 0 { result.replace_range(len..len, &char::from(b'0' + (val % 10) as u8).to_string()); len -= 1; val /= 10; } // for (; len >= 0 && val != 0; --len, val /= 10) { // result[len] = '0' + val % 10;} if (val != 0) { return Err(Exceptions::format_with("Invalid value")); } Ok(result) }