Showing
1 changed file
with
23 additions
and
63 deletions
| ... | ... | @@ -74,7 +74,6 @@ where T: Add<Output = T> + Debug + Copy + From<i32> { |
| 74 | 74 | type Item = Coordinate<T>; |
| 75 | 75 | |
| 76 | 76 | fn next(&mut self) -> Option<Self::Item> { |
| 77 | - println!("== LineIterator next: {:?}", self); | |
| 78 | 77 | match self.a { |
| 79 | 78 | None => None, |
| 80 | 79 | Some(a) => { |
| ... | ... | @@ -273,14 +272,18 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
| 273 | 272 | + Debug + Copy + From<i32> { |
| 274 | 273 | |
| 275 | 274 | fn new(p :&'a Polygon<T>, direction :Direction) -> Self { |
| 276 | - let mut v = VertexIterator { p: p | |
| 277 | - , top: p.vert_min() | |
| 278 | - , current: Some(p.vert_min()) | |
| 279 | - , edge: None | |
| 280 | - , direction: direction }; | |
| 281 | - v.next_edge(); | |
| 282 | - println!("== new: {:?}", v); | |
| 283 | - v | |
| 275 | + let top = p.vert_min(); | |
| 276 | + let next = p.next_y(top, direction); | |
| 277 | + let edge = match next { | |
| 278 | + None => None, | |
| 279 | + Some(next) => Some(p.vertex(top).edge_iter(&p.vertex(next))), | |
| 280 | + }; | |
| 281 | + | |
| 282 | + VertexIterator { p: p | |
| 283 | + , top: top | |
| 284 | + , current: next | |
| 285 | + , edge: edge | |
| 286 | + , direction: direction } | |
| 284 | 287 | } |
| 285 | 288 | |
| 286 | 289 | // if this yields "None" we are finished. |
| ... | ... | @@ -289,8 +292,6 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
| 289 | 292 | let next = self.p.next_y(current, self.direction)?; |
| 290 | 293 | let mut edge = self.p.vertex(current).edge_iter(&self.p.vertex(next)); |
| 291 | 294 | |
| 292 | - println!("== next: {:?} {:?} {:?}", current, next, edge); | |
| 293 | - | |
| 294 | 295 | match edge.next() { |
| 295 | 296 | // It should be impossible that a new edge iterator has no values |
| 296 | 297 | // at all… anyway, just in case I handle it here. |
| ... | ... | @@ -311,9 +312,7 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
| 311 | 312 | |
| 312 | 313 | fn next(&mut self) -> Option<Self::Item> { |
| 313 | 314 | // if for whatever reason edge is "None" finish this iterator. |
| 314 | - let next = self.edge?.next(); | |
| 315 | - | |
| 316 | - println!("== next: {:?}", next); | |
| 315 | + let next = self.edge.as_mut()?.next(); | |
| 317 | 316 | |
| 318 | 317 | match next { |
| 319 | 318 | Some(_) => next, |
| ... | ... | @@ -350,6 +349,10 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
| 350 | 349 | VertexIterator::new(self, Direction::Left) |
| 351 | 350 | } |
| 352 | 351 | |
| 352 | + fn right_vertices(&self) -> VertexIterator<T> { | |
| 353 | + VertexIterator::new(self, Direction::Right) | |
| 354 | + } | |
| 355 | + | |
| 353 | 356 | fn left(&self, v :usize) -> usize { |
| 354 | 357 | let Polygon(Coordinates(cs)) = self; |
| 355 | 358 | |
| ... | ... | @@ -438,57 +441,14 @@ impl<T> Fillable<T> for Polygon<T> |
| 438 | 441 | where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
| 439 | 442 | + Debug + Clone + Copy + From<i32> { |
| 440 | 443 | fn fill(&self) -> Coordinates<T> { |
| 441 | - let Polygon(Coordinates(cs)) = self; | |
| 442 | - | |
| 443 | - let vert_min = self.vert_min(); | |
| 444 | - | |
| 445 | - println!("== vert_min: [{}] {:?}", vert_min, cs[vert_min]); | |
| 446 | - | |
| 447 | - let mut r = (vert_min, self.next_y(vert_min, Direction::Right)); | |
| 448 | - let mut l = (vert_min, self.next_y(vert_min, Direction::Left)); | |
| 449 | - | |
| 450 | - let mut l_edge :Vec<Coordinate<T>> = Vec::new(); | |
| 451 | - let mut r_edge :Vec<Coordinate<T>> = Vec::new(); | |
| 452 | - | |
| 453 | - let append_edge = | v :&mut Vec<Coordinate<T>> | |
| 454 | - , e :(usize, Option<usize>) | |
| 455 | - , f :Direction | { | |
| 456 | - match e { | |
| 457 | - (_, None) => e, | |
| 458 | - (a, Some(b)) => { | |
| 459 | - let mut edge = cs[a].edge(&cs[b]); | |
| 460 | - v.append(&mut edge); | |
| 461 | - (b, self.next_y(b, f)) | |
| 462 | - }, | |
| 463 | - } | |
| 464 | - }; | |
| 465 | - | |
| 466 | - let print_current = |s :&str, e :(usize, Option<usize>)| { | |
| 467 | - match e.1 { | |
| 468 | - None => println!( "== {}: [{:?}] - {:?}" | |
| 469 | - , s, e.1, "None"), | |
| 470 | - Some(e) => println!( "== {}: [{:?}] - {:?}" | |
| 471 | - , s, e, cs[e]), | |
| 472 | - } | |
| 473 | - }; | |
| 474 | - | |
| 475 | - while l.1 != None || r.1 != None { | |
| 476 | - print_current("l", l); | |
| 477 | - l = append_edge(&mut l_edge, l, Direction::Left); | |
| 478 | - print_current("r", r); | |
| 479 | - r = append_edge(&mut r_edge, r, Direction::Right); | |
| 480 | - } | |
| 481 | - | |
| 482 | - let l_edge2 :Vec<Coordinate<T>> = self.left_vertices().collect(); | |
| 444 | + let scanlines = self.left_vertices().zip(self.right_vertices()); | |
| 483 | 445 | |
| 484 | - println!("== [{}] {:?}", l_edge.len(), l_edge); | |
| 485 | - println!("== [{}] {:?}", l_edge2.len(), l_edge2); | |
| 486 | - println!("== [{}] {:?}", r_edge.len(), r_edge); | |
| 446 | + // vertices is an iterator over all vertices making this polygon. | |
| 447 | + let vertices = scanlines.flat_map(|(l, r)| l.line_iter(&r)); | |
| 487 | 448 | |
| 488 | - // TODO we always miss the last scanline… | |
| 489 | - // TODO check what happend with at least 2 vertices with same y and | |
| 490 | - // different x… | |
| 491 | - // loop though edges… | |
| 449 | + // for debug only… | |
| 450 | + //let vertices :Vec<(Coordinate<T>)> = vertices.collect(); | |
| 451 | + //println!("== [{}] {:?}", vertices.len(), vertices); | |
| 492 | 452 | |
| 493 | 453 | Coordinates(Vec::<Coordinate<T>>::new()) |
| 494 | 454 | } | ... | ... |
Please
register
or
login
to post a comment