rust/landgen/src/outline.rs
changeset 14116 83bd383e6d11
parent 14115 1dcd7e5e0aee
child 14121 69db1d2e4cec
equal deleted inserted replaced
14115:1dcd7e5e0aee 14116:83bd383e6d11
   104         let min_distance = 40;
   104         let min_distance = 40;
   105         // new point should fall inside this box
   105         // new point should fall inside this box
   106         let map_box = self.play_box.with_margin(min_distance);
   106         let map_box = self.play_box.with_margin(min_distance);
   107 
   107 
   108         let p = segment.scaled_normal();
   108         let p = segment.scaled_normal();
       
   109         let p_norm = p.integral_norm();
   109         let mid_point = segment.center();
   110         let mid_point = segment.center();
   110 
   111 
   111         if (p.integral_norm() < min_distance as u32 * 3) || !map_box.contains_inside(mid_point) {
   112         if (p_norm < min_distance as u32 * 3) || !map_box.contains_inside(mid_point) {
   112             return None;
   113             return None;
   113         }
   114         }
   114 
   115 
   115         let mut dist_left = (self.size.width + self.size.height) as u32;
   116         let mut dist_left = (self.size.width + self.size.height) as u32;
   116         let mut dist_right = dist_left;
   117         let mut dist_right = dist_left;
   194                     }
   195                     }
   195                 }
   196                 }
   196             }
   197             }
   197         }
   198         }
   198 
   199 
   199         let max_dist = p.integral_norm() * 100 / distance_divisor;
   200         let max_dist = p_norm * 100 / distance_divisor;
   200         dist_left = min(dist_left, max_dist);
   201         dist_left = min(dist_left, max_dist);
   201         dist_right = min(dist_right, max_dist);
   202         dist_right = min(dist_right, max_dist);
   202 
   203 
   203         if dist_right + dist_left < min_distance as u32 * 2 + 10 {
   204         if dist_right + dist_left < min_distance as u32 * 2 + 10 {
   204             // limits are too narrow, just divide
   205             // limits are too narrow, just divide
   208             let d = -(dist_right as i32)
   209             let d = -(dist_right as i32)
   209                 + min_distance
   210                 + min_distance
   210                 + random_numbers.next().unwrap() as i32
   211                 + random_numbers.next().unwrap() as i32
   211                     % (dist_right as i32 + dist_left as i32 - min_distance * 2);
   212                     % (dist_right as i32 + dist_left as i32 - min_distance * 2);
   212 
   213 
   213             let norm = p.integral_norm() as i32;
       
   214             Some(Point::new(
   214             Some(Point::new(
   215                 mid_point.x + p.x * d / norm,
   215                 mid_point.x + p.x * d / p_norm as i32,
   216                 mid_point.y + p.y * d / norm,
   216                 mid_point.y + p.y * d / p_norm as i32,
   217             ))
   217             ))
   218         }
   218         }
   219     }
   219     }
   220 
   220 
   221     fn divide_edges<I: Iterator<Item = u32>>(
   221     fn divide_edges<I: Iterator<Item = u32>>(