Showing
1 changed file
with
23 additions
and
63 deletions
@@ -74,7 +74,6 @@ where T: Add<Output = T> + Debug + Copy + From<i32> { | @@ -74,7 +74,6 @@ where T: Add<Output = T> + Debug + Copy + From<i32> { | ||
74 | type Item = Coordinate<T>; | 74 | type Item = Coordinate<T>; |
75 | 75 | ||
76 | fn next(&mut self) -> Option<Self::Item> { | 76 | fn next(&mut self) -> Option<Self::Item> { |
77 | - println!("== LineIterator next: {:?}", self); | ||
78 | match self.a { | 77 | match self.a { |
79 | None => None, | 78 | None => None, |
80 | Some(a) => { | 79 | Some(a) => { |
@@ -273,14 +272,18 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | @@ -273,14 +272,18 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | ||
273 | + Debug + Copy + From<i32> { | 272 | + Debug + Copy + From<i32> { |
274 | 273 | ||
275 | fn new(p :&'a Polygon<T>, direction :Direction) -> Self { | 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 | // if this yields "None" we are finished. | 289 | // if this yields "None" we are finished. |
@@ -289,8 +292,6 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | @@ -289,8 +292,6 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | ||
289 | let next = self.p.next_y(current, self.direction)?; | 292 | let next = self.p.next_y(current, self.direction)?; |
290 | let mut edge = self.p.vertex(current).edge_iter(&self.p.vertex(next)); | 293 | let mut edge = self.p.vertex(current).edge_iter(&self.p.vertex(next)); |
291 | 294 | ||
292 | - println!("== next: {:?} {:?} {:?}", current, next, edge); | ||
293 | - | ||
294 | match edge.next() { | 295 | match edge.next() { |
295 | // It should be impossible that a new edge iterator has no values | 296 | // It should be impossible that a new edge iterator has no values |
296 | // at all… anyway, just in case I handle it here. | 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,9 +312,7 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | ||
311 | 312 | ||
312 | fn next(&mut self) -> Option<Self::Item> { | 313 | fn next(&mut self) -> Option<Self::Item> { |
313 | // if for whatever reason edge is "None" finish this iterator. | 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 | match next { | 317 | match next { |
319 | Some(_) => next, | 318 | Some(_) => next, |
@@ -350,6 +349,10 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | @@ -350,6 +349,10 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | ||
350 | VertexIterator::new(self, Direction::Left) | 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 | fn left(&self, v :usize) -> usize { | 356 | fn left(&self, v :usize) -> usize { |
354 | let Polygon(Coordinates(cs)) = self; | 357 | let Polygon(Coordinates(cs)) = self; |
355 | 358 | ||
@@ -438,57 +441,14 @@ impl<T> Fillable<T> for Polygon<T> | @@ -438,57 +441,14 @@ impl<T> Fillable<T> for Polygon<T> | ||
438 | where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | 441 | where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
439 | + Debug + Clone + Copy + From<i32> { | 442 | + Debug + Clone + Copy + From<i32> { |
440 | fn fill(&self) -> Coordinates<T> { | 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 | Coordinates(Vec::<Coordinate<T>>::new()) | 453 | Coordinates(Vec::<Coordinate<T>>::new()) |
494 | } | 454 | } |
Please
register
or
login
to post a comment