1 package org.simantics.debug.graphical.layout;
\r
3 public class LayoutAlgorithm {
\r
5 final double OPTIMAL_DISTANCE = 150.0;
\r
6 final double C = 0.1;
\r
7 final double K = C / OPTIMAL_DISTANCE;
\r
9 final double Q = C * OPTIMAL_DISTANCE * OPTIMAL_DISTANCE;
\r
10 final double TOLERANCE = 1e-3;
\r
11 final int MAX_ITERATIONS = 10000;
\r
12 final double MAX_MOVE2 = 40000.0;
\r
22 public LayoutAlgorithm(int[][] neighbors) {
\r
23 this.size = neighbors.length;
\r
24 this.neighbors = neighbors;
\r
25 this.posX = new double[size];
\r
26 this.posY = new double[size];
\r
27 this.forceX = new double[size];
\r
28 this.forceY = new double[size];
\r
31 public double[] getPosX() {
\r
35 public double[] getPosY() {
\r
39 private void computeForces() {
\r
40 for(int i=0;i<size;++i) {
\r
46 for(int j=0;j<size;++j)
\r
48 double dx = posX[j] - x;
\r
49 double dy = posY[j] - y;
\r
50 double l2 = dx*dx + dy*dy;
\r
51 /*double l = Math.sqrt(l2);
\r
57 for(int j : neighbors[i]) {
\r
58 double dx = posX[j] - x;
\r
59 double dy = posY[j] - y;
\r
60 double l2 = dx*dx + dy*dy;
\r
61 double l = Math.sqrt(l2);
\r
71 private boolean converged() {
\r
72 for(int i=0;i<size;++i) {
\r
73 double fx = forceX[i];
\r
74 double fy = forceY[i];
\r
75 double f2 = fx*fx + fy*fy;
\r
82 private void moveAll() {
\r
83 for(int i=0;i<size;++i) {
\r
84 double fx = forceX[i];
\r
85 double fy = forceY[i];
\r
86 double f2 = fx*fx + fy*fy;
\r
87 if(f2 > MAX_MOVE2) {
\r
88 double s = Math.sqrt(MAX_MOVE2 / f2);
\r
98 public void optimize() {
\r
101 for(int iter=0;iter<MAX_ITERATIONS;++iter) {
\r