rust/landgen/src/outline.rs
changeset 14113 36b792842d5b
parent 14112 6a3bcb7c2981
child 14114 913be386b413
equal deleted inserted replaced
14112:6a3bcb7c2981 14113:36b792842d5b
    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);