Advertisement
trishLEX

algorithm5

Oct 30th, 2017
391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.78 KB | None | 0 0
  1. package Algorithms;
  2.  
  3. import Graph.*;
  4. import Visualization.GraphVisualization;
  5.  
  6. import java.util.ArrayList;
  7. import java.util.Comparator;
  8.  
  9. class Algorithm5 {
  10.     private static double R;
  11.     private static final int WIDTH = GraphVisualization.WIDTH;
  12.     private static final int HEIGHT = GraphVisualization.HEIGHT;
  13.     private static final double RADIAL_COEFFICIENT = 0.9;
  14.  
  15.     //TODO переписать этот алгоритм, где то есть ошибка
  16.     private static void deleteIntersections(Graph tree) {
  17.         //ArrayList<ArrayList<Vertex>> verticesByDepth = tree.getVerticesByDepth();
  18.  
  19.         for (Vertex v: tree.getVertices()) {
  20.             ArrayList<Vertex> currentDepthWithoutV = new ArrayList<Vertex>();
  21.             currentDepthWithoutV.sort(angleComparator);
  22.             currentDepthWithoutV.addAll(tree.getVerticesByDepth(v.getDepth()));
  23.             currentDepthWithoutV.remove(v);
  24.  
  25.             //makeAngleOffsetWithoutIntersections(v, tree.getVerticesByDepth(v.getDepth()));
  26.             makeRadialOffsetWithoutIntersections(v, currentDepthWithoutV, tree);
  27.  
  28.             if (v.getDepth() != tree.getMaxDepth())
  29.                 makeRadialOffsetWithoutIntersections(v, tree.getVerticesByDepth(v.getDepth() + 1), tree);
  30.         }
  31. //        for (int i = 1; i <= tree.getMaxDepth(); i++) {
  32. //            ArrayList<Vertex> currentDepth = verticesByDepth.get(i);
  33. //            currentDepth.sort(angleComparator);
  34. //
  35. ////            for (Vertex v: currentDepth)
  36. ////                System.out.println("v = " + v.getIndex() + " angle = " + v.getAngle());
  37. //
  38. //            for (Vertex v: currentDepth) {
  39. //                double offset = makeRadialOffsetWithoutIntersections(v, verticesByDepth.get(i - 1), tree);
  40. //
  41. //                if (offset != 0.0) {
  42. //
  43. //                    for (Vertex u: currentDepth) {
  44. //
  45. //                        if (u != v) {
  46. //                            u.setVertexByPolar(u.getR() + offset, u.getAngle());
  47. //                        }
  48. //                    }
  49. //                }
  50. //            }
  51. //
  52. //            for (Vertex v: currentDepth) {
  53. //                double angleOffset = makeAngleOffsetWithoutIntersections(v, currentDepth);
  54. //
  55. //                if (angleOffset == -1.0) {
  56. //                    double radialOffset = makeRadialOffsetWithoutIntersections(v, currentDepth, tree);
  57. //
  58. //                    for (Vertex u: currentDepth) {
  59. //
  60. //                        if (u != v) {
  61. //                            u.setVertexByPolar(u.getR() + radialOffset, u.getAngle());
  62. //                        }
  63. //                    }
  64. //                }
  65. //            }
  66. //        }
  67.     }
  68.  
  69.     private static final double ANGLE_OFFSET = Math.PI / 18; //10 градусов
  70.     private static Comparator<Vertex> angleComparator = Comparator.comparingDouble(o -> o.getAngle());
  71.  
  72.     private static void makeAngleOffsetWithoutIntersections(Vertex v, ArrayList<Vertex> vertices) {
  73.         for (Vertex u: vertices) {
  74.             boolean wasIntersection = isIntersect(v, u);
  75.             if (wasIntersection) {
  76.                 double angle = v.getAngle();
  77.                 double delta = v.getAngle() - u.getAngle();
  78.  
  79.                 int index = vertices.indexOf(v);
  80.                 Vertex w = vertices.get(delta < 0 ? (index - 1) % vertices.size() : (index + 1) % vertices.size());
  81.  
  82.                 boolean WIntersection = false;
  83.  
  84.                 while (isIntersect(v, u) && !WIntersection) {
  85.                     if (delta > 0) {
  86.                         v.setVertexByPolar(v.getR(), v.getAngle() + ANGLE_OFFSET);
  87.                     }
  88.                     else {
  89.                         v.setVertexByPolar(v.getR(), v.getAngle() - ANGLE_OFFSET);
  90.                     }
  91.  
  92.                     WIntersection = isIntersect(v, w);
  93.                 }
  94.  
  95.                 if (WIntersection)
  96.                     v.setVertexByPolar(v.getR(), angle);
  97.  
  98.                 angle = u.getAngle();
  99.                 delta = u.getAngle() - v.getAngle();
  100.  
  101.                 index = vertices.indexOf(u);
  102.                 w = vertices.get(delta < 0 ? (index - 1) % vertices.size() : (index + 1) % vertices.size());
  103.  
  104.                 WIntersection = false;
  105.  
  106.                 while (isIntersect(v, u) && !WIntersection) {
  107.                     if (delta > 0)
  108.                         u.setVertexByPolar(u.getR(), u.getAngle() + ANGLE_OFFSET);
  109.                     else
  110.                         u.setVertexByPolar(u.getR(), u.getAngle() - ANGLE_OFFSET);
  111.  
  112.                     WIntersection = isIntersect(u, w);
  113.                 }
  114.  
  115.                 if (WIntersection)
  116.                     u.setVertexByPolar(u.getR(), angle);
  117.             }
  118.         }
  119.     }
  120.  
  121. //    private static double makeAngleOffsetWithoutIntersections(Vertex v, ArrayList<Vertex> vertices) {
  122. //        double offset = 0.0;
  123. //        for (Vertex u: vertices) {
  124. //            if (u != v) {
  125. //                boolean intersection = isIntersect(v, u);
  126. //                if (intersection) {
  127. //                    double angle = v.getAngle();
  128. //                    double x = v.getX();
  129. //                    double y = v.getY();
  130. //                    double delta = v.getAngle() - u.getAngle();
  131. //
  132. //                    int indexOfV = vertices.indexOf(v);
  133. //                    Vertex w = vertices.get(delta < 0 ? (indexOfV - 1) % vertices.size() : (indexOfV + 1) % vertices.size());
  134. //
  135. //                    if (delta > 0.0) {
  136. //                        boolean VWintersection = false;
  137. //
  138. //                        while (isIntersect(v, u) && !VWintersection) {
  139. //                            v.setAngle(v.getAngle() + ANGLE_OFFSET);
  140. //                            offset += ANGLE_OFFSET;
  141. //                            v.setX(v.getR() * Math.cos(v.getAngle()));
  142. //                            v.setY(v.getR() * Math.sin(v.getAngle()));
  143. //                            VWintersection = isIntersect(v, w);
  144. //                        }
  145. //
  146. //                        if (VWintersection) {
  147. //                            v.setAngle(angle);
  148. //                            v.setX(x);
  149. //                            v.setY(y);
  150. //                            return -1.0;
  151. //
  152. //                        } else
  153. //                            return offset;
  154. //                    } else {
  155. //                        boolean VWintersection = false;
  156. //
  157. //                        while (isIntersect(v, u) && !VWintersection) {
  158. //                            v.setAngle(v.getAngle() - ANGLE_OFFSET);
  159. //                            offset -= ANGLE_OFFSET;
  160. //                            v.setX(v.getR() * Math.cos(v.getAngle()));
  161. //                            v.setY(v.getR() * Math.sin(v.getAngle()));
  162. //                            VWintersection = isIntersect(v, w);
  163. //                        }
  164. //
  165. //                        if (VWintersection) {
  166. //                            v.setAngle(angle);
  167. //                            v.setX(x);
  168. //                            v.setY(y);
  169. //                            return -1.0;
  170. //
  171. //                        } else
  172. //                            return offset;
  173. //                    }
  174. //                }
  175. //            }
  176. //        }
  177. //        return offset;
  178. //    }
  179.  
  180.     static final double R_OFFSET = 5.0;
  181.  
  182.     private static void makeRadialOffsetWithoutIntersections(Vertex v, ArrayList<Vertex> vertices, Graph tree) {
  183.         double offset = 0.0;
  184.  
  185.         boolean wasIntersection = false;
  186.  
  187.         for (Vertex u: vertices) {
  188.             while (isIntersect(v, u)) {
  189.                 wasIntersection = true;
  190.                 offset += R_OFFSET;
  191.                 u.setVertexByPolar(u.getR() + R_OFFSET, u.getAngle());
  192.  
  193.                 if (u.getDepth() == v.getDepth())
  194.                     v.setVertexByPolar(v.getR() + R_OFFSET, v.getAngle());
  195.             }
  196.  
  197.             if (wasIntersection) {
  198.                 for (Vertex w: vertices) {
  199.                     if (w != u) {
  200.                         w.setVertexByPolar(w.getR() + offset, w.getAngle());
  201.                     }
  202.                 }
  203.  
  204.                 for (int i = u.getDepth() + 1; i <= tree.getMaxDepth(); i++)
  205.                     for (Vertex q: tree.getVerticesByDepth(i))
  206.                         q.setVertexByPolar(q.getR() + offset, q.getAngle());
  207.             }
  208.  
  209.             wasIntersection = false;
  210.             offset = 0.0;
  211.         }
  212.     }
  213.  
  214. //    private static double makeRadialOffsetWithoutIntersections(Vertex v, ArrayList<Vertex> vertices, Graph tree) {
  215. //        double offset = 0.0;
  216. //
  217. //        for (Vertex u: vertices) {
  218. //
  219. //            //TODO т.к. isIntersect(v, v) == false, то, возможно, следующий if не нужен
  220. //            if (u != v) {
  221. //
  222. //                System.out.println("INTERSECTION? v = " + v.getIndex() + " u = " + u.getIndex() + " " + isIntersect(v, u));
  223. //
  224. ////                if (v.getIndex() == 8 && u.getIndex() == 6) {
  225. ////
  226. ////                    for (Double[] points : v.getPoints())
  227. ////                        System.out.print("[" + points[0] + ", " + points[1] + "] ");
  228. ////                    System.out.println("\n");
  229. ////
  230. ////                    for (Double[] points : u.getPoints())
  231. ////                        System.out.print("[" + points[0] + ", " + points[1] + "] ");
  232. ////                    System.out.println("\n");
  233. ////                }
  234. //
  235. //                while (isIntersect(v, u)) {
  236. //                    int i = tree.getRadials().indexOf(v.getR());
  237. //                    double r = tree.getRadials().get(i);
  238. //
  239. //                    r += R_OFFSET;
  240. //                    offset += R_OFFSET;
  241. //                    tree.getRadials().set(i, r);
  242. //
  243. //                    v.setVertexByPolar(v.getR() + R_OFFSET, v.getAngle());
  244. //                }
  245. //
  246. //                System.out.println("INTERSECTION? v = " + v.getIndex() + " u = " + u.getIndex() + " " + isIntersect(v, u));
  247. ////                if (v.getIndex() == 8 && u.getIndex() == 6) {
  248. ////
  249. ////                    for (Double[] points: v.getPoints())
  250. ////                        System.out.print("[" + points[0] + ", " + points[1] + "] ");
  251. ////                    System.out.println("\n");
  252. ////
  253. ////                    for (Double[] points: u.getPoints())
  254. ////                        System.out.print("[" + points[0] + ", " + points[1] + "] ");
  255. ////                    System.out.println("\n");
  256. ////                }
  257. //            }
  258. //        }
  259. //
  260. //        return offset;
  261. //    }
  262.  
  263.     static boolean isIntersect(Vertex v, Vertex u) {
  264.         return v.isIn(u) || u.isIn(v);
  265.     }
  266.  
  267.     private static void addFirstRadii(Graph tree) {
  268.         R = (WIDTH < HEIGHT? WIDTH : HEIGHT)/ tree.getMaxDepth() / 2 * RADIAL_COEFFICIENT; //раньше радиус был константный
  269.         //R = 50.0;
  270.  
  271.         tree.getRadials().add(R);
  272.     }
  273.  
  274.     static Vertex findRoot(Graph tree) {
  275.         Vertex root = null;
  276.  
  277.         for (Vertex v: tree.getVertices()) {
  278.             if (v.isRoot()) {
  279.                 root = v;
  280.                 break;
  281.             }
  282.         }
  283.  
  284.         if (root == null)
  285.             throw new RuntimeException("ERROR root is null");
  286.         else
  287.             return root;
  288.     }
  289.  
  290.     private static int leavesCount = 0;
  291.     private static int leavesCounter(Vertex root) {
  292.         countLeaves(root);
  293.         return leavesCount;
  294.     }
  295.  
  296.     private static void countLeaves(Vertex root) {
  297.         if (root.getChild().size() != 0) {
  298.             for (Vertex v: root.getChild())
  299.                 countLeaves(v);
  300.         }
  301.         else
  302.             leavesCount++;
  303.     }
  304.  
  305.     private static void radialPositions(Graph T, Vertex v, double alpha, double beta){
  306.         if (v.isRoot()) {
  307.             v.setX(0);
  308.             v.setY(0);
  309.  
  310.             v.setR(0);
  311.             v.setAngle(0);
  312.         }
  313.  
  314.         int D = v.getDepth();
  315.  
  316.         double theta = alpha;
  317.  
  318.         double R_D = R + (R * D);
  319.  
  320.         if (!T.getRadials().contains(R_D))
  321.             T.getRadials().add(R_D);
  322.  
  323.         int k = leavesCounter(v);
  324.         leavesCount = 0;
  325.  
  326.         for (Vertex c: v.getChild()) {
  327.             int lambda = leavesCounter(c);
  328.             leavesCount = 0;
  329.  
  330.             double mu = theta + ((beta - alpha) * lambda / k);
  331.  
  332.             c.setVertexByPolar(R_D, (theta + mu) / 2);
  333.  
  334.             if (c.getChild().size() > 0)
  335.                 radialPositions(T, c, theta, mu);
  336.  
  337.             theta = mu;
  338.         }
  339.     }
  340.  
  341.     static void useAlgorithm(Graph tree) {
  342.         Vertex root = findRoot(tree);
  343.  
  344.         tree.calculateMaxDepth(root);
  345.  
  346.         //System.out.println(tree);
  347.         System.out.println(tree.getVerticesByDepth());
  348.  
  349.         addFirstRadii(tree);
  350.  
  351.         radialPositions(tree, root, 0, 2 * Math.PI);
  352.  
  353.         System.out.println(tree.getVerticesByDepth());
  354.  
  355.         deleteIntersections(tree);
  356.  
  357.         System.out.println(tree.getVerticesByDepth());
  358.  
  359.         tree.fillRadials5();
  360.     }
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement