Advertisement
Guest User

Untitled

a guest
Jul 20th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.83 KB | None | 0 0
  1. #[derive(Debug)]
  2. struct Indexer {
  3. from: i64,
  4. to: i64,
  5. index: i64,
  6. }
  7. impl Indexer {
  8. fn new(from: i64, to: i64) -> Indexer {
  9. let index = from;
  10. Indexer { from, to, index }
  11. }
  12. }
  13.  
  14. enum Mode {
  15. SetupTop,
  16. RenderTop,
  17. SetupBottom,
  18. RenderBottom,
  19. Done
  20. }
  21.  
  22. struct Triangle {
  23. mode: Mode,
  24. v_scan: Indexer,
  25. h_scan: Indexer,
  26. v0: Point,
  27. v1: Point,
  28. v2: Point,
  29. height: i64,
  30. }
  31. impl Triangle {
  32. fn new(v0: Point, v1: Point, v2: Point) -> Triangle {
  33. let mut set = vec![v0, v1, v2];
  34. set.sort_by(|a, b| a.y.cmp(&b.y));
  35. let mode = Mode::SetupTop;
  36. let v0 = set[0].clone();
  37. let v1 = set[1].clone();
  38. let v2 = set[2].clone();
  39. let height = v2.y - v0.y;
  40. let v_scan = Indexer::new(0, 0);
  41. let h_scan = Indexer::new(0, 0);
  42. Triangle { mode, v_scan, h_scan, v0, v1, v2, height }
  43. }
  44.  
  45. #[inline]
  46. fn update_horizontal_top(&mut self) {
  47. let y = self.v_scan.index;
  48. let height = self.v1.y - self.v0.y;
  49. let sx = (y - self.v0.y) as f32 / self.height as f32;
  50. let sy = (y - self.v0.y) as f32 / height as f32;
  51. let m0 = (self.v0.x + (self.v2.x - self.v0.x)) as f32 * sx;
  52. let m1 = (self.v0.x + (self.v1.x - self.v0.x)) as f32 * sy;
  53. let min = if m0 < m1 { m0 } else { m1 };
  54. let max = if m0 > m1 { m0 } else { m1 };
  55. self.h_scan = Indexer::new(min as i64, max as i64);
  56. }
  57.  
  58. #[inline]
  59. fn update_horitonal_bottom(&mut self) {
  60. let y = self.v_scan.index;
  61. let height = self.v2.y - self.v1.y;
  62. let sx = (y - self.v0.y) as f32 / self.height as f32;
  63. let sy = (y - self.v1.y) as f32 / height as f32;
  64. let m0 = (self.v0.x + (self.v2.x - self.v0.x)) as f32 * sx;
  65. let m1 = (self.v1.x + (self.v1.x - self.v1.x)) as f32 * sy;
  66. let min = if m0 < m1 { m0 } else { m1 };
  67. let max = if m0 > m1 { m0 } else { m1 };
  68. self.h_scan = Indexer::new(min as i64, max as i64);
  69. }
  70.  
  71. #[inline]
  72. fn step(&mut self) -> Option<(i64, i64)> {
  73. match self.mode {
  74. Mode::SetupTop => {
  75. self.v_scan = Indexer::new(self.v0.y, self.v1.y);
  76. if self.v_scan.from == self.v_scan.to {
  77. self.mode = Mode::SetupBottom;
  78. Some((self.v0.x, self.v0.y))
  79. } else {
  80. self.update_horizontal_top();
  81. let x = self.h_scan.index;
  82. let y = self.v_scan.index;
  83. self.mode = Mode::RenderTop;
  84. Some((x, y))
  85. }
  86. },
  87. Mode::RenderTop => {
  88. let x = self.h_scan.index;
  89. let y = self.v_scan.index;
  90. self.h_scan.index += 1;
  91. if self.h_scan.index > self.h_scan.to {
  92. self.v_scan.index += 1;
  93. self.update_horizontal_top();
  94. if self.v_scan.index > self.v_scan.to {
  95. self.mode = Mode::SetupBottom;
  96. }
  97. }
  98. Some((x, y))
  99. },
  100. Mode::SetupBottom => {
  101. self.v_scan = Indexer::new(self.v1.y, self.v2.y);
  102. if self.v_scan.from == self.v_scan.to {
  103. return None;
  104. }
  105. self.update_horitonal_bottom();
  106. let x = self.h_scan.index;
  107. let y = self.v_scan.index;
  108. self.mode = Mode::RenderBottom;
  109. Some((x, y))
  110. },
  111. Mode::RenderBottom => {
  112. let x = self.h_scan.index;
  113. let y = self.v_scan.index;
  114. self.h_scan.index += 1;
  115. if self.h_scan.index > self.h_scan.to {
  116. self.v_scan.index += 1;
  117. self.update_horitonal_bottom();
  118. if self.v_scan.index > self.v_scan.to {
  119. self.mode = Mode::Done;
  120. }
  121. }
  122. Some((x, y))
  123. },
  124. Mode::Done => None
  125. }
  126. }
  127. }
  128.  
  129. impl Iterator for Triangle {
  130. type Item = (i64, i64);
  131. fn next(&mut self) -> Option<(i64, i64)> {
  132. self.step()
  133. }
  134. }
  135.  
  136. fn main() {
  137.  
  138. let mut triangle = Triangle::new(
  139. Point::new( 2, 0),
  140. Point::new( 2, 10),
  141. Point::new( 10, 10)
  142. );
  143.  
  144. for x in triangle {
  145. println!("{:?}", x);
  146. }
  147.  
  148. // println!("{:?}", triangle.next());
  149. // println!("{:?}", triangle.next());
  150. // println!("{:?}", triangle.next());
  151. // println!("{:?}", triangle.next());
  152. // println!("{:?}", triangle.next());
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement