Guest User

Untitled

a guest
Mar 18th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1. type Point = (f32, f32);
  2.  
  3. #[derive(Debug)]
  4. struct Line { // ax + by + c = 0
  5. a: f32,
  6. b: f32,
  7. c: f32,
  8. }
  9.  
  10. #[derive(Debug)]
  11. struct Segment { // ax + by + c = 0
  12. l: Line,
  13. p: Point,
  14. q: Point,
  15. }
  16.  
  17. impl Line {
  18. fn new (p1: Point, p2: Point) -> Line {
  19. if p1.0 == p2.0 {
  20. Line {
  21. a: 1.0,
  22. b: 0.0,
  23. c: -p1.0,
  24. }
  25. } else if p1.1 == p2.1 {
  26. Line {
  27. a: 0.0,
  28. b: 1.0,
  29. c: -p1.1,
  30. }
  31. } else {
  32. let m: f32 = (p2.1 - p1.1) / (p2.0 - p1.0);
  33. let c: f32 = p1.1 - m * p1.0;
  34. Line {
  35. a: m,
  36. b: -1f32,
  37. c: c,
  38. }
  39. }
  40. }
  41. }
  42.  
  43. impl Segment {
  44. fn new(p: Point, q: Point) -> Segment {
  45. let l = Line::new(p, q);
  46. Segment {
  47. l: l,
  48. p: p,
  49. q: q,
  50. }
  51. }
  52. fn intersects(&self, r: Point, pt: Point) -> bool {
  53. let a1: f32 = self.l.a;
  54. let b1: f32 = self.l.b;
  55. let c1: f32 = self.l.c;
  56. let p = r;
  57. let l = Line::new(p, pt);
  58. let a2: f32 = l.a;
  59. let b2: f32 = l.b;
  60. let c2: f32 = l.c;
  61. if a1 == a2 && b1 == b2 && c1 == c2 {
  62. self.p.0 > p.0 && self.p.1 > p.1
  63. } else {
  64. // println!("{}x + {}y + {} = 0\t\t{}x + {}y + {} = 0", a1, b1, c1, a2, b2, c2);
  65. let xx: f32 = ( b1 * c2 - b2 * c1 ) / ( a1 * b2 - a2 * b1 );
  66. let yy: f32 = ( a2 * c1 - a1 * c2 ) / ( a1 * b2 - a2 * b1 );
  67. let xmax = if self.p.0 > self.q.0 { self.p.0 } else {self.q.0 };
  68. let xmin = self.p.0 + self.q.0 - xmax;
  69. let ymax = if self.p.1 > self.q.1 { self.p.1 } else {self.q.1 };
  70. let ymin = self.p.1 + self.q.1 - ymax;
  71. // println!("{}, {}", xx, yy);
  72. if xx > pt.0 {
  73. false
  74. } else if xmin == xmax {
  75. ( yy > ymin ) && ( yy <= ymax )
  76. } else {
  77. ( xx > xmin ) && ( xx <= xmax )
  78. }
  79. }
  80. }
  81. }
  82.  
  83. type Segments = Vec<Segment>;
  84.  
  85. fn test(ls: Segments, pt: Point) -> bool {
  86. let mut out1 = false;
  87. let mut out2 = false;
  88. let r1: Point = (-14., 0.);
  89. let r2: Point = (-14., 1.);
  90. for s in &ls {
  91. let cur1 = s.intersects(r1, pt);
  92. if cur1 {
  93. out1 = !out1;
  94. }
  95. }
  96. for s in &ls {
  97. let cur2 = s.intersects(r2, pt);
  98. if cur2 {
  99. out2 = !out2;
  100. }
  101. }
  102. println!("{}, {}", out1, out2);
  103. out1 || out2
  104. }
  105.  
  106. fn point_in_poly(poly: &[Point], point: Point) -> bool {
  107. let mut ls: Segments = Vec::new();
  108. for i in 0 .. poly.len() - 1 {
  109. ls.push(Segment::new(poly[i], poly[i + 1]));
  110. }
  111. ls.push(Segment::new(poly[poly.len() - 1], poly[0]));
  112. let out = test(ls, point);
  113. // println!("{:?}, {:?})", poly, point);
  114. out
  115. }
  116.  
  117. fn main() {
  118. let poly = [(3.6759505, 0.13828002), (3.9046004, 1.443813), (3.3530989, 3.5922122), (2.2569885, 3.5326672), (0.57010514, 4.242185), (-0.103441946, 4.069717), (-2.2492082, 4.00108), (-2.1071105, 2.1929216), (-3.603793, 2.210453), (-4.154597, 0.80724186), (-4.193355, -0.7821003), (-3.809928, -1.4759481), (-3.2883549, -2.6671805), (-2.4112113, -3.5660026), (-0.76239276, -4.6737156), (0.72881544, -3.0374305), (1.8504808, -2.9726355), (2.3999255, -2.3248758), (4.464444, -2.108619), (4.6226134, -0.69429535), (4.2615213, 0.8579904)];
  119. let pt = (2., 0.);
  120. println!("{:?}", point_in_poly(&poly, pt));
  121. println!("=====================");
  122. // println!("{:?}", point_in_poly(&tri, p2));
  123. // println!("=====================");
  124. }
Add Comment
Please, Sign In to add comment