rust/integral-geometry/src/lib.rs
changeset 15025 dc4a12a84c92
parent 14726 75ff5c643004
child 15182 decb2f1c682b
equal deleted inserted replaced
15024:af2f6f4074de 15025:dc4a12a84c92
     1 use fpnum::{distance, fp, FPNum, FPPoint};
     1 use fpnum::{distance, fp, FPNum, FPPoint};
     2 use std::{
     2 use std::{
     3     cmp::{max, min},
     3     cmp::{max, min},
     4     ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Range, RangeInclusive, Sub, SubAssign},
     4     ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, RangeInclusive, Sub, SubAssign},
     5 };
     5 };
     6 
     6 
     7 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
     7 #[derive(PartialEq, Eq, Clone, Copy, Debug)]
     8 pub struct Point {
     8 pub struct Point {
     9     pub x: i32,
     9     pub x: i32,
   414         self.top()..=self.bottom()
   414         self.top()..=self.bottom()
   415     }
   415     }
   416 
   416 
   417     #[inline]
   417     #[inline]
   418     pub fn contains(&self, point: Point) -> bool {
   418     pub fn contains(&self, point: Point) -> bool {
   419         self.x_range().contains(point.x) && self.y_range().contains(point.y)
   419         self.x_range().contains(&point.x) && self.y_range().contains(&point.y)
   420     }
   420     }
   421 
   421 
   422     #[inline]
   422     #[inline]
   423     pub fn contains_inside(&self, point: Point) -> bool {
   423     pub fn contains_inside(&self, point: Point) -> bool {
   424         point.x > self.left()
   424         point.x > self.left()
   462     }
   462     }
   463 
   463 
   464     #[inline]
   464     #[inline]
   465     pub fn quotient(self, x: usize, y: usize) -> Point {
   465     pub fn quotient(self, x: usize, y: usize) -> Point {
   466         self.top_left() + Point::new((x % self.width()) as i32, (y % self.height()) as i32)
   466         self.top_left() + Point::new((x % self.width()) as i32, (y % self.height()) as i32)
   467     }
       
   468 }
       
   469 
       
   470 trait RangeContains<T> {
       
   471     fn contains(&self, value: T) -> bool;
       
   472 }
       
   473 
       
   474 impl<T: Ord> RangeContains<T> for Range<T> {
       
   475     fn contains(&self, value: T) -> bool {
       
   476         value >= self.start && value < self.end
       
   477     }
       
   478 }
       
   479 
       
   480 impl<T: Ord> RangeContains<T> for RangeInclusive<T> {
       
   481     fn contains(&self, value: T) -> bool {
       
   482         value >= *self.start() && value <= *self.end()
       
   483     }
   467     }
   484 }
   468 }
   485 
   469 
   486 trait RangeClamp<T> {
   470 trait RangeClamp<T> {
   487     fn clamp(&self, value: T) -> T;
   471     fn clamp(&self, value: T) -> T;