// Path: src/org/opensourcephysics/stp/util/Util.java
// public class Util {
//   public static Color randomColor() {
//     return new Color((int) (Math.random()*255), (int) (Math.random()*255), (int) (Math.random()*255));
//   }
// 
//   public static int pbc(int i, int L) {
//     if(i>=L) {
//       return i-L;
//     } else if(i<0) {
//       return L+i;
//     } else {
//       return i;
//     }
//   }
// 
//   public static void fill(Random random, int[][] site, double p, int up, int down) {
//     for(int i = 0; i<site.length; i++) {
//       for(int j = 0; j<site[0].length; j++) {
//         double d = random.nextDouble();
//         if(d<p) {
//           site[i][j] = up;
//         } else {
//           site[i][j] = down;
//         }
//       }
//     }
//   }
// 
//   public static void fill(Random random, int[][] site, double p) {
//     for(int i = 0; i<site.length; i++) {
//       for(int j = 0; j<site[0].length; j++) {
//         double d = random.nextDouble();
//         if(d<p) {
//           site[i][j] = 1;
//         } else {
//           site[i][j] = 0;
//         }
//       }
//     }
//   }
// 
//   public static Function computeLinearRegression(Dataset dataset) {
//     double xBar_yBar = 0;
//     double xBar = 0;
//     double yBar = 0;
//     double x2Bar = 0;
//     double x = 0;
//     double y = 0;
//     double[] xpoints = dataset.getXPoints();
//     double[] ypoints = dataset.getYPoints();
//     for(int i = 0; i<xpoints.length; i++) {
//       x = xpoints[i];
//       y = ypoints[i];
//       xBar_yBar += x*y;
//       xBar += x;
//       yBar += y;
//       x2Bar += x*x;
//     }
//     int n = xpoints.length;
//     xBar_yBar = xBar_yBar/n;
//     xBar = xBar/n;
//     yBar = yBar/n;
//     x2Bar = x2Bar/n;
//     double deltaX2 = x2Bar-xBar*xBar;
//     final double m = (xBar_yBar-xBar*yBar)/deltaX2;
//     final double b = yBar-m*xBar;
//     return new Function() {
//       public double evaluate(double x) {
//         return m*x+b;
//       }
// 
//     };
//   }
// 
// }


import java.awt.*;
import java.awt.geom.*;
import java.util.Random;
import org.opensourcephysics.display.*;
import org.opensourcephysics.stp.util.Util;
   * spin it returns +1 If it has a clock wise spin it retuns -1 If there is
   * no vortex it returns 0
   *
   * @param x
   *            Description of the Parameter
   * @param y
   *            Description of the Parameter
   * @return -1,0,1
   */
  protected int identifyVortex(int x, int y) { // all angles between 0 and 2*pi
    double delta = 0;
    double angles[] = new double[] { // these thetas form the angles around a
      // box
      spin[x][y], spin[x][Util.pbc(y+1, L)], spin[Util.pbc(x+1, L)][Util.pbc(y+1, L)], spin[Util.pbc(x+1, L)][y]
    };
    for(int i = 0; i<3; i++) {
      double temp = angles[i+1]-angles[i];
      if((temp<=Math.PI)&&(temp>-Math.PI)) {
        delta += temp;
      } else if(temp>Math.PI) {
        delta += (temp-2*Math.PI);
      } else {
        delta += (temp+2*Math.PI);
      }
    }
    if(delta>Math.PI) {
      return 1;
    } else if(delta<-Math.PI) {
      return -1;
    } else {
// Path: src/org/opensourcephysics/stp/util/Util.java
// public class Util {
//   public static Color randomColor() {
//     return new Color((int) (Math.random()*255), (int) (Math.random()*255), (int) (Math.random()*255));
//   }
// 
//   public static int pbc(int i, int L) {
//     if(i>=L) {
//       return i-L;
//     } else if(i<0) {
//       return L+i;
//     } else {
//       return i;
//     }
//   }
// 
//   public static void fill(Random random, int[][] site, double p, int up, int down) {
//     for(int i = 0; i<site.length; i++) {
//       for(int j = 0; j<site[0].length; j++) {
//         double d = random.nextDouble();
//         if(d<p) {
//           site[i][j] = up;
//         } else {
//           site[i][j] = down;
//         }
//       }
//     }
//   }
// 
//   public static void fill(Random random, int[][] site, double p) {
//     for(int i = 0; i<site.length; i++) {
//       for(int j = 0; j<site[0].length; j++) {
//         double d = random.nextDouble();
//         if(d<p) {
//           site[i][j] = 1;
//         } else {
//           site[i][j] = 0;
//         }
//       }
//     }
//   }
// 
//   public static Function computeLinearRegression(Dataset dataset) {
//     double xBar_yBar = 0;
//     double xBar = 0;
//     double yBar = 0;
//     double x2Bar = 0;
//     double x = 0;
//     double y = 0;
//     double[] xpoints = dataset.getXPoints();
//     double[] ypoints = dataset.getYPoints();
//     for(int i = 0; i<xpoints.length; i++) {
//       x = xpoints[i];
//       y = ypoints[i];
//       xBar_yBar += x*y;
//       xBar += x;
//       yBar += y;
//       x2Bar += x*x;
//     }
//     int n = xpoints.length;
//     xBar_yBar = xBar_yBar/n;
//     xBar = xBar/n;
//     yBar = yBar/n;
//     x2Bar = x2Bar/n;
//     double deltaX2 = x2Bar-xBar*xBar;
//     final double m = (xBar_yBar-xBar*yBar)/deltaX2;
//     final double b = yBar-m*xBar;
//     return new Function() {
//       public double evaluate(double x) {
//         return m*x+b;
//       }
// 
//     };
//   }
// 
// }


// Path: src/org/opensourcephysics/stp/xymodel/XYModel.java
import java.awt.*;
import java.awt.geom.*;
import java.util.Random;
import org.opensourcephysics.display.*;
import org.opensourcephysics.stp.util.Util;

   * spin it returns +1 If it has a clock wise spin it retuns -1 If there is
   * no vortex it returns 0
   *
   * @param x
   *            Description of the Parameter
   * @param y
   *            Description of the Parameter
   * @return -1,0,1
   */
  protected int identifyVortex(int x, int y) { // all angles between 0 and 2*pi
    double delta = 0;
    double angles[] = new double[] { // these thetas form the angles around a
      // box
      spin[x][y], spin[x][Util.pbc(y+1, L)], spin[Util.pbc(x+1, L)][Util.pbc(y+1, L)], spin[Util.pbc(x+1, L)][y]
    };
    for(int i = 0; i<3; i++) {
      double temp = angles[i+1]-angles[i];
      if((temp<=Math.PI)&&(temp>-Math.PI)) {
        delta += temp;
      } else if(temp>Math.PI) {
        delta += (temp-2*Math.PI);
      } else {
        delta += (temp+2*Math.PI);
      }
    }
    if(delta>Math.PI) {
      return 1;
    } else if(delta<-Math.PI) {
      return -1;
    } else {
      return 0;