Advertisement
Guest User

Untitled

a guest
Mar 17th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.25 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Iterator;
  4.  
  5. public class IntersectionPoint implements Iterable<Double[]> {
  6. private ArrayList<Double[][]> points;
  7.  
  8. public IntersectionPoint(ArrayList<Double[][]> points) {
  9. this.points = points;
  10. }
  11.  
  12.  
  13. public Iterator<Double[]> iterator() {
  14. return new IntersectionIterator();
  15. }
  16.  
  17. private class IntersectionIterator implements Iterator<Double[]> {
  18. private Double[] p = new Double[2];
  19. private int ind1, ind2;
  20.  
  21.  
  22. IntersectionIterator() {
  23. ind1 = 0;
  24. ind2 = 1;
  25. }
  26.  
  27. public boolean hasNext() {
  28.  
  29. return (ind1 + 1) < points.size();
  30. }
  31.  
  32.  
  33. public Double[] next() {
  34. double x1, x2, x3, x4;
  35. double y1, y2, y3, y4;
  36. while (ind1 < points.size()) {
  37. x1 = points.get(ind1)[0][0];
  38. y1 = points.get(ind1)[0][1];
  39. x2 = points.get(ind1)[1][0];
  40. y2 = points.get(ind1)[1][1];
  41. while (ind2 < points.size()) {
  42. x3 = points.get(ind2)[0][0];
  43. y3 = points.get(ind2)[0][1];
  44. x4 = points.get(ind2)[1][0];
  45. y4 = points.get(ind2)[1][1];
  46.  
  47. if (x2 < x1) {
  48. double a, b;
  49. a = x2;
  50. x2 = x1;
  51. x1 = a;
  52. b = y2;
  53. y2 = y1;
  54. y1 = b;
  55. }
  56. if (x4 < x3) {
  57. double a, b;
  58. a = x4;
  59. x4= x3;
  60. x3 = a;
  61. b = y4;
  62. y4 = y3;
  63. y3 = b;
  64. }
  65.  
  66. if (x2 > x3) {
  67. //если оба отрезка вертикальные
  68. if ((x1 - x2 == 0) && (x3 - x4 == 0)) {
  69. //если они лежат на одном X
  70. if (x1 == x3) {
  71. //проверим пересекаются ли они, т.е. есть ли у них общий Y
  72. if (((Math.max(y1, y2) < Math.min(y3, y4)) || (Math.min(y1, y2) > Math.max(y3, y4)))) {
  73. return null;
  74.  
  75. }
  76.  
  77. //если первый отрезок вертикальный
  78. if (x1 - x2 == 0) {
  79. //найдём p[0], p[1] - точки пересечения двух прямых
  80. p[0] = x1;
  81. double A2 = (y3 - y4) / (x3 - x4);
  82. double b2 = y3 - A2 * x3;
  83. p[1] = A2 * p[0] + b2;
  84. if (x3 <= p[0] && x4 >= p[0] && Math.min(y1, y2) <= p[1] && Math.max(y1, y2) >= p[1])
  85. return p;
  86. else
  87. return null;
  88. }
  89.  
  90. //если второй отрезок вертикальный
  91. if (x3 - x4 == 0) {
  92. //найдём p[0], p[1] - точки пересечения двух прямых
  93. p[0] = x3;
  94. double A1 = (y1 - y2) / (x1 - x2);
  95. double b1 = y1 - A1 * x1;
  96. p[1] = A1 * p[0] + b1;
  97. if (x1 <= p[0] && x2 >= p[0] && Math.min(y3, y4) <= p[1] && Math.max(y3, y4) >= p[1])
  98. return p;
  99. else
  100. return null;
  101. }
  102. //оба отрезка невертикальные
  103. double A1 = (y1 - y2) / (x1 - x2);
  104. double A2 = (y3 - y4) / (x3 - x4);
  105. double b1 = y1 - A1 * x1;
  106. double b2 = y3 - A2 * x3;
  107. if (A1 != A2) {
  108. //отрезки не параллельны
  109.  
  110. //p[0] - абсцисса точки пересечения двух прямых
  111. p[0] = (b2 - b1) / (A1 - A2);
  112. if ((p[0] < Math.max(x1, x3)) || (p[0] > Math.min(x2, x4))) {
  113. return null; //точка p[0] находится вне пересечения проекций отрезков на ось X
  114. } else {
  115. return p;
  116. }
  117. }
  118. }
  119. }
  120. }
  121. ind2++;
  122.  
  123. p[0] = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4));
  124. p[1] = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4));
  125. return p;
  126. }
  127. ind1++;
  128. ind1 = ind1 + 1;
  129. }
  130. return null;
  131. }
  132. }
  133. }
  134.  
  135.  
  136. //для прямых
  137. /*public Double[] next() {
  138. double x1 = 0.0, x2 = 0.0, x3 = 0.0, x4 = 0.0;
  139. double y1 = 0.0,y2 = 0.0,y3 = 0.0,y4 = 0.0;
  140. while (ind1 < points.size()) {
  141. //ind2 = ind1 + 1;
  142. x1 = points.get(ind1)[0][0];
  143. y1 = points.get(ind1)[0][1];
  144. x2 = points.get(ind1)[1][0];
  145. y2 = points.get(ind1)[1][1];
  146. while (ind2 < points.size()) {
  147. x3 = points.get(ind2)[0][0];
  148. y3 = points.get(ind2)[0][1];
  149. x4 = points.get(ind2)[1][0];
  150. y4 = points.get(ind2)[1][1];
  151. if ((x4 - x3) / (y4 - y3) != (x2 - x1) / (y2 - y1)) {
  152. p[0] = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4));
  153. p[1] = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4));
  154.  
  155. String.format("%.2f",p[0]);
  156. String.format("%.2f",p[1]);
  157. }
  158.  
  159. ind2++;
  160. System.out.print("Intersection points: ");
  161. return p;
  162. }
  163.  
  164. ind1++;
  165. ind2 = ind1 + 1;
  166. //return p;
  167.  
  168. }
  169. return p;
  170. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement