Advertisement
trishLEX

algorithm3

Oct 26th, 2017
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.26 KB | None | 0 0
  1. package Algorithms;
  2.  
  3. import Graph.*;
  4.  
  5. import java.util.ArrayList;
  6.  
  7. import static Graph.Vertex.isIntersect;
  8.  
  9. class Algorithm3 {
  10.     private static final double R = 100;
  11.     private static final double PHI = Math.PI;
  12.     private static final double R_OFFSET = Graph.R_OFFSET;
  13.    
  14.     private static Vertex findNearestSibling(Vertex v) {
  15.         Vertex parent = v.getParent();
  16.         double minAngle = Math.PI * 2;
  17.         double delta;
  18.         Vertex sibling = null;
  19.  
  20.         for (Vertex u: parent.getChild()) {
  21.             if (u != v) {
  22.                 delta = makeInFirstQuarter(v.getAngle() - u.getAngle());
  23.  
  24.                 if (delta < minAngle) {
  25.                     minAngle = delta;
  26.                     sibling = u;
  27.                 }
  28.             }
  29.         }
  30.  
  31.         if (sibling == null)
  32.             throw new RuntimeException("Sibling is null");
  33.        
  34.         return sibling;
  35.     }
  36.  
  37.     private static double makeInFirstQuarter(double angle) {
  38.         if (angle <= 0) {
  39.             while (angle <= 0)
  40.                 angle += Math.PI;
  41.         }
  42.         else {
  43.             if (angle > Math.PI) {
  44.                 while (angle > Math.PI)
  45.                     angle -= Math.PI;
  46.             }
  47.         }
  48.  
  49.         return angle;
  50.     }
  51.  
  52.     private static double cosinesLaw(double angle, double side) {
  53.         return Math.sqrt(2 * side * side - 2 * side * side * Math.cos(angle));
  54.     }
  55.  
  56.     private static void radialPositions(Graph tree, Vertex root) {
  57.         int currentDepth = root.getDepth();
  58.  
  59.         if (currentDepth != 0)
  60.             throw new RuntimeException("Depth of the root is not null");
  61.  
  62.         for (Vertex v: tree.getVertices()) {
  63.             if (v.isRoot()) {
  64.                 root.setX(0);
  65.                 root.setY(0);
  66.                 root.setR(R);
  67.             }
  68.             else {
  69.                 if (v.getParent() == root) {
  70.                     v.setAngle(2 * Math.PI * root.getChild().indexOf(v) / root.getChild().size());
  71.                     v.setR(R);
  72.                     //System.out.println("v = " + v.getIndex() + " polar coords = (" + v.getAngle() + ", " + v.getR() + ")");
  73.                 }
  74.                 else {
  75.                     v.setAngle(Math.PI - PHI / 2 + PHI * v.getParent().getChild().indexOf(v) / v.getParent().getChild().size() + PHI / (2 * v.getParent().getChild().size()));
  76.  
  77.                     if (v.getParent().getParent().getChild().size() == 1) {
  78.                         v.setR(v.getParent().getR()); //здесь было R / 2
  79.                         //System.out.println("v = " + v.getIndex() + " polar coords = (" + v.getAngle() + ", " + v.getR() + ")");
  80.                     }
  81.                     else {
  82.                         Vertex sibling = findNearestSibling(v.getParent());
  83.  
  84.                         //System.out.println("v = " + v.getIndex() + " v.parent = " + v.getParent().getIndex() + " v.parent's sibling = " + sibling.getIndex());
  85.                         //System.out.println("deltaOld = " + (v.getParent().getAngle() - sibling.getAngle()));
  86.  
  87.                         double delta = makeInFirstQuarter(v.getParent().getAngle() - sibling.getAngle()) / 2;
  88.  
  89.                         //System.out.println("r = " + cosinesLaw(delta, v.getParent().getR()) + " delta = " + delta);
  90.  
  91.                         v.setR(cosinesLaw(delta, v.getParent().getR()));
  92.  
  93.                         //System.out.println("v = " + v.getIndex() + " polar coords = (" + v.getAngle() + ", " + v.getR() + ")");
  94.                     }
  95.                 }
  96.             }
  97.  
  98.             System.out.println("VERTEX v = " + v.getIndex() + " r = " + v.getR());
  99.             tree.getRadials().add(v.getR());
  100.         }
  101.     }
  102.  
  103. //    private static void castToPolarCoordinates(Graph tree, Vertex root) {
  104. //        for (Vertex v: tree.getVertices()) {
  105. //
  106. //            if (v.getParent() == root) {
  107. //                v.setX(v.getR() * Math.cos(v.getAngle()));
  108. //                v.setY(v.getR() * Math.sin(v.getAngle()));
  109. //            }
  110. //
  111. //            else {
  112. //
  113. //                if (v != root) {
  114. //                    double r = cosinesLaw(v.getR(), v.getParent().getR(), v.getAngle());
  115. //                    double phi = v.getParent().getAngle() - Math.asin(v.getR() * Math.sin(v.getAngle()) / cosinesLaw(v.getR(), v.getParent().getR(), v.getAngle()));
  116. //
  117. //                    v.setX(r * Math.cos(phi));
  118. //                    v.setY(r * Math.sin(phi));
  119. //                    //v.setVertexByPolar(r, phi);
  120. //                }
  121. //            }
  122. //        }
  123. //
  124. ////        for (Vertex v: tree.getVertices()) {
  125. ////            tree.getVertices().get(v.getIndex()).setX(v.getX());
  126. ////            tree.getVertices().get(v.getIndex()).setY(v.getY());
  127. ////        }
  128. //    }
  129.  
  130.     private static void deleteIntersections(Graph tree) {
  131.         //TODO сделать проверку пересечений на одной глубине; Проблема - пересечения не братьев, находящихся на одной глубине
  132. //        for (int i = 1; i <= maxDepth; i++) {
  133. //            ArrayList<Vertex> currentDepth = verticesByDepth.get(i);
  134. //
  135. //            for (Vertex v: currentDepth) {
  136. //                double offset = makeRadialOffsetWithoutIntersections(v, verticesByDepth.get(i - 1));
  137. //
  138. //                if (offset != 0.0) {
  139. //
  140. //                    for (Vertex u: currentDepth) {
  141. //
  142. //                        if (u != v) {
  143. //                            u.setVertexByPolar(u.getR() + offset, u.getAngle());
  144. //                        }
  145. //                    }
  146. //                }
  147. //            }
  148. //
  149. //            for (Vertex v: currentDepth) {
  150. //                double offset = makeRadialOffsetWithoutIntersections(v, verticesByDepth.get(i));
  151. //
  152. //                if (offset != 0.0) {
  153. //
  154. //                    for (Vertex u: currentDepth) {
  155. //
  156. //                        if (u != v) {
  157. //                            u.setVertexByPolar(u.getR() + offset, u.getAngle());
  158. //                        }
  159. //                    }
  160. //                }
  161. //            }
  162. //        }
  163.  
  164.         for (Vertex v: tree.getVertices()) {
  165.             makeRadialOffsetWithoutIntersections(v, v.getChild());
  166.  
  167.             for (Vertex u: v.getChild()) {
  168.                 ArrayList<Vertex> siblingsOfU = new ArrayList<>();
  169.                 siblingsOfU.addAll(v.getChild());
  170.                 siblingsOfU.remove(u);
  171.                 makeRadialOffsetWithoutIntersections(u, siblingsOfU);
  172. //                double offset = makeRadialOffsetWithoutIntersections(u, siblingsOfU);
  173. //                if (offset != 0.0) {
  174. //                    double r = u.getR();
  175. //                    u.setVertexByPolar(u.getR() + offset, u.getAngle());
  176. //                    System.out.println("vertex = " + u.getIndex() + " r = " + u.getR() + " fact offset = " + (u.getR() - r));
  177. //                }
  178.             }
  179.         }
  180.  
  181.  
  182.         for (Vertex v: tree.getVertices()){
  183.             for (Vertex u: tree.getVertices()) {
  184.                 if (v != u && isIntersect(v, u)) {
  185.                     makeRadialOffsetWithoutIntersections(v, u);
  186.                 }
  187.             }
  188.         }
  189.     }
  190.  
  191.     private static void makeRadialOffsetWithoutIntersections(Vertex v, Vertex u) {
  192.         System.out.println("v = " + v.getIndex() + " u = " + u.getIndex());
  193.         Vertex tempV = v;
  194.         Vertex tempU = u;
  195.  
  196.         if (tempV.getDepth() > tempU.getDepth())
  197.             while (tempV.getDepth() != tempU.getDepth())
  198.                 tempV = tempV.getParent();
  199.         else
  200.             while (tempV.getDepth() != tempU.getDepth())
  201.                 tempU = tempU.getParent();
  202.  
  203.         Vertex vP = tempV.getParent();
  204.         Vertex uP = tempU.getParent();
  205.  
  206.         while (vP != uP){
  207.             tempV = vP;
  208.             tempU = uP;
  209.             vP = tempV.getParent();
  210.             uP = tempU.getParent();
  211.         }
  212.  
  213.         System.out.println("vP = " + vP.getIndex() + " uP = " + uP.getIndex());
  214.         System.out.println("tempV = " + tempV.getIndex() + " tempU = " + tempU.getIndex());
  215.         System.out.println("\n");
  216.  
  217.         while (isIntersect(v, u)) {
  218.             for (Vertex w: vP.getChild())
  219.                 w.moveFromParent(R_OFFSET);
  220.             //tempV.moveFromParent(R_OFFSET);
  221.             //tempU.moveFromParent(R_OFFSET);
  222.         }
  223.     }
  224.  
  225.     /* Смещаются вершины в vertices, v (брат или родитель) при выполнении этого алгоритма остается на месте */
  226.     private static void makeRadialOffsetWithoutIntersections(Vertex v, ArrayList<Vertex> vertices) {
  227.         double offset = 0.0;
  228.  
  229.         boolean wasIntersection = false;
  230.  
  231.         //TODO убрать это в production:
  232.         if (v.getParent() != null)
  233.             System.out.println("offset of v = " + v.getIndex() + " offset = " + v.distTo(v.getParent()));
  234.  
  235.         for (Vertex u: vertices) {
  236.             System.out.println("v = " + v.getIndex() + " u = " + u.getIndex() + " isIntersect? " + isIntersect(v, u));
  237.  
  238.             double dist = u.distTo(u.getParent());
  239.  
  240.             while (isIntersect(v, u)) {
  241.                 wasIntersection = true;
  242.                 offset += R_OFFSET;
  243.                 u.moveFromParent(R_OFFSET);
  244.                 //System.out.println(pcLength);
  245.                 //System.out.println(u.getX() + " " + u.getY());
  246.             }
  247.  
  248.             System.out.println("v = " + v.getIndex() + " child of v -- u = " + u.getIndex() + " offset = " + (u.distTo(u.getParent()) - dist) + " dist = " + u.distTo(u.getParent()));
  249.  
  250.             if (wasIntersection) {
  251.                 for (Vertex w : vertices) {
  252.                     if (w != u) {
  253.                         dist = w.distTo(w.getParent());
  254.                         w.moveFromParent(offset);
  255.                         System.out.println("                    w = " + w.getIndex() + " offset = " + (w.distTo(w.getParent()) - dist) + " dist = " + w.distTo(w.getParent()));
  256.                     }
  257.                 }
  258.  
  259.                 if (!v.getChild().contains(vertices.get(0))) {
  260.                     dist = v.distTo(v.getParent());
  261.                     v.moveFromParent(offset);
  262.                     System.out.println("        siblings of v = " + v.getIndex() + " offset = " + (v.distTo(v.getParent()) - dist) + " dist = " + v.distTo(v.getParent()));
  263.                 }
  264.             }
  265.             wasIntersection = false;
  266.             offset = 0.0;
  267.             System.out.println("\n");
  268.         }
  269.     }
  270.  
  271. //    private static void fillRadials3(Graph tree) {
  272. //        tree.getRadials().clear();
  273. //
  274. //        for (Vertex v: tree.getVertices()) {
  275. //            if (v.getChild().size() != 0)
  276. //                tree.getRadials().add(v.distTo(v.getChild().get(0)));
  277. //            else
  278. //                tree.getRadials().add(v.distTo(v.getParent()));
  279. //        }
  280. //    }
  281.  
  282.     static void useAlgorithm(Graph tree) {
  283.         Vertex root = Algorithm5.findRoot(tree);
  284.  
  285.         tree.calculateMaxDepth(root);
  286.  
  287.         radialPositions(tree, root);
  288.  
  289.         for (Vertex v: tree.getVertices())
  290.             v.castToCartesianCoordinates();
  291.  
  292.         for (Vertex v: tree.getVertices())
  293.             System.out.println("BEFORE INTERSECT v = " + v.getIndex() + " r = " + v.getR() + " angle" + v.getAngle());
  294.  
  295.         deleteIntersections(tree);
  296.  
  297.         tree.fillRadials3();
  298.     }
  299. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement