rust/landgen/src/outline.rs
changeset 14113 be4419243735
parent 14111 269f13ac670d
child 14114 9eca6f2cac6d
equal deleted inserted replaced
14112:f04bc39f0c05 14113:be4419243735
   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>>(