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