rust/landgen/src/outline.rs
changeset 14109 913be386b413
parent 14108 36b792842d5b
child 14110 21642eb0ff29
equal deleted inserted replaced
14108:36b792842d5b 14109:913be386b413
    66         distance_divisor: u32,
    66         distance_divisor: u32,
    67         random_numbers: &mut I,
    67         random_numbers: &mut I,
    68     ) -> Option<Point> {
    68     ) -> Option<Point> {
    69         #[inline]
    69         #[inline]
    70         fn intersect(p: &Point, m: &Point, p1: &Point, p2: &Point) -> bool {
    70         fn intersect(p: &Point, m: &Point, p1: &Point, p2: &Point) -> bool {
    71             let t1 = (m - p1).cross(p);
    71             let t1 = (*m - *p1).cross(*p);
    72             let t2 = (m - p2).cross(p);
    72             let t2 = (*m - *p2).cross(*p);
    73 
    73 
    74             (t1 > 0) != (t2 > 0)
    74             (t1 > 0) != (t2 > 0)
    75         }
    75         }
    76 
    76 
    77         #[inline]
    77         #[inline]
   110 
   110 
   111         if (p.integral_norm() < min_distance as u32 * 3) || !map_box.contains_inside(mid_point) {
   111         if (p.integral_norm() < min_distance as u32 * 3) || !map_box.contains_inside(mid_point) {
   112             return None;
   112             return None;
   113         }
   113         }
   114 
   114 
   115         let full_box = Rect::from_size(Point::zero(), self.size).with_margin(min_distance);
   115         let full_box = Rect::at_origin(self.size).with_margin(min_distance);
   116 
   116 
   117         let mut dist_left = (self.size.width + self.size.height) as u32;
   117         let mut dist_left = (self.size.width + self.size.height) as u32;
   118         let mut dist_right = dist_left;
   118         let mut dist_right = dist_left;
   119 
   119 
   120         // find distances to map borders
   120         // find distances to map borders
   121         if p.x != 0 {
   121         if p.x != 0 {
   122             // check against left border
   122             // check against left border
   123             let iyl = (map_box.left() - mid_point.x) * p.y / p.x + mid_point.y;
   123             let iyl = (map_box.left() - mid_point.x) * p.y / p.x + mid_point.y;
   124             let dl = Point::new(mid_point.x - map_box.left(), mid_point.y - iyl).integral_norm();
   124             let dl = Point::new(mid_point.x - map_box.left(), mid_point.y - iyl).integral_norm();
   125             let t = p.dot(mid_point - Point::new(full_box.left(), iy1));
   125             let t = p.dot(mid_point - Point::new(full_box.left(), iyl));
   126 
   126 
   127             if t > 0 {
   127             if t > 0 {
   128                 dist_left = dl;
   128                 dist_left = dl;
   129             } else {
   129             } else {
   130                 dist_right = dl;
   130                 dist_right = dl;
   143 
   143 
   144         if p.y != 0 {
   144         if p.y != 0 {
   145             // top border
   145             // top border
   146             let ixl = (map_box.top() - mid_point.y) * p.x / p.y + mid_point.x;
   146             let ixl = (map_box.top() - mid_point.y) * p.x / p.y + mid_point.x;
   147             let dl = Point::new(mid_point.y - map_box.top(), mid_point.x - ixl).integral_norm();
   147             let dl = Point::new(mid_point.y - map_box.top(), mid_point.x - ixl).integral_norm();
   148             let t = p.dot(mid_point - Point::new(ix1, full_box.top());
   148             let t = p.dot(mid_point - Point::new(ixl, full_box.top()));
   149 
   149 
   150             if t > 0 {
   150             if t > 0 {
   151                 dist_left = min(dist_left, dl);
   151                 dist_left = min(dist_left, dl);
   152             } else {
   152             } else {
   153                 dist_right = min(dist_right, dl);
   153                 dist_right = min(dist_right, dl);