55 fn divide_edge<I: Iterator<Item = u32>>( |
56 fn divide_edge<I: Iterator<Item = u32>>( |
56 &self, |
57 &self, |
57 segment: Line, |
58 segment: Line, |
58 random_numbers: &mut I, |
59 random_numbers: &mut I, |
59 ) -> Option<Point> { |
60 ) -> Option<Point> { |
|
61 let min_distance = 40; |
|
62 // new point should fall inside this box |
|
63 let map_box = self.play_box.with_margin(min_distance); |
|
64 |
|
65 let p = Point::new( |
|
66 segment.end.y - segment.start.y, |
|
67 segment.start.x - segment.start.y, |
|
68 ); |
|
69 let mid_point = segment.center(); |
|
70 |
|
71 if (p.integral_norm() < min_distance as u32 * 3) || !map_box.contains_inside(p) { |
|
72 return None; |
|
73 } |
|
74 |
|
75 let full_box = Rect::from_size(Point::zero(), self.size).with_margin(min_distance); |
|
76 |
|
77 let mut dist_left = (self.size.width + self.size.height) as u32; |
|
78 let mut dist_right = dist_left; |
|
79 |
|
80 // find distances to map borders |
|
81 if p.x != 0 { |
|
82 // check against left border |
|
83 let iyl = (map_box.left() - mid_point.x) * p.y / p.x + mid_point.y; |
|
84 let dl = Point::new(mid_point.x - map_box.left(), mid_point.y - iyl).integral_norm(); |
|
85 let t = p.x * (mid_point.x - full_box.left()) + p.y * (mid_point.y - iyl); |
|
86 |
|
87 if t > 0 { |
|
88 dist_left = dl; |
|
89 } else { |
|
90 dist_right = dl; |
|
91 } |
|
92 |
|
93 // right border |
|
94 let iyr = (map_box.right() - mid_point.x) * p.y / p.x + mid_point.y; |
|
95 let dr = Point::new(mid_point.x - full_box.right(), mid_point.y - iyr).integral_norm(); |
|
96 |
|
97 if t > 0 { |
|
98 dist_right = dr; |
|
99 } else { |
|
100 dist_left = dr; |
|
101 } |
|
102 } |
|
103 |
|
104 if p.y != 0 { |
|
105 // top border |
|
106 let ixl = (map_box.top() - mid_point.y) * p.x / p.y + mid_point.x; |
|
107 let dl = Point::new(mid_point.y - map_box.top(), mid_point.x - ixl).integral_norm(); |
|
108 let t = p.y * (mid_point.y - full_box.top()) + p.x * (mid_point.x - ixl); |
|
109 |
|
110 if t > 0 { |
|
111 dist_left = min(dist_left, dl); |
|
112 } else { |
|
113 dist_right = min(dist_right, dl); |
|
114 } |
|
115 |
|
116 // bottom border |
|
117 let ixr = (map_box.bottom() - mid_point.y) * p.x / p.y + mid_point.x; |
|
118 let dr = Point::new(mid_point.y - full_box.bottom(), mid_point.x - ixr).integral_norm(); |
|
119 |
|
120 if t > 0 { |
|
121 dist_right = min(dist_right, dr); |
|
122 } else { |
|
123 dist_left = min(dist_left, dr); |
|
124 } |
|
125 } |
|
126 |
|
127 // now go through all other segments |
|
128 |
60 None |
129 None |
61 } |
130 } |
62 |
131 |
63 fn divide_edges<I: Iterator<Item = u32>>(&mut self, random_numbers: &mut I) { |
132 fn divide_edges<I: Iterator<Item = u32>>(&mut self, random_numbers: &mut I) { |
64 for is in 0..self.islands.len() { |
133 for is in 0..self.islands.len() { |