// PAJ spatial point analysis in Java V 1.0 Oct 2007 //Barry Condron, Dept of Biology, University of Virginia, VA 22903, USA condron@virginia.edu //V. Nagaradjane of Pondicherry, India nagaradjanev@rediffmail.com provided critical help in getting the paste buffer to work with excel on mac's. import javax.swing.*; import java.awt.event.KeyEvent; import java.beans.*; import javax.swing.border.*; import javax.swing.table.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.lang.Double; import java.applet.Applet; import java.lang.Math; import java.awt.event.*; import java.util.*; import java.awt.*; import java.awt.geom.*; import javax.swing.*; import java.awt.dnd.*; import java.awt.datatransfer.*; import java.util.*; import java.awt.*; import javax.swing.JScrollPane; public class PAJ extends JTable /*implements Runnable*/ { //global variables public static int number_of_points=0; public static boolean data_3D=true; public static double[] rank_data_average=new double[50]; public static double[] coordinates_x=new double[10000]; public static double[] coordinates_y=new double[10000]; public static double[] coordinates_z=new double[10000]; public static double[] r_coordinates_x=new double[10000]; public static double[] r_coordinates_y=new double[10000]; public static double[] r_coordinates_z=new double[10000]; public static double[] c_coordinates_x=new double[10000]; public static double[] c_coordinates_y=new double[10000]; public static double[] c_coordinates_z=new double[10000]; double[] mc_coordinates_x=new double[10000]; double[] mc_coordinates_y=new double[10000]; double[] mc_coordinates_z=new double[10000]; int[] mc_coordinates_branch=new int[10000]; int[] coordinates_branch=new int[10000]; public static double[] rank_average=new double[100]; public static double[] rank_cov=new double[100]; //mst int[] k1_mstVertex_1=new int[10000]; int[] k1_mstVertex_2=new int[10000]; int[] k1_mstVertex_3=new int[10000]; int[] k2_mstVertex_1=new int[10000]; int[] k2_mstVertex_2=new int[10000]; int[] k2_mstVertex_3=new int[10000]; int[] p1_mstVertex_1=new int[10000]; int[] p1_mstVertex_2=new int[10000]; int[] p1_mstVertex_3=new int[10000]; int[] p2_mstVertex_1=new int[10000]; int[] p2_mstVertex_2=new int[10000]; int[] p2_mstVertex_3=new int[10000]; //rank public static double[] rank_plot_data_average=new double[100]; public static double[] r_rank_plot_data_average=new double[100]; public static double[] c_rank_plot_data_average=new double[100]; public static double[] rank_plot_MC_min=new double[100]; public static double[] rank_plot_MC_max=new double[100]; public static double[] rank_plot_data_cov=new double[100]; public static double[] r_rank_plot_data_cov=new double[100]; public static double[] c_rank_plot_data_cov=new double[100]; public static double[] rank_plot_MC_cov_min=new double[100]; public static double[] rank_plot_MC_cov_max=new double[100]; //density public static double[] density_plot_data_average=new double[100]; public static double[] r_density_plot_data_average=new double[100]; public static double[] c_density_plot_data_average=new double[100]; public static double[] density_plot_MC_min=new double[100]; public static double[] density_plot_MC_max=new double[100]; public static double[] density_plot_data_cov=new double[100]; public static double[] r_density_plot_data_cov=new double[100]; public static double[] c_density_plot_data_cov=new double[100]; public static double[] density_plot_MC_cov_min=new double[100]; public static double[] density_plot_MC_cov_max=new double[100]; //lacunarity public static double[] lacunarity_plot_data_average=new double[100]; public static double[] r_lacunarity_plot_data_average=new double[100]; public static double[] c_lacunarity_plot_data_average=new double[100]; public static double[] lacunarity_plot_MC_min=new double[100]; public static double[] lacunarity_plot_MC_max=new double[100]; public static double[] lacunarity_plot_data_cov=new double[100]; public static double[] r_lacunarity_plot_data_cov=new double[100]; public static double[] c_lacunarity_plot_data_cov=new double[100]; public static double[] lacunarity_plot_MC_cov_min=new double[100]; public static double[] lacunarity_plot_MC_cov_max=new double[100]; //voronoi public static double[] voronoi_plot_data_average=new double[1000]; public static double[] r_voronoi_plot_data_average=new double[1000]; public static double[] c_voronoi_plot_data_average=new double[1000]; public static double[] voronoi_plot_MC_min=new double[1000]; public static double[] voronoi_plot_MC_max=new double[1000]; public static double[] voronoi_plot_data_cov=new double[1000]; public static double[] voronoi_plot_MC_cov_min=new double[1000]; public static double[] voronoi_plot_MC_cov_max=new double[1000]; public static double scale_factor=0; public static double vor_data_r=0; public static double vor_data_mc_min=0; public static double vor_data_mc_max=0; public static double confidence_limit=100; Random rand = new Random(); public static boolean montecarlo=false; public double r = rand.nextFloat(); public static double min_x = 0; public static double max_x = 0; public static double min_y = 0; public static double max_y =0; public static double min_z = 0; public static double max_z =0; public static class JGraphCanvas extends JComponent { public void JGraphCanvas() { //setDoubleBuffered(true); //setOpaque(true); } public void paintComponent(Graphics g) { //super.paintComponent(g); //***rank graph //draw graph g.setColor(Color.black); g.drawRect(1,1,200,200); g.drawLine(20,190,190,190); g.drawLine(20,20,20,190); g.drawString("Rank Average",15,15); g.drawRect(1,200,200,200); g.drawLine(20,390,190,390); g.drawLine(20,220,20,390); g.drawString("Rank Variation",15,215); //end draw graph //**rank graph //top graph //scale data double max_point=rank_plot_data_average[1]; double min_point=rank_plot_data_average[1]; if (montecarlo){ for (int i=0;i<40;i++) { if (rank_plot_data_average[i]>max_point){max_point=rank_plot_data_average[i];} if (rank_plot_data_average[i]max_point){max_point=r_rank_plot_data_average[i];} if (r_rank_plot_data_average[i]max_point){max_point=c_rank_plot_data_average[i];} if (c_rank_plot_data_average[i]max_point){max_point=rank_plot_MC_max[i];} if (rank_plot_MC_min[i]max_point){max_point=rank_plot_MC_min[i];} } } if (!montecarlo){ for (int i=0;i<40;i++) { if (c_rank_plot_data_average[i]>max_point){max_point=c_rank_plot_data_average[i];} if (c_rank_plot_data_average[i]max_point){max_point=r_rank_plot_data_average[i];} if (r_rank_plot_data_average[i]max_point){max_point=rank_plot_data_average[i];} if (rank_plot_data_average[i]>max_point){max_point=rank_plot_data_average[i];} } } //we want the data to span 370 pixels double draw_scale_factor = 170/(max_point-min_point); for (int i=0;i<40;i++) { rank_plot_data_average[i]=180-(rank_plot_data_average[i]-min_point)*draw_scale_factor; r_rank_plot_data_average[i]=180-(r_rank_plot_data_average[i]-min_point)*draw_scale_factor; c_rank_plot_data_average[i]=180-(c_rank_plot_data_average[i]-min_point)*draw_scale_factor; //end scale data } //draw MC max for (int i=0;i<40;i++) { rank_plot_MC_max[i]=180-(rank_plot_MC_max[i]-min_point)*draw_scale_factor; if (rank_plot_MC_max[i]>180){rank_plot_MC_max[i]=180;} if (rank_plot_MC_max[i]<0){rank_plot_MC_max[i]=0;} //end scale data } //draw data for (int i=0;i<40;i++) { rank_plot_MC_min[i]=180-(rank_plot_MC_min[i]-min_point)*draw_scale_factor; if (rank_plot_MC_min[i]>180){rank_plot_MC_min[i]=180;} if (rank_plot_MC_min[i]<0){rank_plot_MC_min[i]=0;} //end scale data } for (int i=1;i<40;i++) { Polygon p; p= new Polygon(); p.addPoint((int)(18*(i-1)*0.25)+20, (int) rank_plot_MC_min[i-1]); p.addPoint((int)(18*i*0.25)+20, (int) rank_plot_MC_min[i]); p.addPoint((int)(18*i*0.25)+20, (int) rank_plot_MC_max[i]); p.addPoint((int)(18*(i-1)*0.25)+20, (int) rank_plot_MC_max[i-1]); p.addPoint((int)(18*(i-1)*0.25)+20, (int) rank_plot_MC_min[i-1]); g.setColor(Color.red); g.fillPolygon(p); } //draw data g.setColor(Color.blue); for (int i=0;i<40;i++) { g.fillRect((int)(18*i*0.25)+20,(int)(rank_plot_data_average[i]),2,2); } g.setColor(Color.green); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(r_rank_plot_data_average[i]),2,2); } g.setColor(Color.yellow); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(c_rank_plot_data_average[i]),2,2); } //lower graph //scale data max_point=rank_plot_data_cov[1]; min_point=rank_plot_data_cov[1]; if (montecarlo){ for (int i=0;i<40;i++) { if (rank_plot_data_cov[i]>max_point){max_point=rank_plot_data_cov[i];} if (rank_plot_data_cov[i]max_point){max_point=r_rank_plot_data_cov[i];} if (r_rank_plot_data_cov[i]max_point){max_point=c_rank_plot_data_cov[i];} if (c_rank_plot_data_cov[i]max_point){max_point=rank_plot_MC_cov_max[i];} if (rank_plot_MC_cov_min[i]max_point){max_point=rank_plot_MC_cov_min[i];} } } if (!montecarlo){ for (int i=0;i<40;i++) { if (rank_plot_data_cov[i]>max_point){max_point=rank_plot_data_cov[i];} if (rank_plot_data_cov[i]max_point){max_point=r_rank_plot_data_cov[i];} if (r_rank_plot_data_cov[i]max_point){max_point=c_rank_plot_data_cov[i];} if (c_rank_plot_data_cov[i]380){rank_plot_MC_cov_max[i]=380;} if (rank_plot_MC_cov_max[i]<200){rank_plot_MC_cov_max[i]=200;} //end scale data } //draw data for (int i=0;i<40;i++) { rank_plot_MC_cov_min[i]=380-(rank_plot_MC_cov_min[i]-min_point)*draw_scale_factor; if (rank_plot_MC_cov_min[i]>380){rank_plot_MC_cov_min[i]=380;} if (rank_plot_MC_cov_min[i]<200){rank_plot_MC_cov_min[i]=200;} //end scale data } for (int i=1;i<40;i++) { Polygon cv; cv= new Polygon(); cv.addPoint((int)(18*(i-1)*0.25)+20, (int) rank_plot_MC_cov_min[i-1]); cv.addPoint((int)(18*i*0.25)+20, (int) rank_plot_MC_cov_min[i]); cv.addPoint((int)(18*i*0.25)+20, (int) rank_plot_MC_cov_max[i]); cv.addPoint((int)(18*(i-1)*0.25)+20, (int) rank_plot_MC_cov_max[i-1]); cv.addPoint((int)(18*(i-1)*0.25)+20, (int) rank_plot_MC_cov_min[i-1]); g.setColor(Color.red); g.fillPolygon(cv); } //draw data g.setColor(Color.blue); for (int i=0;i<40;i++) { g.fillRect((int)(18*i*0.25)+20,(int)(rank_plot_data_cov[i]),2,2); } g.setColor(Color.green); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(r_rank_plot_data_cov[i]),2,2); } g.setColor(Color.yellow); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(c_rank_plot_data_cov[i]),2,2); } //***density graph //draw graph g.setColor(Color.black); g.drawRect(201,1,200,200); g.drawLine(220,190,390,190); g.drawLine(220,20,220,190); g.drawString("Density Average",215,15); g.drawRect(201,200,200,200); g.drawLine(220,390,390,390); g.drawLine(220,220,220,390); g.drawString("Density Variation",215,215); //end draw graph //top graph //scale data max_point=density_plot_data_average[1]; min_point=density_plot_data_average[1]; if (montecarlo){ for (int i=0;i<40;i++) { if (density_plot_data_average[i]>max_point){max_point=density_plot_data_average[i];} if (density_plot_data_average[i]max_point){max_point=r_density_plot_data_average[i];} // if (c_density_plot_data_average[i]max_point){max_point=c_density_plot_data_average[i];} if (r_density_plot_data_average[i]max_point){max_point=density_plot_MC_max[i];} if (density_plot_MC_min[i]max_point){max_point=density_plot_MC_min[i];} } } if (!montecarlo){ for (int i=0;i<40;i++) { // if (c_density_plot_data_average[i]max_point){max_point=c_density_plot_data_average[i];} if (density_plot_data_average[i]>max_point){max_point=density_plot_data_average[i];} if (density_plot_data_average[i]max_point){max_point=r_density_plot_data_average[i];} if (r_density_plot_data_average[i]180){density_plot_MC_max[i]=180;} if (density_plot_MC_max[i]<0){density_plot_MC_max[i]=0;} //end scale data } //draw data for (int i=0;i<40;i++) { density_plot_MC_min[i]=180-(density_plot_MC_min[i]-min_point)*draw_scale_factor; if (density_plot_MC_min[i]>180){density_plot_MC_min[i]=180;} if (density_plot_MC_min[i]<0){density_plot_MC_min[i]=0;} //end scale data } for (int i=1;i<40;i++) { Polygon p; p= new Polygon(); p.addPoint((int)(18*(i-1)*0.25)+220, (int) density_plot_MC_min[i-1]); p.addPoint((int)(18*i*0.25)+220, (int) density_plot_MC_min[i]); p.addPoint((int)(18*i*0.25)+220, (int) density_plot_MC_max[i]); p.addPoint((int)(18*(i-1)*0.25)+220, (int) density_plot_MC_max[i-1]); p.addPoint((int)(18*(i-1)*0.25)+220, (int) density_plot_MC_min[i-1]); g.setColor(Color.red); g.fillPolygon(p); } //draw data g.setColor(Color.blue); for (int i=0;i<40;i++) { g.fillRect((int)(18*i*0.25)+220,(int)(density_plot_data_average[i]),2,2); } g.setColor(Color.green); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+220,(int)(r_density_plot_data_average[i]),2,2); } g.setColor(Color.yellow); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+220,(int)(c_density_plot_data_average[i]),2,2); } //lower graph //scale data max_point=density_plot_data_cov[1]; min_point=density_plot_data_cov[1]; if (montecarlo){ for (int i=0;i<40;i++) { if (density_plot_data_cov[i]>max_point){max_point=density_plot_data_cov[i];} if (density_plot_data_cov[i]max_point){max_point=r_density_plot_data_cov[i];} // if (r_density_plot_data_cov[i]max_point){max_point=density_plot_MC_cov_max[i];} if (density_plot_MC_cov_min[i]max_point){max_point=density_plot_MC_cov_min[i];} } } if (!montecarlo){ for (int i=0;i<40;i++) { if (density_plot_data_cov[i]>max_point){max_point=density_plot_data_cov[i];} if (density_plot_data_cov[i]max_point){max_point=r_density_plot_data_cov[i];} // if (r_density_plot_data_cov[i]380){density_plot_MC_cov_max[i]=380;} if (density_plot_MC_cov_max[i]<200){density_plot_MC_cov_max[i]=200;} //end scale data } //draw data for (int i=0;i<40;i++) { density_plot_MC_cov_min[i]=380-(density_plot_MC_cov_min[i]-min_point)*draw_scale_factor; if (density_plot_MC_cov_min[i]>380){density_plot_MC_cov_min[i]=380;} if (density_plot_MC_cov_min[i]<200){density_plot_MC_cov_min[i]=200;} //end scale data } for (int i=1;i<40;i++) { Polygon cv; cv= new Polygon(); cv.addPoint((int)(18*(i-1)*0.25)+220, (int) density_plot_MC_cov_min[i-1]); cv.addPoint((int)(18*i*0.25)+220, (int) density_plot_MC_cov_min[i]); cv.addPoint((int)(18*i*0.25)+220, (int) density_plot_MC_cov_max[i]); cv.addPoint((int)(18*(i-1)*0.25)+220, (int) density_plot_MC_cov_max[i-1]); cv.addPoint((int)(18*(i-1)*0.25)+220, (int) density_plot_MC_cov_min[i-1]); g.setColor(Color.red); g.fillPolygon(cv); } //draw data g.setColor(Color.blue); for (int i=0;i<40;i++) { g.fillRect((int)(18*i*0.25)+220,(int)(density_plot_data_cov[i]),2,2); } g.setColor(Color.green); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+220,(int)(r_density_plot_data_cov[i]),2,2); } g.setColor(Color.yellow); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+220,(int)(c_density_plot_data_cov[i]),2,2); } //**lacunarity graph g.setColor(Color.black); g.drawRect(1,400,200,200); g.drawLine(20,590,190,590); g.drawLine(20,420,20,590); g.drawString("Lacunarity Average",15,415); g.drawRect(1,600,200,200); g.drawLine(20,790,190,790); g.drawLine(20,620,20,790); g.drawString("Lacunarity Variation",15,615); //top graph //scale data max_point=lacunarity_plot_data_average[1]; min_point=lacunarity_plot_data_average[1]; if (montecarlo){ for (int i=0;i<40;i++) { if (lacunarity_plot_data_average[i]>max_point){max_point=lacunarity_plot_data_average[i];} if (lacunarity_plot_data_average[i]max_point){max_point=r_lacunarity_plot_data_average[i];} if (r_lacunarity_plot_data_average[i]max_point){max_point=c_lacunarity_plot_data_average[i];} if (c_lacunarity_plot_data_average[i]max_point){max_point=lacunarity_plot_MC_max[i];} if (lacunarity_plot_MC_min[i]max_point){max_point=lacunarity_plot_MC_min[i];} } } if (!montecarlo){ for (int i=0;i<40;i++) { if (c_lacunarity_plot_data_average[i]>max_point){max_point=c_lacunarity_plot_data_average[i];} if (c_lacunarity_plot_data_average[i]max_point){max_point=lacunarity_plot_data_average[i];} if (lacunarity_plot_data_average[i]max_point){max_point=r_lacunarity_plot_data_average[i];} if (r_lacunarity_plot_data_average[i]580){lacunarity_plot_MC_max[i]=580;} if (lacunarity_plot_MC_max[i]<400){lacunarity_plot_MC_max[i]=400;} //end scale data } //draw data for (int i=0;i<40;i++) { lacunarity_plot_MC_min[i]=580-(lacunarity_plot_MC_min[i]-min_point)*draw_scale_factor; if (lacunarity_plot_MC_min[i]>580){lacunarity_plot_MC_min[i]=580;} if (lacunarity_plot_MC_min[i]<400){lacunarity_plot_MC_min[i]=400;} //end scale data } for (int i=1;i<40;i++) { Polygon p; p= new Polygon(); p.addPoint((int)(18*(i-1)*0.25)+20, (int) lacunarity_plot_MC_min[i-1]); p.addPoint((int)(18*i*0.25)+20, (int) lacunarity_plot_MC_min[i]); p.addPoint((int)(18*i*0.25)+20, (int) lacunarity_plot_MC_max[i]); p.addPoint((int)(18*(i-1)*0.25)+20, (int) lacunarity_plot_MC_max[i-1]); p.addPoint((int)(18*(i-1)*0.25)+20, (int) lacunarity_plot_MC_min[i-1]); g.setColor(Color.red); g.fillPolygon(p); } //draw data g.setColor(Color.blue); for (int i=0;i<40;i++) { g.fillRect((int)(18*i*0.25)+20,(int)(lacunarity_plot_data_average[i]),2,2); } g.setColor(Color.green); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(r_lacunarity_plot_data_average[i]),2,2); } g.setColor(Color.yellow); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(c_lacunarity_plot_data_average[i]),2,2); } //lower graph //scale data max_point=lacunarity_plot_data_cov[1]; min_point=lacunarity_plot_data_cov[1]; if (montecarlo){ for (int i=0;i<40;i++) { if (lacunarity_plot_data_cov[i]>max_point){max_point=lacunarity_plot_data_cov[i];} if (lacunarity_plot_data_cov[i]max_point){max_point=r_lacunarity_plot_data_cov[i];} // if (r_lacunarity_plot_data_cov[i]max_point){max_point=lacunarity_plot_MC_cov_max[i];} if (lacunarity_plot_MC_cov_min[i]max_point){max_point=lacunarity_plot_MC_cov_min[i];} } } if (!montecarlo){ for (int i=4;i<40;i++) { if (lacunarity_plot_data_cov[i]>max_point){max_point=lacunarity_plot_data_cov[i];} if (lacunarity_plot_data_cov[i]max_point){max_point=r_lacunarity_plot_data_cov[i];} // if (r_lacunarity_plot_data_cov[i]780){lacunarity_plot_MC_cov_max[i]=780;} if (lacunarity_plot_MC_cov_max[i]<600){lacunarity_plot_MC_cov_max[i]=600;} //end scale data } //draw data for (int i=0;i<40;i++) { lacunarity_plot_MC_cov_min[i]=780-(lacunarity_plot_MC_cov_min[i]-min_point)*draw_scale_factor; if (lacunarity_plot_MC_cov_min[i]>780){lacunarity_plot_MC_cov_min[i]=780;} if (lacunarity_plot_MC_cov_min[i]<600){lacunarity_plot_MC_cov_min[i]=600;} //end scale data } for (int i=1;i<40;i++) { Polygon cv; cv= new Polygon(); cv.addPoint((int)(18*(i-1)*0.25)+20, (int) lacunarity_plot_MC_cov_min[i-1]); cv.addPoint((int)(18*i*0.25)+20, (int) lacunarity_plot_MC_cov_min[i]); cv.addPoint((int)(18*i*0.25)+20, (int) lacunarity_plot_MC_cov_max[i]); cv.addPoint((int)(18*(i-1)*0.25)+20, (int) lacunarity_plot_MC_cov_max[i-1]); cv.addPoint((int)(18*(i-1)*0.25)+20, (int) lacunarity_plot_MC_cov_min[i-1]); g.setColor(Color.red); g.fillPolygon(cv); } //draw data g.setColor(Color.blue); for (int i=4;i<40;i++) { g.fillRect((int)(18*i*0.25)+20,(int)(lacunarity_plot_data_cov[i]),2,2); } g.setColor(Color.green); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(r_lacunarity_plot_data_cov[i]),2,2); } g.setColor(Color.yellow); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25)+20,(int)(c_lacunarity_plot_data_cov[i]),2,2); } //***voronoi graph //draw graph g.setColor(Color.black); g.drawRect(201,400,200,200); g.drawLine(220,590,390,590); g.drawLine(220,420,220,590); g.drawString("Voronoi Distribution",215,415); /*g.drawRect(201,600,200,200); g.drawLine(220,790,390,790); g.drawLine(220,620,220,790); g.drawString("Density Variation",215,615);*/ //end draw graph //top graph //scale data max_point=voronoi_plot_data_average[1]; min_point=voronoi_plot_data_average[1]; if (montecarlo){ for (int i=0;i<100;i++) { if (voronoi_plot_data_average[i]>max_point){max_point=voronoi_plot_data_average[i];} if (voronoi_plot_data_average[i]max_point){max_point=r_voronoi_plot_data_average[i];} if (r_voronoi_plot_data_average[i]max_point){max_point=c_voronoi_plot_data_average[i];} if (c_voronoi_plot_data_average[i]max_point){max_point=voronoi_plot_MC_max[i];} if (voronoi_plot_MC_min[i]max_point){max_point=voronoi_plot_MC_min[i];} } } if (!montecarlo){ for (int i=0;i<100;i++) { if (voronoi_plot_data_average[i]>max_point){max_point=voronoi_plot_data_average[i];} if (voronoi_plot_data_average[i]max_point){max_point=r_voronoi_plot_data_average[i];} if (r_voronoi_plot_data_average[i]max_point){max_point=c_voronoi_plot_data_average[i];} if (c_voronoi_plot_data_average[i]580){voronoi_plot_MC_max[i]=580;} if (voronoi_plot_MC_max[i]<400){voronoi_plot_MC_max[i]=400;} //end scale data } //draw data for (int i=0;i<100;i++) { voronoi_plot_MC_min[i]=580-(voronoi_plot_MC_min[i]-min_point)*draw_scale_factor; if (voronoi_plot_MC_min[i]>580){voronoi_plot_MC_min[i]=580;} if (voronoi_plot_MC_min[i]<400){voronoi_plot_MC_min[i]=400;} //end scale data } for (int i=1;i<40;i++) { Polygon p; p= new Polygon(); p.addPoint((int)(18*(i-1)*0.25*1)+220, (int) voronoi_plot_MC_min[i-1]); p.addPoint((int)(18*i*0.25*1)+220, (int) voronoi_plot_MC_min[i]); p.addPoint((int)(18*i*0.25*1)+220, (int) voronoi_plot_MC_max[i]); p.addPoint((int)(18*(i-1)*0.25*1)+220, (int) voronoi_plot_MC_max[i-1]); p.addPoint((int)(18*(i-1)*0.25*1)+220, (int) voronoi_plot_MC_min[i-1]); g.setColor(Color.red); g.fillPolygon(p); } //draw data g.setColor(Color.blue); for (int i=0;i<40;i++) { g.fillRect((int)(18*i*0.25*1)+220,(int)(voronoi_plot_data_average[i]),2,2); } g.setColor(Color.green); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25*1)+220,(int)(r_voronoi_plot_data_average[i]),2,2); } g.setColor(Color.yellow); for (int i=0;i<40;i++) { //g.fillRect((int)(18*i*0.25*1)+220,(int)(c_voronoi_plot_data_average[i]),2,2); } } } public PAJ() { super(10000, 100); this.setToolTipText("Use Menu cut and paste to transplant data from Excel"); this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); this.setCellSelectionEnabled(true); for (int i=0;i<10000;i++) { coordinates_x[i]=0; //x coordinates_y[i]=0; //y coordinates_z[i]=0; //z } } public static void main(String arg[]) { initPAJ(); } void regularizeData(double local_max_x, double local_min_x,double local_max_y,double local_min_y,double local_max_z,double local_min_z) { double r = rand.nextFloat(); double min_distance=0; // algorithm:start from a random position: then place next varicoity so that it is at a maxiumal spacing from last one - look at 100 candidates and choose furthest //first one r = rand.nextFloat(); r_coordinates_x[0]=r*(local_max_x-local_min_x) + local_min_x; r = rand.nextFloat(); r_coordinates_y[0]=r*(local_max_y-local_min_y) + local_min_y; r = rand.nextFloat(); r_coordinates_z[0]=r*(local_max_z-local_min_z) + local_min_z; for (int i=1;imin_distance2) { r_coordinates_x[i]=test_x; r_coordinates_y[i]=test_y; r_coordinates_z[i]=test_z; min_distance2=min_distance1; } //end point assignment } //end d } } void clusterizeData(double local_max_x, double local_min_x,double local_max_y,double local_min_y,double local_max_z,double local_min_z) { double r = rand.nextFloat(); double min_distance=0; // algorithm:start from a random position: then place next varicoity so that it is at a maxiumal spacing from last one - look at 100 candidates and choose furthest //first one c_coordinates_x[0]=0.25*(local_max_x-local_min_x) + local_min_x; c_coordinates_y[0]=0.25*(local_max_y-local_min_y) + local_min_y; c_coordinates_z[0]=0.5*(local_max_z-local_min_z) + local_min_z; c_coordinates_x[1]=0.25*(local_max_x-local_min_x) + local_min_x; c_coordinates_y[1]=0.75*(local_max_y-local_min_y) + local_min_y; c_coordinates_z[1]=0.5*(local_max_z-local_min_z) + local_min_z; c_coordinates_x[2]=0.75*(local_max_x-local_min_x) + local_min_x; c_coordinates_y[2]=0.25*(local_max_y-local_min_y) + local_min_y; c_coordinates_z[2]=0.5*(local_max_z-local_min_z) + local_min_z; c_coordinates_x[3]=0.75*(local_max_x-local_min_x) + local_min_x; c_coordinates_y[3]=0.75*(local_max_y-local_min_y) + local_min_y; c_coordinates_z[3]=0.5*(local_max_z-local_min_z) + local_min_z; for (int i=4;i0.5) {r=-1*r;} test_x=coordinates_x[mother_point]+r; r = spacing_constant_min+spacing_constant*rand.nextFloat(); if(rand.nextFloat()>0.5) {r=-1*r;} test_y=coordinates_y[mother_point]+r; r = spacing_constant_min+spacing_constant*rand.nextFloat(); if(rand.nextFloat()>0.5) {r=-1*r;} test_z=coordinates_z[mother_point]+r; // see if this point is in bounds good_x=false; if ((test_xlocal_min_x)){good_x=true;} good_y=false; if ((test_ylocal_min_y)){good_y=true;} good_z=false; if ((test_zlocal_min_z)){good_z=true;} //check spacing min_distance=local_max_x; not_too_close=false; for (int d=0;d2){not_too_close=true;} if (good_x&good_y&good_z¬_too_close) { min_distance=local_max_x; double overall_min_distance=local_max_x; for (int d=0;d<20;d++) //look at primary varicosities { double distance= Math.sqrt ((coordinates_x[d]-test_x)*(coordinates_x[d]-test_x)+(coordinates_y[d]-test_y)*(coordinates_y[d]-test_y)+(coordinates_z[d]-test_z)*(coordinates_z[d]-test_z)); if ((distancemin_distance){ overall_min_distance=min_distance; coordinates_x[n]=test_x; coordinates_y[n]=test_y; coordinates_z[n]=test_z; coordinates_branch[mother_point]=coordinates_branch[mother_point]+1; dm.setValueAt(String.valueOf(test_x), n, 0); dm.setValueAt(String.valueOf(test_y), n,1); dm.setValueAt(String.valueOf(test_z), n,2); j=1000; k=1000; } }//end in boundary loop }//end j loop; making a new point }//end k loop; making a new point } //end realistic model } void generateSpecialData(PAJ dt, TableModel dm, String[][] data) { double rx = rand.nextFloat(); double ry = rand.nextFloat(); double rz = rand.nextFloat(); double x1=0; double x2=0; double y1=0; double y2=0; double z1=0; double z2=0; double point_to_point_distance=0; for (int i=0;i<1000;i++) // make random set { //then check if too close to all other coordinates - get 100 tries to make sure that we are more than 4 units from nearest for (int j=0;j<100000;j++) { //now go through all i points generated so far and make sure all distances are over 4 //first make random coordinates rx = 25*rand.nextFloat(); ry = 25*rand.nextFloat(); rz = 25*rand.nextFloat(); for (int k=0;k(rd-1*scale_factor))) { density[i][l]=density[i][l]+1; }//end if }//end k double semi_sphere_volume=(4*3.149*rd*rd*rd/3)-(4*3.149*(rd-1*scale_factor)*(rd-1*scale_factor)*(rd-1*scale_factor)/3); density[i][l]=density[i][l]/semi_sphere_volume; } //end j } //end point scan i //now determine average for (int j=0;j<40;j++) { density_average[j]=0; for (int i=0;i(rd-1*scale_factor))) { density[i][l]=density[i][l]+1; }//end if }//end k double semi_sphere_volume=(4*3.149*rd*rd*rd/3)-(4*3.149*(rd-1*scale_factor)*(rd-1*scale_factor)*(rd-1*scale_factor)/3); density[i][l]=density[i][l]/semi_sphere_volume; } //end j } //end point scan i //now determine average and cov of each point //now determine average for (int j=0;j<40;j++) { density_mc_average[j]=0; for (int i=0;idensity_plot_MC_max[j]){density_plot_MC_max[j]=density_mc_average[j];} if (density_mc_average[j]density_plot_MC_cov_max[j]){density_plot_MC_cov_max[j]=density_mc_cov[j];} if (density_mc_cov[j]p_distance){ min_p_distance=p_distance; min_point=p; } }//end p point search //now add to appropriate voronoi voronoi_volume[min_point]= voronoi_volume[min_point]+1; //remove those volumes close to edge //check to see if our test point is near edge ie if it picks up a i,j,k at edge voronoi_edge[min_point]=false; if (i<(int)(local_min_x+3)){voronoi_edge[min_point]=true;} if (i>(int)(local_max_x-3)){voronoi_edge[min_point]=true;} if (j<(int)(local_min_y+3)){voronoi_edge[min_point]=true;} if (j>(int)(local_max_y-3)){voronoi_edge[min_point]=true;} if (k<(int)(local_min_z+3)){voronoi_edge[min_point]=true;} if (k>(int)(local_max_z-3)){voronoi_edge[min_point]=true;} }//end z }//end y }//end x //now work out distribution //dist scale //first calculate total volume /*int total_volume=0; for (int v=0; v0)&(!voronoi_edge[v])){total_volume=total_volume+1;} } */ for (int v=0; v<1000; v++) { voronoi_dist[v]=0; for (int p=0;pv*voronoi_bin-voronoi_bin)&(!voronoi_edge[p])) {voronoi_dist[v]=voronoi_dist[v]+1;} }//end point scan //voronoi_dist[v]=voronoi_dist[v]*100/total_volume; if (Double.isNaN(voronoi_dist[v])){voronoi_dist[v]=0;} voronoi_plot_data_average[v]=voronoi_dist[v]; }//end distribution calculation //r^2 calculation: 15-100, step 5 //use model r^2=ssp*ssp/ssx*ssy double ssx=0; double ssy=0; double sx=0; double sy=0; double ssp=0; double mean_x=0; double mean_y=0; //first determine means int r_bin=10; for (int count =3; count<21; count++) { r_bin=r_bin+5; mean_x=mean_x+Math.log10(r_bin*r_bin*r_bin); if(voronoi_dist[count]>0){mean_y=mean_y+Math.log10(voronoi_dist[count]);} } mean_x=mean_x/18; mean_y=mean_y/18; r_bin=10; for (int count =3; count<21; count++) { r_bin=r_bin+5; sx=Math.log10(r_bin*r_bin*r_bin)-mean_x; if(voronoi_dist[count]>0){sy=Math.log10(voronoi_dist[count])-mean_y;} if(voronoi_dist[count]==0){sy=0-mean_y;} ssx=ssx+(sx*sx); ssy=ssy+(sy*sy); ssp=ssp+(sy*sx); } vor_data_r=(ssp*ssp)/(ssx*ssy); //write voronoi volume to spreasheet for (int p=0;plocal_max_x){local_max_x=mc_coordinates_x[i];} if (mc_coordinates_x[i]local_max_y){local_max_y=mc_coordinates_y[i];} if (mc_coordinates_y[i]local_max_z){local_max_z=mc_coordinates_z[i];} if (mc_coordinates_z[i]p_distance){ min_p_distance=p_distance; min_point=p; } }//end p point search //now add to appropriate voronoi mc_voronoi_volume[min_point]= mc_voronoi_volume[min_point]+1; //remove those volumes close to edge //check to see if our test point is near edge ie if it picks up a i,j,k at edge mc_voronoi_edge[min_point]=false; if (i<(int)(local_min_x+3)){mc_voronoi_edge[min_point]=true;} if (i>(int)(local_max_x-3)){mc_voronoi_edge[min_point]=true;} if (j<(int)(local_min_y+3)){mc_voronoi_edge[min_point]=true;} if (j>(int)(local_max_y-3)){mc_voronoi_edge[min_point]=true;} if (k<(int)(local_min_z+3)){mc_voronoi_edge[min_point]=true;} if (k>(int)(local_max_z-3)){mc_voronoi_edge[min_point]=true;} }//end z }//end y }//end x //now work out distribution //dist scale //total_volume=-0; for (int v=0; v<1000; v++) { for (int p=0;pv*voronoi_bin-voronoi_bin)&(!mc_voronoi_edge[p])) {mc_voronoi_dist[v]=mc_voronoi_dist[v]+1;} }//end point scan //mc_voronoi_dist[v]=mc_voronoi_dist[v]*100/total_volume; }//end distribution calculation //determine max and min of dist for (int v=0; v<1000; v++) { if (m==0) //initialize min and max { mc_voronoi_dist_min[v]=mc_voronoi_dist[v]; mc_voronoi_dist_max[v]=mc_voronoi_dist[v]; } if(mc_voronoi_dist[v]mc_voronoi_dist_max[v]){mc_voronoi_dist_max[v]=mc_voronoi_dist[v];} voronoi_plot_MC_max[v]=mc_voronoi_dist_max[v]; voronoi_plot_MC_min[v]=mc_voronoi_dist_min[v]; } //r^2 calculation: 15-100, step 5 //use model r^2=ssp*ssp/ssx*ssy ssx=0; ssy=0; ssp=0; sx=0; sy=0; mean_x=0; mean_y=0; //first determine means r_bin=10; for (int count =3; count<21; count++) { r_bin=r_bin+5; mean_x=mean_x+Math.log10(r_bin*r_bin*r_bin); if(mc_voronoi_dist[count]>0){mean_y=mean_y+Math.log10(mc_voronoi_dist[count]);} } mean_x=mean_x/18; mean_y=mean_y/18; r_bin=10; for (int count =3; count<21; count++) { r_bin=r_bin+5; sx=Math.log10(r_bin*r_bin*r_bin)-mean_x; if(mc_voronoi_dist[count]>0){sy=Math.log10(mc_voronoi_dist[count])-mean_y;} if(mc_voronoi_dist[count]==0){sy=0-mean_y;} ssx=ssx+(sx*sx); ssy=ssy+(sy*sy); ssp=ssp+(sy*sx); } vor_data_mc=(ssp*ssp)/(ssx*ssy); if (m==0) //initialize min and max { vor_data_mc_min=vor_data_mc; vor_data_mc_max=vor_data_mc; } if(vor_data_mcvor_data_mc_max){vor_data_mc_max=vor_data_mc;} }//end m }//end monte carlo /* //regular test if (r_coordinates_x[0]==0) {regularizeData(local_max_x,local_min_x,local_max_y,local_min_y,local_max_z,local_min_z);} //first setup voronoi bins - one for each point //reset voronoi volumes for (int p=0;pp_distance){ min_p_distance=p_distance; min_point=p; } }//end p point search //now add to appropriate voronoi voronoi_volume[min_point]= voronoi_volume[min_point]+1; //remove those volumes close to edge //check to see if our test point is near edge ie if it picks up a i,j,k at edge voronoi_edge[min_point]=false; if (i<(int)(local_min_x+3)){voronoi_edge[min_point]=true;} if (i>(int)(local_max_x-3)){voronoi_edge[min_point]=true;} if (j<(int)(local_min_y+3)){voronoi_edge[min_point]=true;} if (j>(int)(local_max_y-3)){voronoi_edge[min_point]=true;} if (k<(int)(local_min_z+3)){voronoi_edge[min_point]=true;} if (k>(int)(local_max_z-3)){voronoi_edge[min_point]=true;} }//end z }//end y }//end x for (int v=0; v<1000; v++) { voronoi_dist[v]=0; for (int p=0;pv*voronoi_bin-voronoi_bin)&(!voronoi_edge[p])) {voronoi_dist[v]=voronoi_dist[v]+1;} }//end point scan //voronoi_dist[v]=voronoi_dist[v]*100/total_volume; if (Double.isNaN(voronoi_dist[v])){voronoi_dist[v]=0;} r_voronoi_plot_data_average[v]=voronoi_dist[v]; }//end distribution calculation //cluster test if (c_coordinates_x[0]==0) {clusterizeData(local_max_x,local_min_x,local_max_y,local_min_y,local_max_z,local_min_z);} //first setup voronoi bins - one for each point //reset voronoi volumes for (int p=0;pp_distance){ min_p_distance=p_distance; min_point=p; } }//end p point search //now add to appropriate voronoi voronoi_volume[min_point]= voronoi_volume[min_point]+1; //remove those volumes close to edge //check to see if our test point is near edge ie if it picks up a i,j,k at edge voronoi_edge[min_point]=false; if (i<(int)(local_min_x+3)){voronoi_edge[min_point]=true;} if (i>(int)(local_max_x-3)){voronoi_edge[min_point]=true;} if (j<(int)(local_min_y+3)){voronoi_edge[min_point]=true;} if (j>(int)(local_max_y-3)){voronoi_edge[min_point]=true;} if (k<(int)(local_min_z+3)){voronoi_edge[min_point]=true;} if (k>(int)(local_max_z-3)){voronoi_edge[min_point]=true;} }//end z }//end y }//end x for (int v=0; v<1000; v++) { voronoi_dist[v]=0; for (int p=0;pv*voronoi_bin-voronoi_bin)&(!voronoi_edge[p])) {voronoi_dist[v]=voronoi_dist[v]+1;} }//end point scan //voronoi_dist[v]=voronoi_dist[v]*100/total_volume; if (Double.isNaN(voronoi_dist[v])){voronoi_dist[v]=0;} c_voronoi_plot_data_average[v]=voronoi_dist[v]; }//end distribution calculation */ for (int p=0;p<1000;p++) { dm.setValueAt(String.valueOf( p*voronoi_bin*scale_factor), p,27); dm.setValueAt(String.valueOf( voronoi_dist[p]), p,28); dm.setValueAt(String.valueOf( mc_voronoi_dist_min[p]), p,29); dm.setValueAt(String.valueOf( mc_voronoi_dist_max[p]), p,30); dm.setValueAt(String.valueOf(vor_data_r), 12,4); dm.setValueAt(String.valueOf(vor_data_mc_min), 13,4); dm.setValueAt(String.valueOf(vor_data_mc_max), 14,4); } }//end voronoi void lacunarityMeasures(PAJ dt, TableModel dm, String[][] data) { double r = rand.nextFloat(); int x=0; int y=0; int z=0; double bin_size=0; int lcount=0; double average_density[]=new double[50]; double cov_density[]=new double[50]; double mc_average_density[]=new double[50]; double mc_cov_density[]=new double[50]; double local_min_x=0; double local_max_x=0; double local_min_y=0; double local_max_y=0; double local_min_z=0; double local_max_z=0; double lac_data_mc=0; double lac_data_r=0; double min_lac_data=0; double max_lac_data=0; int counter=0; int lacunarity_number =10000; double density[]=new double[lacunarity_number]; //measure local max/mins local_max_x=coordinates_x[0]; local_min_x=coordinates_x[0]; local_max_y=coordinates_y[0]; local_min_y=coordinates_y[0]; local_max_z=coordinates_z[0]; local_min_z=coordinates_z[0]; for (int i=0;ilocal_max_x){local_max_x=coordinates_x[i];} if (coordinates_x[i]local_max_y){local_max_y=coordinates_y[i];} if (coordinates_y[i]local_max_z){local_max_z=coordinates_z[i];} if (coordinates_z[i]x)&(coordinates_x[k]y)&(coordinates_y[k]z)&(coordinates_z[k]0){mean_y=mean_y+Math.log10(cov_density[count]);} } mean_x=mean_x/44; mean_y=mean_y/44; r_bin=1; for (int count =1; count<45; count++) { r_bin=r_bin+0.25; sx=Math.log10(r_bin*r_bin*r_bin)-mean_x; if(cov_density[count]>0){sy=Math.log10(cov_density[count])-mean_y;} if(cov_density[count]==0){sy=0-mean_y;} ssx=ssx+(sx*sx); ssy=ssy+(sy*sy); ssp=ssp+(sy*sx); } lac_data_r=(ssp*ssp)/(ssx*ssy); }//end i //start montecarlo if (montecarlo){ //do the below 100 times for (int m=0;mlocal_max_x){local_max_x=mc_coordinates_x[i];} if (mc_coordinates_x[i]local_max_y){local_max_y=mc_coordinates_y[i];} if (mc_coordinates_y[i]local_max_z){local_max_z=mc_coordinates_z[i];} if (mc_coordinates_z[i]x)&(mc_coordinates_x[k]y)&(mc_coordinates_y[k]z)&(mc_coordinates_z[k]lacunarity_plot_MC_max[i]) {lacunarity_plot_MC_max[i]=average_density[i];} if (average_density[i]lacunarity_plot_MC_cov_max[i]) {lacunarity_plot_MC_cov_max[i]=cov_density[i];} if (cov_density[i]0){mean_y=mean_y+Math.log10(cov_density[count]);} } mean_x=mean_x/44; mean_y=mean_y/44; r_bin=1; for (int count =1; count<45; count++) { r_bin=r_bin+0.25; sx=Math.log10(r_bin*r_bin*r_bin)-mean_x; if(cov_density[count]>0){sy=Math.log10(cov_density[count])-mean_y;} if(cov_density[count]==0){sy=0-mean_y;} ssx=ssx+(sx*sx); ssy=ssy+(sy*sy); ssp=ssp+(sy*sx); } lac_data_mc=(ssp*ssp)/(ssx*ssy); if (m==0) { min_lac_data=lac_data_mc; max_lac_data=lac_data_mc; } if (m>0) { if (lac_data_mc>max_lac_data) {max_lac_data=lac_data_mc;} if (lac_data_mcx)&(r_coordinates_x[k]y)&(r_coordinates_y[k]z)&(r_coordinates_z[k]x)&(c_coordinates_x[k]y)&(c_coordinates_y[k]z)&(c_coordinates_z[k]local_max_x){local_max_x=coordinates_x[i];} if (coordinates_x[i]local_max_y){local_max_y=coordinates_y[i];} if (coordinates_y[i]local_max_z){local_max_z=coordinates_z[i];} if (coordinates_z[i]max_distance){max_distance=point_to_point_distance[j];} }//end max distance //set self referening distance to max point_to_point_distance[i]=max_distance; //first load all ranks with max distance for (int j=0;j<40;j++) { rank[i][j]=max_distance; } //now go through 10 cyles of finding minimum distance - for each find, replace distance with max_distance int point_index=0; for (int k=0;k<40;k++) { for (int j=0;jmax_distance){max_distance=point_to_point_distance[j];} }//end max distance //set self referening distance to max point_to_point_distance[i]=max_distance; //first load all ranks with max distance for (int j=0;j<40;j++) { rank[i][j]=max_distance; } //now go through 10 cyles of finding minimum distance - for each find, replace distance with max_distance int point_index=0; for (int k=0;k<40;k++) { for (int j=0;jrank_plot_MC_max[j]){rank_plot_MC_max[j]=rank_mc_average[j];} if (rank_mc_average[j]rank_plot_MC_cov_max[j]){rank_plot_MC_cov_max[j]=rank_mc_cov[j];} if (rank_mc_cov[j]max_distance){max_distance=point_to_point_distance[j];} }//end max distance //set self referening distance to max point_to_point_distance[i]=max_distance; //first load all ranks with max distance for (int j=0;j<40;j++) { rank[i][j]=max_distance; } //now go through 10 cyles of finding minimum distance - for each find, replace distance with max_distance int point_index=0; for (int k=0;k<40;k++) { for (int j=0;jmax_distance){max_distance=point_to_point_distance[j];} }//end max distance //set self referening distance to max point_to_point_distance[i]=max_distance; //first load all ranks with max distance for (int j=0;j<40;j++) { rank[i][j]=max_distance; } //now go through 10 cyles of finding minimum distance - for each find, replace distance with max_distance int point_index=0; for (int k=0;k<40;k++) { for (int j=0;jlocal_max_x){local_max_x=coordinates_x[i];} if (coordinates_x[i]local_max_y){local_max_y=coordinates_y[i];} if (coordinates_y[i]local_max_z){local_max_z=coordinates_z[i];} if (coordinates_z[i]-1)) {root[n]=root[shortest_pointer_reference];} if ((root[n]<0) & (root[shortest_pointer_reference]<0)) {root[n]=n; root[shortest_pointer_reference]=n;} if ((root[n]>-1) & (root[shortest_pointer_reference]<0)) {root[shortest_pointer_reference]=root[n];} if ((root[n]>-1) & (root[shortest_pointer_reference]>-1)) { int reference=root[shortest_pointer_reference]; root[shortest_pointer_reference]=root[n]; //merge trees - convert one to other for (int k=0;k0) {k1_mstVertex_1[number_of_points-1]=k1_mstVertex_2[number_of_points-1]; k1_mstVertex_2[number_of_points-1]=k1_mstVertex_3[number_of_points-1];k1_mstVertex_3[number_of_points-1]=-1;} //load concensus array for (int p=0;p0)) {maps_store[i][1]=maps_store[i][1]+1;} if ((maps_store[i][0]==k1_mstVertex_2[p]+1 ) & (k1_mstVertex_2[p]+1>0)) {maps_store[i][1]=maps_store[i][1]+1;} if ((maps_store[i][0]==k1_mstVertex_3[p]+1 ) & (k1_mstVertex_3[p]+1>0)) {maps_store[i][1]=maps_store[i][1]+1;} } //now check new points //step through each vertex and see if it is new - then assign spot //vertex_1 boolean new_point=true; for (int k=0;k<5;k++) { if ((maps_store[k][0]==k1_mstVertex_1[p]+1 )& (k1_mstVertex_1[p]+1>0)){new_point=false;} } if ((new_point)& (k1_mstVertex_1[p]+1>0)) { for (int i=0;i<5;i++) { if (maps_store[i][0]==-1){ maps_store[i][0]=k1_mstVertex_1[p]+1; maps_store[i][1]=1; i=5; } } } //vertex_1 new_point=true; for (int k=0;k<5;k++) { if ((maps_store[k][0]==k1_mstVertex_2[p]+1 ) & (k1_mstVertex_2[p]+1>0)){new_point=false;} } if ((new_point)& (k1_mstVertex_2[p]+1>0)) { for (int i=0;i<5;i++) { if (maps_store[i][0]==-1){ maps_store[i][0]=k1_mstVertex_2[p]+1; maps_store[i][1]=1; i=5; } } } //vertex_1 new_point=true; for (int k=0;k<5;k++) { if ((maps_store[k][0]==k1_mstVertex_3[p]+1 )& (k1_mstVertex_3[p]+1>0)) {new_point=false;} } if ((new_point)& (k1_mstVertex_3[p]+1>0)) { for (int i=0;i<5;i++) { if (maps_store[i][0]==-1){ maps_store[i][0]=k1_mstVertex_3[p]+1; maps_store[i][1]=1; i=5; } } } //now load up maps for (int i=0;i<5;i++) { maps[p][i][0]=maps_store[i][0]; maps[p][i][1]=maps_store[i][1]; } }//end p for loading concensus //draw in example of MC data if (loop<5) { for (int j=0;jtop_percentage)&(maps_store[i][1]>0)) {top_percentage=maps_store[i][1]; top_point=i;} } maps[p][k][0]=maps_store[top_point][0]; maps[p][k][1]=maps_store[top_point][1]; maps_store[top_point][1]=0; } } //now draw in concensus for (int j=0;j-1){ if ((maps[j][0][1]==100) & (maps[conn-1][back_connector][1]==100)) {dm.setValueAt(String.valueOf( conn), j,85);dm.setValueAt(String.valueOf( conn), j,93);} } // second most confident point // find back connector back_connector=-1; conn= maps[j][1][0]; for (int k=0;k<5;k++) { if (maps[conn-1][k][0]==j+1){back_connector=k;}} if (back_connector>-1){ if ((maps[j][1][1]==100) & (maps[conn-1][back_connector][1]==100)) {dm.setValueAt(String.valueOf( conn), j,86);dm.setValueAt(String.valueOf( conn), j,94);} } //>50% section // first most confident point // find back connector back_connector=-1; conn= maps[j][0][0]; for (int k=0;k<5;k++) { if (maps[conn-1][k][0]==j+1){back_connector=k;}} if (back_connector>-1){ if ((maps[j][0][1]>50) & (maps[conn-1][back_connector][1]>50)&(maps[j][0][1]<100) & (maps[conn-1][back_connector][1]<100)) {dm.setValueAt(String.valueOf( conn), j,87);dm.setValueAt(String.valueOf( conn), j,95);} } // first most confident point // find back connector back_connector=-1; conn= maps[j][1][0]; for (int k=0;k<5;k++) { if (maps[conn-1][k][0]==j+1){back_connector=k;}} if (back_connector>-1){ if ((maps[j][1][1]>50) & (maps[conn-1][back_connector][1]>50)&(maps[j][1][1]<100) & (maps[conn-1][back_connector][1]<100)) {dm.setValueAt(String.valueOf( conn), j,88);} } // first most confident point // find back connector back_connector=-1; conn= maps[j][2][0]; for (int k=0;k<5;k++) { if (maps[conn-1][k][0]==j+1){back_connector=k;}} if (back_connector>-1){ if ((maps[j][2][1]>50) & (maps[conn-1][back_connector][1]>50)&(maps[j][2][1]<100) & (maps[conn-1][back_connector][1]<100)) {dm.setValueAt(String.valueOf( conn), j,89);} } // first most confident point // find back connector back_connector=-1; conn= maps[j][3][0]; for (int k=0;k<5;k++) { if (maps[conn-1][k][0]==j+1){back_connector=k;}} if (back_connector>-1){ if ((maps[j][3][1]>50) & (maps[conn-1][back_connector][1]>50)&(maps[j][3][1]<100) & (maps[conn-1][back_connector][1]<100)) {dm.setValueAt(String.valueOf( conn), j,90);} } // first most confident point // find back connector back_connector=-1; conn= maps[j][4][0]; for (int k=0;k<5;k++) { if (maps[conn-1][k][0]==j+1){back_connector=k;}} if (back_connector>-1){ if ((maps[j][4][1]>50) & (maps[conn-1][back_connector][1]>50)&(maps[j][4][1]<100) & (maps[conn-1][back_connector][1]<100)) {dm.setValueAt(String.valueOf( conn), j,91);} } }//j loop } //end mstMeasures method static void pajMeasures(PAJ dt, TableModel dm, String[][] data) { //get data and determine number if points for (int i=0;i<10000;i++) { data[i][0]=dm.getValueAt(i, 0).toString(); //x data[i][1]=dm.getValueAt(i, 1).toString();//y data[i][2]=dm.getValueAt(i, 2).toString();//z if (data[i][0]=="") { number_of_points=i; i=10000; } } if (number_of_points<1){ dm.setValueAt("Data format error", 9,4);} if (data[0][2]=="") { data_3D=false; } else { data_3D=true; } try { if (number_of_points>0){ min_x = Double.valueOf(data[1][0].trim()).doubleValue(); max_x = Double.valueOf(data[1][0].trim()).doubleValue(); min_y = Double.valueOf(data[1][1].trim()).doubleValue(); max_y = Double.valueOf(data[1][1].trim()).doubleValue(); if (data_3D) { min_z = Double.valueOf(data[1][2].trim()).doubleValue(); max_z = Double.valueOf(data[1][2].trim()).doubleValue(); } } } catch(Exception ex) { dm.setValueAt("Data format error", 9,4); number_of_points=0; // System.out.println("Data format error"); // System.exit(2); } for (int i=0;imax_x){max_x=x;} if (ymax_y){max_y=y;} if (zmax_z){max_z=z;} } double area = (max_x-min_x)*(max_y-min_y); double volume = (max_x-min_x)*(max_y-min_y)*(max_z-min_z); double density=number_of_points/volume; scale_factor=density/0.02; //now change scale to multiplier for each side double power=1; power=power/3; scale_factor=Math.pow(scale_factor,power); //determine scale and scale coordinates to be 20/1000 //scale_factor=1;//*****REMOVE THIS**** if (data_3D& (number_of_points>0)) { for (int i=0;i0)) { //2d data needed here } dm.setValueAt(String.valueOf(min_x), 0,4); dm.setValueAt(String.valueOf(max_x), 1,4); dm.setValueAt(String.valueOf(min_y), 2,4); dm.setValueAt(String.valueOf(max_y), 3,4); dm.setValueAt(String.valueOf(min_z), 4,4); dm.setValueAt(String.valueOf(max_z), 5,4); dm.setValueAt(String.valueOf(area), 6,4); dm.setValueAt(String.valueOf(volume), 7,4); dm.setValueAt(String.valueOf(number_of_points), 8,4); if (number_of_points>0) {dm.setValueAt("2D data", 9,4);} if (data_3D& (number_of_points>0)) { dm.setValueAt("3D data", 9,4); } double scaled_density=number_of_points/((max_x-min_x)*scale_factor*(max_y-min_y)*scale_factor*(max_z-min_z)*scale_factor ); dm.setValueAt(String.valueOf(scale_factor), 10,4); dm.setValueAt(String.valueOf(density), 11,4); } static void initPAJ() { //frame title final JFrame fr = new JFrame("PAJ version0"); final PAJ dt = new PAJ(); final String[][] data=new String[10000][100]; data[9999][99]=new String(""); for (int i=0;i<10000;i++) { data[i][0]=""; //x data[i][1]="";//y data[i][2]="";//z } final TableModel dm = new TableModel(); dt.setModel(dm); //dm.setDataVector(data); dm.setValueAt("Min X",0,3); dm.setValueAt("1",0,0); dm.setValueAt("Max X",1,3); dm.setValueAt("Min Y",2,3); dm.setValueAt("Max Y",3,3); dm.setValueAt("Min Z",4,3); dm.setValueAt("Max Z",5,3); dm.setValueAt("Area",6,3); dm.setValueAt("Volume",7,3); dm.setValueAt("Number",8,3); dm.setValueAt("3D data",9,3); dm.setValueAt("scale factor",10,3); dm.setValueAt("density",11,3); dm.setValueAt("Vororoni r^2 data",12,3); dm.setValueAt("Vororoni r^2 MC-min",13,3); dm.setValueAt("Vororoni r^2 MC-max",14,3); dm.setValueAt("Lacunarity r^2 data",15,3); dm.setValueAt("Lacunarity r^2 MC-min",16,3); dm.setValueAt("Lacunarity r^2 MC-max",17,3); for (int i=0;i<10000;i++) { dm.setValueAt((data[i][0]),i,0); dm.setValueAt((data[i][1]),i,1); dm.setValueAt((data[i][2]),i,2); } fr.setLayout(new BorderLayout()); fr.getContentPane().add(new JScrollPane(dt),BorderLayout.WEST); JMenuBar mb = new JMenuBar(); JButton gwBranchButton=new JButton("GW Branched Data"); JButton regularButton=new JButton("Regular Data"); JButton fractalButton=new JButton("Fractal Data"); JButton randomButton=new JButton("Random Data"); JButton measuresButton=new JButton("Load Data"); JButton clearButton=new JButton("Clear Data"); JButton rankButton=new JButton("Rank"); JButton densityButton=new JButton("Density-map"); JButton lacunarityButton=new JButton("Lacunarity"); JButton voronoiButton=new JButton("Voronoi"); JButton mstButton=new JButton("MST"); JButton montecarloButton=new JButton("Monte Carlo"); JButton allButton=new JButton("Run all"); JPanel buttonPanel = new JPanel(); buttonPanel.setPreferredSize(new Dimension(50, 200)); fr.getContentPane().add(buttonPanel,BorderLayout.SOUTH); buttonPanel.setLayout(new FlowLayout()); buttonPanel.add(clearButton,BorderLayout.NORTH); buttonPanel.add(randomButton,BorderLayout.SOUTH); buttonPanel.add(regularButton,BorderLayout.SOUTH); buttonPanel.add(fractalButton,BorderLayout.SOUTH); buttonPanel.add(gwBranchButton,BorderLayout.SOUTH); buttonPanel.add(measuresButton,BorderLayout.NORTH); buttonPanel.add(rankButton,BorderLayout.SOUTH); buttonPanel.add(densityButton,BorderLayout.NORTH); buttonPanel.add(lacunarityButton,BorderLayout.NORTH); buttonPanel.add(voronoiButton,BorderLayout.NORTH); //buttonPanel.add(mstButton,BorderLayout.NORTH); buttonPanel.add(allButton,BorderLayout.NORTH); buttonPanel.add(montecarloButton,BorderLayout.NORTH); JGraphCanvas graphPanel = new JGraphCanvas(); graphPanel.setPreferredSize(new Dimension(500, 900)); graphPanel.setBackground(Color.white); JScrollPane scrollPane = new JScrollPane(graphPanel); fr.getContentPane().add(scrollPane,BorderLayout.CENTER); // fr.setDefaultLookAndFeelDecorated(true); randomButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dt.generateModelData(dt, dm, data); pajMeasures(dt, dm, data); } }); regularButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dt.generateRegularData(dt, dm, data); pajMeasures(dt, dm, data); } }); gwBranchButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dt.clearData(dt, dm, data); dt.generategwData(dt, dm, data); pajMeasures(dt, dm, data); } }); fractalButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dt.generatefractalData(dt, dm, data); pajMeasures(dt, dm, data); } }); rankButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pajMeasures(dt, dm, data); dt.rankMeasures(dt, dm, data); } }); measuresButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pajMeasures(dt, dm, data); } }); clearButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dt.clearData(dt, dm, data); } }); densityButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pajMeasures(dt, dm, data); dt.densityMeasures(dt, dm, data); } }); lacunarityButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pajMeasures(dt, dm, data); dt.lacunarityMeasures(dt, dm, data); } }); voronoiButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pajMeasures(dt, dm, data); dt.voronoiMeasures(dt, dm, data); } }); mstButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pajMeasures(dt, dm, data); dt.mstMeasures(dt, dm, data); } }); montecarloButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dt.montecarlo=true; } }); allButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pajMeasures(dt, dm, data); dt.rankMeasures(dt, dm, data); dt.densityMeasures(dt, dm, data); dt.lacunarityMeasures(dt, dm, data); dt.voronoiMeasures(dt, dm, data); } }); //dt.generateModelData(dt, dm, data); dt.pajMeasures(dt, dm, data); //Following lines make the JTable sensitive to drag & drop and clip board operations new TableDropManager(dt); ClipBoardTransfer cbt = new ClipBoardTransfer(dt); mb.add(cbt.getEditMenu()); fr.setJMenuBar(mb); fr.pack(); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.setVisible(true); } } class TableDropManager extends DropTargetAdapter { JTable tab = null; public TableDropManager(JTable tab) { this.tab = tab; tab.setDragEnabled(true); tab.setDropTarget(new DropTarget(tab, DnDConstants.ACTION_COPY, this, true)); tab.getDropTarget().setActive(true); } public void drop(DropTargetDropEvent de) { de.acceptDrop(DnDConstants.ACTION_COPY); Transferable trans = de.getTransferable(); Point p = de.getLocation(); int row = tab.rowAtPoint(p), col = tab.columnAtPoint(p); try { String str = (String)trans.getTransferData(DataFlavor.stringFlavor); ValueLoader.loadValuesIntoTable(tab, str, row, col); tab.repaint(); } catch(Exception ex) { ex.printStackTrace(); } de.dropComplete(true); } } class TableModel extends AbstractTableModel { private String[] columnNames = {"X","Y","Z","Measures","","Rank:order","Rank:Average","Rank:Min","Rank:Max","Rank:cov","Rank:Min","Rank:Max","Density:order","Density:Average","Density:Min","Density:Max","Density:cov","Density:Min","Density:Max","Lacunarity:order","Lacunarity:Average","Lacunarity:Min","Lacunarity:Max","Lacunarity:cov","Lacunarity:Min","Lacunarity:Max","Point Voronoi Volume","Voronoi Scale","Voronoi Dist","Voronoi Min","Voronoi Max","MC x", "MC y", "MC z", "Rank-regular","Rank-regular","Rank-cluster","Rank-cov-regular","Rank-cov-cluster","Density-regular","Density-cluster","Density-cov-regular","Density-cov-cluster","Lacunarity-regular","Lacunarity-cluster","Lacunarity-cov-regular","Lacunarity-cov-cluster","voronoi-regular","voronoi-cluster","point","MST 1-1","MST 1-2","MST 1-3","point","MST 2-1","MST 2-2","MST 2-3","point","MST 3-1","MST 3-2","MST 3-3","point","MST 4-1","MST 4-2","MST 4-3","point","MST 5-1","MST 5-2","MST 5-3","point","MST con-1","MST con-2","MST con-3","point","con-1","freq-1","con-1","freq-1","con-1","freq-1","con-1","freq-1","con-1","freq-1","point","100%","100%","50%","50%","50%","50%","50%","point","final-1","final-2","final-3","final-4"}; private Object[][] data=new Object[10000][100]; public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { return data[row][col]; } /* * JTable uses this method to determine the default renderer/ * editor for each cell. If we didn't implement this method, * then the last column would contain text ("true"/"false"), * rather than a check box. */ /* public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); }*/ /* * Don't need to implement this method unless your table's * editable. */ /* public boolean isCellEditable(int row, int col) { //Note that the data/cell address is constant, //no matter where the cell appears onscreen. if (col < 2) { return false; } else { return true; } } */ public boolean isCellEditable(int row, int col) { return true; } /* * Don't need to implement this method unless your table's * data can change. */ public void setValueAt(Object value, int row, int col) { /* System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")");*/ data[row][col] = value; fireTableCellUpdated(row, col); /* System.out.println("New value of data:"); printDebugData();*/ } private void printDebugData() { } } class ClipBoardTransfer implements ActionListener, FlavorListener { JTable tab = null; Clipboard cb = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); JMenu edit = new JMenu("Edit"); JMenuItem paste = null; public ClipBoardTransfer(JTable tab) { this.tab = tab; cb.addFlavorListener(this); createEditMenu(); } private void createEditMenu() { JMenuItem mi[] = { new JMenuItem("Copy"), new JMenuItem("Cut"), (paste = new JMenuItem("Paste")), new JMenuItem("Select All"), new JMenuItem("Delete Selection") }; char m[] = {'O','U','P','A','D'}; int ke[] = { KeyEvent.VK_C, KeyEvent.VK_X, KeyEvent.VK_V, KeyEvent.VK_A, KeyEvent.VK_DELETE }; edit.setMnemonic('E'); for(int i = 0; i= rowCount) break; while(colData.hasMoreTokens()) { if(column >= colCount) break; tmp = colData.nextToken(); if(tmp.equals("\t")) tab.setValueAt("", row, column++); else { tab.setValueAt(tmp, row, column++); if(colData.hasMoreTokens()) colData.nextToken(); } } column = col; } } private static String removeGroupsOfSpace(String s) { StringBuffer sb = new StringBuffer(); char c; for(int i=0, n=s.length(); i