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.x - p1.x) * p.y - p.x * (m.y - p1.y); |
71 let t1 = (m - p1).cross(p); |
72 let t2 = (m.x - p2.x) * p.y - p.x * (m.y - p2.y); |
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] |
78 fn solve_intersection(p: &Point, m: &Point, s: &Point, e: &Point) -> Option<(i32, u32)> { |
78 fn solve_intersection(p: &Point, m: &Point, s: &Point, e: &Point) -> Option<(i32, u32)> { |
79 let f = *e - *s; |
79 let f = *e - *s; |
80 let aqpb = (p.x * f.y - f.x * p.y) as i64; |
80 let aqpb = p.cross(f) as i64; |
81 |
81 |
82 if aqpb != 0 { |
82 if aqpb != 0 { |
83 let iy = ((((s.x - m.x) as i64 * p.y as i64 + m.y as i64 * p.x as i64) |
83 let iy = ((((s.x - m.x) as i64 * p.y as i64 + m.y as i64 * p.x as i64) |
84 * f.y as i64 |
84 * f.y as i64 |
85 - s.y as i64 * f.x as i64 * p.y as i64) |
85 - s.y as i64 * f.x as i64 * p.y as i64) |
91 }; |
91 }; |
92 |
92 |
93 let intersection_point = Point::new(ix, iy); |
93 let intersection_point = Point::new(ix, iy); |
94 let diff_point = *m - intersection_point; |
94 let diff_point = *m - intersection_point; |
95 let d = diff_point.integral_norm(); |
95 let d = diff_point.integral_norm(); |
96 let t = p.y * diff_point.y + p.x * diff_point.x; |
96 let t = p.dot(diff_point); |
97 |
97 |
98 Some((t, d)) |
98 Some((t, d)) |
99 } else { |
99 } else { |
100 None |
100 None |
101 } |
101 } |
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.x * (mid_point.x - full_box.left()) + p.y * (mid_point.y - iyl); |
125 let t = p.dot(mid_point - Point::new(full_box.left(), iy1)); |
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.y * (mid_point.y - full_box.top()) + p.x * (mid_point.x - ixl); |
148 let t = p.dot(mid_point - Point::new(ix1, 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); |