160 for s in self.segments_iter() { |
160 for s in self.segments_iter() { |
161 if s != segment { |
161 if s != segment { |
162 if intersect(&p, &mid_point, &s.start, &s.end) { |
162 if intersect(&p, &mid_point, &s.start, &s.end) { |
163 if let Some((t, d)) = solve_intersection(&p, &mid_point, &s.start, &s.end) { |
163 if let Some((t, d)) = solve_intersection(&p, &mid_point, &s.start, &s.end) { |
164 if t > 0 { |
164 if t > 0 { |
165 dist_left = min(d, dist_left); |
165 dist_right = min(dist_right, d); |
166 } else { |
166 } else { |
167 dist_right = min(d, dist_right); |
167 dist_left = min(dist_left, d); |
168 } |
168 } |
169 } |
169 } |
170 } |
170 } |
171 } |
171 } |
172 } |
172 } |
176 if *pi != segment.start && *pi != segment.end { |
176 if *pi != segment.start && *pi != segment.end { |
177 if intersect(&p, &pi, &segment.start, &segment.end) { |
177 if intersect(&p, &pi, &segment.start, &segment.end) { |
178 // ray from segment.start |
178 // ray from segment.start |
179 if let Some((t, d)) = solve_intersection(&p, &mid_point, &segment.start, &pi) { |
179 if let Some((t, d)) = solve_intersection(&p, &mid_point, &segment.start, &pi) { |
180 if t > 0 { |
180 if t > 0 { |
181 dist_left = min(d, dist_left); |
181 dist_right = min(dist_right, d); |
182 } else { |
182 } else { |
183 dist_right = min(d, dist_right); |
183 dist_left = min(dist_left, d); |
184 } |
184 } |
185 } |
185 } |
186 |
186 |
187 // ray from segment.end |
187 // ray from segment.end |
188 if let Some((t, d)) = solve_intersection(&p, &mid_point, &segment.end, &pi) { |
188 if let Some((t, d)) = solve_intersection(&p, &mid_point, &segment.end, &pi) { |
189 if t > 0 { |
189 if t > 0 { |
190 dist_left = min(d, dist_left); |
190 dist_right = min(dist_right, d); |
191 } else { |
191 } else { |
192 dist_right = min(d, dist_right); |
192 dist_left = min(dist_left, d); |
193 } |
193 } |
194 } |
194 } |
195 } |
195 } |
196 } |
196 } |
197 } |
197 } |
202 |
202 |
203 if dist_right + dist_left < min_distance as u32 * 2 + 10 { |
203 if dist_right + dist_left < min_distance as u32 * 2 + 10 { |
204 // limits are too narrow, just divide |
204 // limits are too narrow, just divide |
205 Some(mid_point) |
205 Some(mid_point) |
206 } else { |
206 } else { |
207 // select distance within [-dist_left; dist_right], keeping min_distance in mind |
207 // select distance within [-dist_right; dist_left], keeping min_distance in mind |
208 let d = -(dist_left as i32) |
208 let d = -(dist_right as i32) |
209 + min_distance |
209 + min_distance |
210 + random_numbers.next().unwrap() as i32 |
210 + random_numbers.next().unwrap() as i32 |
211 % (dist_right as i32 + dist_left as i32 - min_distance * 2); |
211 % (dist_right as i32 + dist_left as i32 - min_distance * 2); |
212 |
212 |
|
213 let offset = d / p.integral_norm() as i32; |
213 Some(Point::new( |
214 Some(Point::new( |
214 mid_point.x + p.x * d / distance_divisor as i32, |
215 mid_point.x + p.x * offset as i32, |
215 mid_point.y + p.y * d / distance_divisor as i32, |
216 mid_point.y + p.y * offset as i32, |
216 )) |
217 )) |
217 } |
218 } |
218 } |
219 } |
219 |
220 |
220 fn divide_edges<I: Iterator<Item = u32>>( |
221 fn divide_edges<I: Iterator<Item = u32>>( |