/* * ------------------------------------------------------------------------- * $Id: StarCluster.java,v 1.5 2006/01/30 18:54:16 estewart Exp $ * ------------------------------------------------------------------------- * Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved. * * This software is confidential information which is proprietary to * and a trade secret of Visual Numerics, Inc. Use, duplication or * disclosure is subject to the terms of an appropriate license * agreement. * * VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE * SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL * NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR * ITS DERIVATIVES. *-------------------------------------------------------------------------- */ /* * StarCluster.java * * Created on August 21, 2003, 2:53 PM */ package com.imsl.demo.cluster; import com.imsl.chart.*; import com.imsl.math.*; import com.imsl.stat.ClusterKMeans; import com.imsl.stat.Summary; import com.imsl.demo.gallery.Describe; public class StarCluster extends javax.swing.JPanel { private final double x[] = {-0.00225554,0.192812,0.549314,0.643484,1.10088,1.16815,1.19169,1.43384,1.45402,1.50447,1.50447,1.50447,1.56165,1.52465,1.47757,1.80716,1.84752,1.74662,1.74326,1.74662,2.39909,1.51792,1.86097,1.66591,1.61209,1.49438,1.51456,1.44393,1.4742,1.49438,1.50447,1.36994,1.19505,0.962991,1.15806,1.16815,1.37667,1.43721,1.39012,1.46411,1.51792,1.57174,1.5381,1.59864,1.58519,1.58519,1.60537,1.62218,1.62555,1.64909,1.23878,1.20514,1.14124,1.12779,1.06052,0.959628,0.952901,0.825099,0.626668,0.710749,0.808283,0.791466,0.804919,0.845278,0.892363,0.946175,1.01344,1.0807,1.14797,1.16478,1.14461,1.02017,1.00335,1.0168,0.986534,0.979807,0.902453,0.932722,0.919269,0.89909,0.912543,0.744381,0.613215,0.646848,0.57622,0.455144,0.428238,0.360973,0.310525,0.169269,0.206265,0.249987,0.286982,0.374426,0.377789,0.401332,0.475323,0.502229,0.663664,0.67039,0.0885516,-0.0863363,-0.0358878,-0.190596,0.159179,0.206265,0.266803,0.266803,0.293709,0.186085,0.0515561,0.03474,-0.0695201,-0.0493407,-0.150238,-0.274677,0.139,0.159179,0.14909,0.122184,0.142363,0.152453,0.155816,0.132274,0.0851884,0.065009,0.00447091,-0.123332,-0.237682,-0.241045,-0.207412,-0.18387,-0.177143,-0.0863363,-0.0358878,0.065009,0.125547,0.0717355,0.0414664,0.0582826,0.03474,0.0246503,0.0111974,-0.0123452,-0.008982,-0.00561877,-0.0257981,-0.0493407,-0.0325246,0.00783414,-0.008982,-0.00225554,-0.0728833,-0.0930627,-0.106516,-0.0930627,-0.109879,-0.146874,-0.133421,-0.123332,-0.126695,-0.140148,0.488776,0.482049,0.468596,0.482049,0.569493,0.56613,0.704022,0.704022,0.744381,0.656937,0.673753,0.704022,0.717475,0.700659,0.693933,0.710749,0.730928,0.754471,0.754471,1.13788,1.06389,1.09416,1.07734,1.0807,1.05716,1.04707,1.0168,0.999987,0.895727,0.858731,0.848641,0.781377,0.798193,0.825099,0.804919,0.811646,0.875547,0.912543,0.862094,0.882274,0.889,1.30604,1.3094,1.32286,1.35985,1.38003,1.39685,1.41703,1.43048,1.47084,1.43048,1.4103,1.43048,1.46748,1.50447,1.47757,1.66254,1.72981,1.71972,1.69954,1.69954,1.67936,1.68609,1.65245,1.66591,1.64573,1.62891,1.61546,1.59528,1.57174,1.55492,1.5381,1.57174,1.58855,1.59528,1.60873,1.58855,1.63227,1.61209,1.61882,1.59528,1.56501,1.56837,1.5381,1.52801,1.50111,1.50783,1.52801,1.48429,1.46075,1.45066,1.45402,1.46411,1.49102,1.49102,1.49774,1.51792,1.5112,1.53138,1.5381,1.56165,1.57174,1.55828,-0.119969,-0.156964,-0.146874,-0.177143,-0.187233,-0.204049,-0.220865,-0.254498,-0.241045,-0.247771,-0.247771,-0.227592,-0.220865,-0.204049,-0.234318,-0.210776,-0.19396,-0.170417,-0.140148,-0.167054,-0.197323,-0.200686,-0.18387}; private final double y[] = {12.0086,13.1438,14.2058,11.8621,12.9607,12.1184,11.0198,12.4114,11.5691,12.9973,12.9973,12.9973,13.2536,13.8396,13.5832,15.4508,14.279,13.51,12.9607,12.7776,12.1917,8.63956,-5.34918,-4.14073,-5.0196,-5.23932,-4.25059,-3.70129,-3.59143,-3.40833,-3.11537,-3.15199,-4.72664,-3.99425,-2.67594,-2.0534,-2.19988,-1.79706,-1.17453,-0.99143,-1.17453,-1.98016,-0.735092,-0.625233,-0.954811,-1.28439,-1.65059,-1.43087,-1.76044,-1.57735,-0.368895,-0.881571,-0.332275,-0.99143,-1.17453,-1.76044,-2.49284,-3.51819,-3.73791,-1.61397,-0.661853,-0.515374,-1.57735,-1.28439,-0.625233,-0.625233,-0.405515,0.400119,0.400119,0.729696,0.729696,0.729696,0.693077,0.876175,0.949415,0.546598,0.473358,0.32688,-0.0759374,-0.112557,3.73251,3.69589,3.40294,2.63392,2.34096,1.38885,2.63392,2.30434,2.34096,2.4142,2.19449,1.53533,1.05927,1.05927,-2.93228,-2.74918,-4.61678,-5.82523,-6.99706,-6.22805,-8.90129,-7.6196,-6.85059,-6.48439,-5.67875,-5.53228,-5.67875,-4.6534,-3.99425,-4.50692,-2.93228,-3.33509,-3.62805,-4.32382,-5.45904,-6.00833,1.68181,1.38885,1.16913,1.24237,0.766316,0.546598,0.25364,0.0339218,1.90153,1.42547,1.38885,0.21702,-5.53228,-5.16608,-5.3858,-5.05622,-4.76326,-2.56608,-1.57735,-1.02805,-0.735092,-0.185797,-0.112557,0.32688,0.436739,0.32688,0.839556,0.766316,0.473358,-0.222416,-0.332275,-0.442135,-0.918191,-1.02805,-0.771712,-0.808332,-0.844952,-0.588613,-0.698473,-1.10129,-1.06467,-1.57735,-1.46749,-1.94354,-2.09002,-2.19988,4.39167,3.91561,3.73251,3.62265,4.39167,4.57477,4.28181,4.57477,4.61139,5.0142,4.94096,5.0142,5.3804,5.30716,5.7466,5.67336,5.5635,5.70998,6.55223,7.4311,7.46772,6.99167,6.62547,6.88181,6.88181,6.40575,6.88181,6.47899,5.67336,5.45364,5.34378,5.81984,5.5635,5.7466,6.07618,5.89308,6.00294,6.47899,6.33251,6.18603,6.40575,8.38322,8.1635,8.12688,8.09026,8.3466,8.7128,8.7128,8.63956,8.74941,8.96913,9.48181,9.77477,9.33533,9.51843,9.66491,11.8987,12.0452,12.2283,12.448,12.6311,12.8508,13.0705,12.7776,12.5945,12.448,12.3381,12.448,12.3381,12.1184,11.9719,11.7522,11.5691,11.7522,11.9353,11.5325,11.3494,11.2762,11.1663,10.8367,10.9832,11.0565,11.2396,10.9832,11.2029,11.2029,10.9466,10.7269,10.7635,10.7635,10.3973,10.0677,10.1776,9.99448,10.3241,10.5072,10.141,10.4339,10.3973,10.141,10.1776,10.2508,10.3973,-3.22523,-3.92101,-3.62805,-3.48157,-3.48157,-4.14073,-4.21397,-4.28721,-4.14073,-4.03087,-3.59143,-3.51819,-3.07875,-3.18861,-2.82242,-2.82242,-2.89566,-3.00551,-2.93228,-2.71256,-2.52946,-2.30974,-2.2365}; private double xs[], ys[], xl[], yl[]; private double minX, minY, rangeX, rangeY; private java.awt.Color[] cArray; private AxisXY axis; private ClusterReport report; private Data wd, rg, bg, ms, msl, su; private final java.awt.Cursor defCursor = new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR); private final java.awt.Cursor waitCursor = new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR); private javax.swing.JFrame parentFrame; private JPanelChart jPanelChart; /** Creates new form StarCluster */ public StarCluster(javax.swing.JFrame parent) { this.parentFrame = parent; cArray = new java.awt.Color[8]; cArray[0] = java.awt.Color.BLUE; cArray[1] = java.awt.Color.GREEN; cArray[2] = java.awt.Color.RED; cArray[3] = java.awt.Color.CYAN; cArray[4] = java.awt.Color.MAGENTA; cArray[5] = java.awt.Color.YELLOW; cArray[6] = java.awt.Color.ORANGE; cArray[7] = java.awt.Color.GRAY; initComponents(); report = new ClusterReport(parentFrame, "ClusterKMeans Report", viewToggleButton); report.setText("No analysis performed"); computeScaledData(); plotData(); setPreferredSize(new java.awt.Dimension(parent.getSize().width, (int)(0.95*parent.getSize().height))); jPanelChart.setPreferredSize(new java.awt.Dimension(parent.getSize().width, (int)(0.75*parent.getSize().height))); } private void computeScaledData() { xs = new double[x.length]; ys = new double[y.length]; /* xl = new double[x.length]; yl = new double[y.length]; for (int i=0; iSummary summX = new Summary(); Summary summY = new Summary(); summX.update(x); summY.update(y); minX = summX.getMinimum(); minY = summY.getMinimum(); rangeX = summX.getMaximum() - minX; rangeY = summY.getMaximum() - minY; for (int i=0; i<x.length; i++) { xs[i] = (x[i]-minX)/rangeX; ys[i] = (y[i]-minY)/rangeY; } } private void runAnalysis() { double[][] data = new double[y.length][2]; for (int i=0; i<x.length; i++) { data[i][0] = xs[i]; data[i][1] = ys[i]; } int numClusters = numSlider.getValue(); double[][] cs = new double[numClusters][2]; com.imsl.stat.Random r = new com.imsl.stat.Random(); for (int i=0; i<numClusters; i++) { // have scaled axes to [0,1] so nextDouble is fine cs[i][0] = r.nextDouble(); cs[i][1] = r.nextDouble(); } try { ClusterKMeans kmean = new ClusterKMeans(data, cs); double[][] cm = kmean.compute(); double[] wss = kmean.getClusterSSQ(); int[] ic = kmean.getClusterMembership(); int[] nc = kmean.getClusterCounts(); // get cluster centers into plottable coordinates double[] cmx = new double[numClusters]; double[] cmy = new double[numClusters]; double[][] cmr = new double[numClusters][2]; for (int i=0; i<numClusters; i++) { //cmx[i] = JMath.exp(minX+rangeX*(cm[i][0])); //cmy[i] = JMath.exp(minY+rangeY*(cm[i][1])); cmx[i] = minX+rangeX*(cm[i][0]); cmy[i] = minY+rangeY*(cm[i][1]); cmr[i][0] = cmx[i]; cmr[i][1] = cmy[i]; } // create the report java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); java.io.PrintStream ps = new java.io.PrintStream(baos); ps.println("<h3><font color='blue'>Cluster Centers</font></h3>"); PrintMatrix pm = new PrintMatrix(ps); PrintMatrixFormat pmf = new PrintMatrixFormat(); java.text.NumberFormat nf = java.text.NumberFormat.getInstance(); nf.setMinimumFractionDigits(4); pmf.setNumberFormat(nf); pmf.setColumnLabels(new String[] {"x","y"}); pmf.setFirstRowNumber(1); pm.printHTML(pmf, cmr, numClusters, 2); ps.println("<h3><font color='blue'>Number of Observations</font></h3>"); for (int i=0; i<numClusters; i++) { reportValue(ps, "Cluster "+(i+1), nc[i]); } ps.println("<h3><font color='blue'>Sum of Squares (scaled, relative)</font></h3>"); for (int i=0; i<numClusters; i++) { reportValue(ps, "Cluster "+(i+1), wss[i]); } report.setText(baos.toString()); // now update the chart clearChart(); Data d = new Data(axis, x, y); d.setDataType(Data.DATA_TYPE_MARKER); d.setMarkerType(Data.MARKER_TYPE_HOLLOW_CIRCLE); d.setMarkerColor(java.awt.Color.DARK_GRAY); for (int i=0; i<numClusters; i++) { Data meanData = new Data(axis, new double[] {cmx[i]}, new double[] {cmy[i]}); meanData.setDataType(Data.DATA_TYPE_MARKER); meanData.setMarkerType(Data.MARKER_TYPE_FILLED_TRIANGLE); meanData.setMarkerSize(2.0); meanData.setMarkerColor(cArray[i]); meanData.setTitle("Center "+(i+1)); ClusterSet cset = new ClusterSet(data, ic, i+1, nc[i]); Data cData = new Data(axis, cset.x, cset.y); cData.setDataType(Data.DATA_TYPE_MARKER); cData.setMarkerType(Data.MARKER_TYPE_FILLED_CIRCLE); cData.setMarkerSize(0.7); cData.setMarkerColor(cArray[i]); } if (annotateToggleButton.isSelected()) { drawAnnotations(); } repaint(); } catch (Exception e) { // if it's a KMeans exception, just reseed and try again. if (e instanceof ClusterKMeans.NoConvergenceException || e instanceof ClusterKMeans.ClusterNoPointsException) { System.out.println(e.getMessage()); runAnalysis(); } else { javax.swing.JOptionPane.showMessageDialog(this, e.getMessage(), "Exception", javax.swing.JOptionPane.ERROR_MESSAGE); e.printStackTrace(); System.exit(1); } } } private void clearChart() { ChartNode[] children = axis.getChildren(); for (int i=0; i<children.length; i++) { if (children[i] instanceof Data) { children[i].remove(); } } } private void drawAnnotations() { double wdx[] = {0.6}; double wdy[] = {14}; wd = new Data(axis, wdx, wdy); wd.setTextColor(java.awt.Color.BLACK); wd.setLabelType(Data.LABEL_TYPE_TITLE); wd.setTitle("White Dwarfs"); double rgx[] = {1.9}; double rgy[] = {1}; rg = new Data(axis, rgx, rgy); rg.setTextColor(java.awt.Color.RED); rg.setLabelType(Data.LABEL_TYPE_TITLE); rg.setTitle("Red\nGiants"); double bgx[] = {-0.3}; double bgy[] = {-6.5}; bg = new Data(axis, bgx, bgy); bg.setTextColor(java.awt.Color.BLUE); bg.setLabelType(Data.LABEL_TYPE_TITLE); bg.setTitle("Blue\nGiants"); double msx[] = {0.2}; double msy[] = {3.5}; ms = new Data(axis, msx, msy); ms.setTextColor(java.awt.Color.GREEN); ms.setLabelType(Data.LABEL_TYPE_TITLE); ms.setTitle("Main\nSequence"); ms.getTitle().setAlignment(Data.TEXT_X_RIGHT); double mslx[] = {-0.4, 0.0, 0.4, 0.8, 1.2, 1.6}; double msly[] = {-5, 2.5, 4.75, 7.5, 9, 13.5}; final com.imsl.math.CsAkima cs = new com.imsl.math.CsAkima(mslx, msly); ChartFunction fcn = new ChartFunction() { public double f(double x) { return cs.value(x); } }; msl = new Data(axis, fcn, -0.4, 1.7); msl.setDataType(Data.DATA_TYPE_LINE); msl.setLineColor(java.awt.Color.GREEN); msl.setLineWidth(1.5); double sux[] = {0.6}; double suy[] = {4.7}; su = new Data(axis, sux, suy); su.setDataType(Data.DATA_TYPE_MARKER); su.setMarkerSize(1.5); su.setMarkerType(Data.MARKER_TYPE_FILLED_CIRCLE); su.setMarkerColor(java.awt.Color.YELLOW); su.setTextColor(java.awt.Color.ORANGE); su.setLabelType(Data.LABEL_TYPE_TITLE); su.setTitle("The Sun"); su.getTitle().setAlignment(Data.TEXT_X_RIGHT | Data.TEXT_Y_TOP); } private void clearAnnotations() { wd.remove(); rg.remove(); bg.remove(); ms.remove(); msl.remove(); su.remove(); } private void plotData() { jPanelChart.setChart(new Chart()); Chart c = jPanelChart.getChart(); //Legend legend = c.getLegend(); //legend.setPaint(true); //legend.setViewport(0.85,0.95,0.05,0.15); axis = new AxisXY(c); axis.getAxisX().setAutoscaleInput(AxisXY.AUTOSCALE_OFF); axis.getAxisY().setAutoscaleInput(AxisXY.AUTOSCALE_OFF); //axis.getAxisX().setWindow(30000.0, 3000.0); //axis.getAxisY().setWindow(10e-6, 10e6); axis.getAxisX().setWindow(-0.5, 2.5); axis.getAxisY().setWindow(20, -10); //axis.getAxisX().setTextFormat(new java.text.DecimalFormat("##,###")); //axis.getAxisY().setTextFormat(new java.text.DecimalFormat("00.##E0")); axis.getAxisX().setTextFormat(new java.text.DecimalFormat("##.#")); axis.getAxisY().setTextFormat(new java.text.DecimalFormat("##")); double yticks[] = {-10,-5,0,5,10,15,20}; axis.getAxisY().setTicks(yticks); double xticks[] = {-0.5,0,0.5,1.0,1.5,2.0,2.5}; axis.getAxisX().setTicks(xticks); //axis.getAxisX().setTransform(Data.TRANSFORM_LOG); //axis.getAxisY().setTransform(Data.TRANSFORM_LOG); axis.getAxisX().getAxisTitle().setTitle("B-V Color Index"); axis.getAxisY().getAxisTitle().setTitle("Absolute V Magnitude"); //axis.getAxisX().getAxisTitle().setTitle("Temperature, Degrees Kelvin"); //axis.getAxisY().getAxisTitle().setTitle("Luminosity, Sun = 1"); AxisXY axis2 = new AxisXY(c); axis2.getAxisX().setAutoscaleInput(AxisXY.AUTOSCALE_OFF); axis2.getAxisY().setAutoscaleInput(AxisXY.AUTOSCALE_OFF); axis2.getAxisX().setWindow(0.0, 1.0); axis2.getAxisY().setWindow(10e-6, 10e6); axis2.getAxisY().setTransform(Data.TRANSFORM_LOG); axis2.getAxisY().setTextFormat(new java.text.DecimalFormat("00.##E0")); axis2.setCross(1.0, 10e6); axis2.getAxisX().setType(Data.AXIS_X_TOP); axis2.getAxisY().setType(Data.AXIS_Y_RIGHT); axis2.getAxisX().setFirstTick(0.018); axis2.getAxisX().setTickInterval(0.162); String labelsx2[] = {"35,000","10,000","6,000","4,000","3,000"}; axis2.getAxisX().getAxisLabel().setLabels(labelsx2); axis2.getAxisX().getAxisTitle().setTitle("Effective Temperature, K"); axis2.getAxisY().getAxisTitle().setTitle("Luminosity, Sun = 1"); Data d = new Data(axis, x, y); d.setDataType(Data.DATA_TYPE_MARKER); d.setMarkerType(Data.MARKER_TYPE_HOLLOW_CIRCLE); d.setMarkerColor(java.awt.Color.BLACK); } private void reportValue(java.io.PrintStream ps, String label, double value) { java.text.MessageFormat mf = new java.text.MessageFormat(label+" = <b>{0}</b>"); Object args[] = {new Double(value)}; ps.print(mf.format(args)); ps.println("<br>"); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); numSlider = new javax.swing.JSlider(); jPanel3 = new javax.swing.JPanel(); runButton = new javax.swing.JButton(); viewToggleButton = new javax.swing.JToggleButton(); annotateToggleButton = new javax.swing.JToggleButton(); jPanelChart = new com.imsl.chart.JPanelChart(); jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.Y_AXIS)); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setText("Number of Clusters"); jPanel2.add(jLabel1); numSlider.setMajorTickSpacing(1); numSlider.setMaximum(8); numSlider.setMinimum(2); numSlider.setPaintLabels(true); numSlider.setPaintTicks(true); numSlider.setSnapToTicks(true); numSlider.setValue(4); jPanel2.add(numSlider); jPanel1.add(jPanel2); jPanel3.setLayout(new java.awt.GridLayout(3, 1)); runButton.setForeground(new java.awt.Color(0, 153, 0)); runButton.setText("Run Analysis"); runButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { runButtonActionPerformed(evt); } }); jPanel3.add(runButton); viewToggleButton.setText("View Report"); viewToggleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { viewToggleButtonActionPerformed(evt); } }); jPanel3.add(viewToggleButton); annotateToggleButton.setText("Annotate Graph"); annotateToggleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { annotateToggleButtonActionPerformed(evt); } }); jPanel3.add(annotateToggleButton); jPanel1.add(jPanel3); add(jPanel1, java.awt.BorderLayout.NORTH); add(jPanelChart); }//GEN-END:initComponents private void annotateToggleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_annotateToggleButtonActionPerformed if (annotateToggleButton.isSelected()) { drawAnnotations(); } else { clearAnnotations(); } repaint(); }//GEN-LAST:event_annotateToggleButtonActionPerformed private void viewToggleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewToggleButtonActionPerformed if (viewToggleButton.isSelected()) { java.awt.Dimension size = parentFrame.getSize(); java.awt.Point loc = parentFrame.getLocationOnScreen(); report.setLocation(loc.x+size.width,loc.y); report.show(); } else { report.setVisible(false); } }//GEN-LAST:event_viewToggleButtonActionPerformed private void runButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_runButtonActionPerformed setCursor(waitCursor); runAnalysis(); setCursor(defCursor); }//GEN-LAST:event_runButtonActionPerformed private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel3; private javax.swing.JSlider numSlider; private javax.swing.JToggleButton viewToggleButton; private javax.swing.JPanel jPanel2; private javax.swing.JButton runButton; private javax.swing.JToggleButton annotateToggleButton; private javax.swing.JPanel jPanel1; // End of variables declaration//GEN-END:variables class ClusterSet { double[] x,y; ClusterSet(double[][] data, int[] member, int select, int total) { x = new double[total]; y = new double[total]; int count = 0; for (int i=0; i<data.length; i++) { if (member[i] == select) { x[count] = minX+rangeX*(data[i][0]); y[count] = minY+rangeY*(data[i][1]); //x[count] = JMath.exp(minX+rangeX*(data[i][0])); //y[count] = JMath.exp(minY+rangeY*(data[i][1])); count ++; } } } } }