Commit d603a9140d0195659c795bc6c19634e370c84cd8

Authored by Georg Hopp
1 parent 29c366d7

more iterators

Showing 1 changed file with 59 additions and 23 deletions
@@ -56,7 +56,7 @@ pub struct Coordinate<T>(pub i32, pub i32, pub T); @@ -56,7 +56,7 @@ pub struct Coordinate<T>(pub i32, pub i32, pub T);
56 #[derive(Debug, Clone)] 56 #[derive(Debug, Clone)]
57 pub struct Coordinates<T>(pub Vec<Coordinate<T>>); 57 pub struct Coordinates<T>(pub Vec<Coordinate<T>>);
58 58
59 -#[derive(Debug, Clone)] 59 +#[derive(Debug, Clone, Copy)]
60 pub struct LineIterator<T> where T: Debug { 60 pub struct LineIterator<T> where T: Debug {
61 a :Option<Coordinate<T>> 61 a :Option<Coordinate<T>>
62 , b :Coordinate<T> 62 , b :Coordinate<T>
@@ -74,6 +74,7 @@ where T: Add<Output = T> + Debug + Copy + From<i32> { @@ -74,6 +74,7 @@ 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);
77 match self.a { 78 match self.a {
78 None => None, 79 None => None,
79 Some(a) => { 80 Some(a) => {
@@ -263,37 +264,70 @@ pub struct VertexIterator<'a,T> where T: Debug { @@ -263,37 +264,70 @@ pub struct VertexIterator<'a,T> where T: Debug {
263 p :&'a Polygon<T>, 264 p :&'a Polygon<T>,
264 top :usize, 265 top :usize,
265 current :Option<usize>, 266 current :Option<usize>,
266 - inner :Option<LineIterator<T>>, 267 + edge :Option<LineIterator<T>>,
267 direction :Direction, 268 direction :Direction,
268 } 269 }
269 270
  271 +impl<'a,T> VertexIterator<'a,T>
  272 +where T: Add<Output = T> + Sub<Output = T> + Div<Output = T>
  273 + + Debug + Copy + From<i32> {
  274 +
  275 + 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
  284 + }
  285 +
  286 + // if this yields "None" we are finished.
  287 + fn next_edge(&mut self) -> Option<LineIterator<T>> {
  288 + let current = self.current?;
  289 + let next = self.p.next_y(current, self.direction)?;
  290 + let mut edge = self.p.vertex(current).edge_iter(&self.p.vertex(next));
  291 +
  292 + println!("== next: {:?} {:?} {:?}", current, next, edge);
  293 +
  294 + match edge.next() {
  295 + // It should be impossible that a new edge iterator has no values
  296 + // at all… anyway, just in case I handle it here.
  297 + None => self.next_edge(),
  298 + Some(_) => {
  299 + self.current = Some(next);
  300 + self.edge = Some(edge);
  301 + self.edge
  302 + },
  303 + }
  304 + }
  305 +}
  306 +
270 impl<'a,T> Iterator for VertexIterator<'a,T> 307 impl<'a,T> Iterator for VertexIterator<'a,T>
271 where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> 308 where T: Add<Output = T> + Sub<Output = T> + Div<Output = T>
272 + Debug + Copy + From<i32> { 309 + Debug + Copy + From<i32> {
273 type Item = Coordinate<T>; 310 type Item = Coordinate<T>;
274 311
275 fn next(&mut self) -> Option<Self::Item> { 312 fn next(&mut self) -> Option<Self::Item> {
276 - let inner = match self.inner {  
277 - Some(i) => i,  
278 - None => {  
279 - let current = self.current?;  
280 - let next = self.p.next_y(current, self.direction)?;  
281 - self.p.vertex(current).edge_iter(&self.p.vertex(next))  
282 - },  
283 - } 313 + // if for whatever reason edge is "None" finish this iterator.
  314 + let next = self.edge?.next();
284 315
285 - match self.current {  
286 - None => None,  
287 - Some(c) => {  
288 - let r = self.p.vertex(c);  
289 - self.current = self.p.next_y(c, self.direction);  
290 - Some(r) 316 + println!("== next: {:?}", next);
  317 +
  318 + match next {
  319 + Some(_) => next,
  320 + None => {
  321 + self.next_edge()?;
  322 + self.next()
291 }, 323 },
292 } 324 }
293 } 325 }
294 } 326 }
295 327
296 -impl<T> Polygon<T> where T: Copy + Debug { 328 +impl<T> Polygon<T>
  329 +where T: Add<Output = T> + Sub<Output = T> + Div<Output = T>
  330 + + Copy + Debug + From<i32> {
297 fn vert_min<'a>(&'a self) -> usize { 331 fn vert_min<'a>(&'a self) -> usize {
298 let Polygon(Coordinates(cs)) = self; 332 let Polygon(Coordinates(cs)) = self;
299 333
@@ -313,11 +347,7 @@ impl<T> Polygon<T> where T: Copy + Debug { @@ -313,11 +347,7 @@ impl<T> Polygon<T> where T: Copy + Debug {
313 } 347 }
314 348
315 fn left_vertices(&self) -> VertexIterator<T> { 349 fn left_vertices(&self) -> VertexIterator<T> {
316 - VertexIterator { p: &self  
317 - , top: self.vert_min()  
318 - , current: Some(self.vert_min())  
319 - , inner: None  
320 - , direction: Direction::Left } 350 + VertexIterator::new(self, Direction::Left)
321 } 351 }
322 352
323 fn left(&self, v :usize) -> usize { 353 fn left(&self, v :usize) -> usize {
@@ -353,7 +383,8 @@ impl<T> Polygon<T> where T: Copy + Debug { @@ -353,7 +383,8 @@ impl<T> Polygon<T> where T: Copy + Debug {
353 , c :usize 383 , c :usize
354 , n :usize 384 , n :usize
355 , d :Direction) -> Option<usize> 385 , d :Direction) -> Option<usize>
356 - where T: Copy + Debug { 386 + where T: Add<Output = T> + Sub<Output = T> + Div<Output = T>
  387 + + Copy + Debug + From<i32> {
357 if c == n { 388 if c == n {
358 None 389 None
359 } else { 390 } else {
@@ -362,6 +393,8 @@ impl<T> Polygon<T> where T: Copy + Debug { @@ -362,6 +393,8 @@ impl<T> Polygon<T> where T: Copy + Debug {
362 393
363 match ny.cmp(&cy) { 394 match ny.cmp(&cy) {
364 cmp::Ordering::Less => None, 395 cmp::Ordering::Less => None,
  396 + // TODO On equal we need to find out which one of both to
  397 + // keep in the list… (the outermost)
365 cmp::Ordering::Equal => inner(p, c, p.step(n, d), d), 398 cmp::Ordering::Equal => inner(p, c, p.step(n, d), d),
366 cmp::Ordering::Greater => Some(n), 399 cmp::Ordering::Greater => Some(n),
367 } 400 }
@@ -446,7 +479,10 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> @@ -446,7 +479,10 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T>
446 r = append_edge(&mut r_edge, r, Direction::Right); 479 r = append_edge(&mut r_edge, r, Direction::Right);
447 } 480 }
448 481
  482 + let l_edge2 :Vec<Coordinate<T>> = self.left_vertices().collect();
  483 +
449 println!("== [{}] {:?}", l_edge.len(), l_edge); 484 println!("== [{}] {:?}", l_edge.len(), l_edge);
  485 + println!("== [{}] {:?}", l_edge2.len(), l_edge2);
450 println!("== [{}] {:?}", r_edge.len(), r_edge); 486 println!("== [{}] {:?}", r_edge.len(), r_edge);
451 487
452 // TODO we always miss the last scanline… 488 // TODO we always miss the last scanline…
Please register or login to post a comment