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