equal
deleted
inserted
replaced
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>>( |