krysalis-jcharts/src/java/org/krysalis/jcharts/axisChart RegressionChart.java,1.2,1.3

"Nathaniel G. Auvil" <[email protected]> Wed, 27 Oct 2004 20:44:16 +0000
Newsgroups gmane.comp.krysalis.jcharts.cvs
Message-ID <[email protected]>
Update of /cvsroot/jcharts/krysalis-jcharts/src/java/org/krysalis/jcharts/axisChart
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10592/src/java/org/krysalis/jcharts/axisChart

Modified Files:
	RegressionChart.java 
Log Message:
Changed Vector to ArrayList for speed improvement. Still does not work correctly though.

Index: RegressionChart.java
===================================================================
RCS file: /cvsroot/jcharts/krysalis-jcharts/src/java/org/krysalis/jcharts/axisChart/RegressionChart.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** RegressionChart.java	13 Aug 2004 01:57:05 -0000	1.2
--- RegressionChart.java	27 Oct 2004 20:44:13 -0000	1.3
***************
*** 38,47 ****
  import java.awt.*;
  import java.awt.geom.*;
! import java.util.Vector;
! import java.util.Enumeration;
  
  import org.krysalis.jcharts.axisChart.axis.YAxis;
  import org.krysalis.jcharts.chartData.interfaces.IAxisChartDataSet;
- import org.krysalis.jcharts.chartData.interfaces.IDataSeries;
  import org.krysalis.jcharts.imageMap.CircleMapArea;
  import org.krysalis.jcharts.properties.LineChartProperties;
--- 38,45 ----
  import java.awt.*;
  import java.awt.geom.*;
! import java.util.ArrayList;
  
  import org.krysalis.jcharts.axisChart.axis.YAxis;
  import org.krysalis.jcharts.chartData.interfaces.IAxisChartDataSet;
  import org.krysalis.jcharts.imageMap.CircleMapArea;
  import org.krysalis.jcharts.properties.LineChartProperties;
***************
*** 66,77 ****
  	double Sxx, Sxy, Syy;
  	double a, b; //regression coefficients
! 	Vector v = new Vector(); //vector of points
! 	Vector residuals = new Vector(); //vector of residuals
  
  
- 	public RegressionChart()
- 	{
- 	};
- 
  
  	private double figureY( YAxis yAxis, double num )
--- 64,71 ----
  	double Sxx, Sxy, Syy;
  	double a, b; //regression coefficients
! 	ArrayList v = new ArrayList(); //vector of points
! 	ArrayList residuals = new ArrayList(); //vector of residuals
  
  
  
  	private double figureY( YAxis yAxis, double num )
***************
*** 95,102 ****
  		lineChartProperties.validate( iAxisChartDataSet );
  
! 		//DataAxisProperties dataAxisProperties= (DataAxisProperties)
! 		// axisChart.getAxisProperties().getYAxisProperties();
! 		IDataSeries iDataSeries = (IDataSeries) axisChart.getIAxisDataSeries();
! 
  		//---cache the computed values
  		float[][] yAxisCoordinates = new float[iAxisChartDataSet.getNumberOfDataSets()][iAxisChartDataSet.getNumberOfDataItems()];
--- 89,93 ----
  		lineChartProperties.validate( iAxisChartDataSet );
  
! 		
  		//---cache the computed values
  		float[][] yAxisCoordinates = new float[iAxisChartDataSet.getNumberOfDataSets()][iAxisChartDataSet.getNumberOfDataItems()];
***************
*** 113,121 ****
  				if( iAxisChartDataSet.getValue( i, j ) != Double.NaN )
  				{
! 					yAxisCoordinates[i][j] = axisChart.getYAxis().computeAxisCoordinate(	axisChart.getYAxis().getOrigin(),
! 																																								iAxisChartDataSet.getValue( i, j ),
! 																																								axisChart	.getYAxis()
! 																																													.getScaleCalculator()
! 																																													.getMinValue() );
  
  					addLoc( new Loc( j, iAxisChartDataSet.getValue( i, j ) ) );
--- 104,110 ----
  				if( iAxisChartDataSet.getValue( i, j ) != Double.NaN )
  				{
! 					yAxisCoordinates[i][j] = axisChart.getYAxis().computeAxisCoordinate( axisChart.getYAxis().getOrigin(),
! 																						 iAxisChartDataSet.getValue( i, j ), 
! 																						 axisChart.getYAxis().getScaleCalculator().getMinValue() );
  
  					addLoc( new Loc( j, iAxisChartDataSet.getValue( i, j ) ) );
***************
*** 135,142 ****
  
  						axisChart.getImageMap().addImageMapArea( new CircleMapArea( xMapCoordinate,
! 																																				yAxisCoordinates[i][j],
! 																																				iAxisChartDataSet.getValue( i, j ),
! 																																				label,
! 																																				iAxisChartDataSet.getLegendLabel( i ) ) );
  					}
  				}
--- 124,131 ----
  
  						axisChart.getImageMap().addImageMapArea( new CircleMapArea( xMapCoordinate,
! 																yAxisCoordinates[i][j],
! 																iAxisChartDataSet.getValue( i, j ),
! 																label,
! 																iAxisChartDataSet.getLegendLabel( i ) ) );
  					}
  				}
***************
*** 150,156 ****
  		}
  
! 		AffineTransform originalTransform = null;
! 		double[] cornerXOffset = null;
! 		double[] cornerYOffset = null;
  
  		//---check if there are any points to display
--- 139,145 ----
  		}
  
! //		AffineTransform originalTransform = null;
! //		double[] cornerXOffset = null;
! //		double[] cornerYOffset = null;
  
  		//---check if there are any points to display
***************
*** 158,281 ****
  		{
  			//---when centering the shapes on the points, need x and y offset to do this
! 			cornerXOffset = new double[iAxisChartDataSet.getNumberOfDataSets()];
! 			cornerYOffset = new double[iAxisChartDataSet.getNumberOfDataSets()];
  
  			//---get the original transform so can reset it.
! 			originalTransform = g2d.getTransform();
  
! 			Rectangle2D rectangle;
  
  			//LOOP
- 			//---pre-compute the dimensions of each Shape so do not do it in loop.
  			for( int i = 0; i < iAxisChartDataSet.getNumberOfDataSets(); i++ )
  			{
! 				if( lineChartProperties.getShapes()[i] != null )
  				{
! 					rectangle = lineChartProperties.getShapes()[i].getBounds2D();
! 					cornerXOffset[i] = rectangle.getWidth() / 2;
! 					cornerYOffset[i] = rectangle.getHeight() / 2;
  
! 					Vector v = regress();
! 					// y = yoffset + slope(x)
! 					double yoffset, slope; // round to 5 places
! 					yoffset = (Math.round( 1.0E5 * a )) * 1.0E-5;
! 					slope = (Math.round( 1.0E5 * b )) * 1.0E-5;
  
  					g2d.setPaint( iAxisChartDataSet.getPaint( i ) );
  					//g2d.fill( lineChartProperties.getShapes()[ i ] );
  					g2d.setStroke( lineChartProperties.getLineStrokes()[i] );
! 					//Line2D.Double line = new Line2D.Double(start.x, start.y, end.x, end.y);
  					Line2D.Double line = new Line2D.Double( axisChart.getXAxis().getTickStart(),
  															figureY( axisChart.getYAxis(), (yoffset + slope * 0) ),
  															axisChart.getXAxis().getTickStart()
! 																	+ axisChart.getXAxis().getScalePixelWidth() * (v.size()-1),
  															figureY( axisChart.getYAxis(), (yoffset + slope * v.size()) ) );
  
  					//g2d.fill( line );
  					g2d.draw( line );
! 					g2d.setTransform( originalTransform );
  				}
  			}
  		}
- 
- 		//String form = "formula y = "+String.valueOf(yoffset)+" +
- 		// "+String.valueOf(slope)+"x";
- 		//g2d.drawString(form , 151, 156);
- 
- 		//---init for first segment
- 		/*
- 		 * Line2D.Float line=new Line2D.Float( axisChart.getXAxis().getTickStart(),
- 		 * yAxisCoordinates[ 0 ][ 0 ], axisChart.getXAxis().getTickStart(), yAxisCoordinates[
- 		 * 0 ][ 0 ] );
- 		 */
- 		//---make sure not plotting a chart with only one data point.
- 		/*
- 		 * if( yAxisCoordinates[ 0 ].length > 1 ) { line.y2= yAxisCoordinates[ 0 ][ 1 ]; }
- 		 */
- 
- 		//LOOP
- 		//---draw each line to the image
- 		/*
- 		 * for( int i=0; i < yAxisCoordinates.length; i++ ) {
- 		 * line.x1=axisChart.getXAxis().getTickStart(); line.y1=yAxisCoordinates[ i ][ 0 ];
- 		 * line.x2=line.x1;
- 		 * 
- 		 * //LOOP for( int j=1; j < yAxisCoordinates[ 0 ].length; j++ ) { //---if current
- 		 * point on line should be drawn if( !Float.isNaN( yAxisCoordinates[ i ][ j ] ) ) {
- 		 * //---if the previous point was not drawn, no line if( Float.isNaN(
- 		 * yAxisCoordinates[ i ][ j - 1 ] ) ) {
- 		 * line.x2+=axisChart.getXAxis().getScalePixelWidth(); line.x1=line.x2;
- 		 * line.y1=yAxisCoordinates[ i ][ j ]; line.y2=yAxisCoordinates[ i ][ j ];
- 		 * 
- 		 * continue; }
- 		 * 
- 		 * 
- 		 * line.x2+=axisChart.getXAxis().getScalePixelWidth(); line.y2=yAxisCoordinates[ i ][
- 		 * j ];
- 		 * 
- 		 * g2d.setPaint( iAxisChartDataSet.getPaint( i ) ); g2d.setStroke(
- 		 * lineChartProperties.getLineStrokes()[ i ] ); g2d.draw( line );
- 		 * 
- 		 * //---plot the Point if( lineChartProperties.getShapes()[ i ] != null ) {
- 		 * //---translate the Shape into position. g2d.translate( line.x1 - cornerXOffset[ i ],
- 		 * line.y1 - cornerYOffset[ i ] );
- 		 * 
- 		 * g2d.setPaint( iAxisChartDataSet.getPaint( i ) ); g2d.fill(
- 		 * lineChartProperties.getShapes()[ i ] );
- 		 * 
- 		 * //---translate back to the original position g2d.setTransform( originalTransform ); }
- 		 * 
- 		 * line.x1=line.x2; line.y1=line.y2; } else { if( ( !Float.isNaN( yAxisCoordinates[ i ][
- 		 * j - 1 ] ) ) && ( lineChartProperties.getShapes()[ i ] != null ) ) { //---translate
- 		 * the Shape into position. g2d.translate( line.x1 - cornerXOffset[ i ], line.y1 -
- 		 * cornerYOffset[ i ] );
- 		 * 
- 		 * g2d.setPaint( iAxisChartDataSet.getPaint( i ) ); g2d.fill(
- 		 * lineChartProperties.getShapes()[ i ] );
- 		 * 
- 		 * //---translate back to the original position g2d.setTransform( originalTransform ); }
- 		 * 
- 		 * line.x2+=axisChart.getXAxis().getScalePixelWidth(); line.x1=line.x2; } }
- 		 * 
- 		 * 
- 		 * //---put the last shape on the line if( ( !Float.isNaN( yAxisCoordinates[ i ][
- 		 * yAxisCoordinates[ i ].length - 1 ] ) ) && ( lineChartProperties.getShapes()[ i ] !=
- 		 * null ) ) { //---translate the Shape into position. g2d.translate( line.x2 -
- 		 * cornerXOffset[ i ], line.y2 - cornerYOffset[ i ] );
- 		 * 
- 		 * g2d.setPaint( iAxisChartDataSet.getPaint( i ) ); g2d.fill(
- 		 * lineChartProperties.getShapes()[ i ] );
- 		 * 
- 		 * //---translate back to the original position g2d.setTransform( originalTransform ); } }
- 		 */
  	}
  
  
! 	private Vector regress()
  	{
! 		Vector resid = new Vector();
  		Loc p, q;
  		double currentResidual;
! 		double n = (double) numberLocs;
  		Sxx = sumxx - sumx * sumx / n;
  		Syy = sumyy - sumy * sumy / n;
--- 147,198 ----
  		{
  			//---when centering the shapes on the points, need x and y offset to do this
! //			cornerXOffset = new double[iAxisChartDataSet.getNumberOfDataSets()];
! //			cornerYOffset = new double[iAxisChartDataSet.getNumberOfDataSets()];
  
  			//---get the original transform so can reset it.
! //			originalTransform = g2d.getTransform();
  
! //			Rectangle2D rectangle;
  
  			//LOOP
  			for( int i = 0; i < iAxisChartDataSet.getNumberOfDataSets(); i++ )
  			{
! //				if( lineChartProperties.getShapes()[i] != null )
  				{
! 	//				rectangle = lineChartProperties.getShapes()[i].getBounds2D();
! 		//			cornerXOffset[i] = rectangle.getWidth() / 2;
! 	//				cornerYOffset[i] = rectangle.getHeight() / 2;
  
! 					ArrayList v = regress();
! 
! 					// round to 5 places
! 					double yoffset = (Math.round( 1.0E5 * a )) * 1.0E-5;
! 					double slope = (Math.round( 1.0E5 * b )) * 1.0E-5;
  
  					g2d.setPaint( iAxisChartDataSet.getPaint( i ) );
  					//g2d.fill( lineChartProperties.getShapes()[ i ] );
  					g2d.setStroke( lineChartProperties.getLineStrokes()[i] );
! 
  					Line2D.Double line = new Line2D.Double( axisChart.getXAxis().getTickStart(),
  															figureY( axisChart.getYAxis(), (yoffset + slope * 0) ),
  															axisChart.getXAxis().getTickStart()
! 																	+ axisChart.getXAxis().getScalePixelWidth() * (v.size()-2),
  															figureY( axisChart.getYAxis(), (yoffset + slope * v.size()) ) );
  
  					//g2d.fill( line );
  					g2d.draw( line );
! //					g2d.setTransform( originalTransform );
  				}
  			}
  		}
  	}
  
  
! 	private ArrayList regress()
  	{
! 		ArrayList resid = new ArrayList();
  		Loc p, q;
  		double currentResidual;
! 		double n = numberLocs;
  		Sxx = sumxx - sumx * sumx / n;
  		Syy = sumyy - sumy * sumy / n;
***************
*** 283,296 ****
  		b = Sxy / Sxx;
  		a = (sumy - b * sumx) / n;
! 		for( Enumeration e = v.elements(); e.hasMoreElements(); )
  		{
! 			p = (Loc) e.nextElement();
  			currentResidual = p.y - (a + b * p.x);
  			q = new Loc( p.x, (int) currentResidual );
! 			resid.addElement( q );
! 
  		}
  		return resid;
- 
  	}
  
--- 200,213 ----
  		b = Sxy / Sxx;
  		a = (sumy - b * sumx) / n;
! 		
! 		for( int i=0; i < v.size(); i++ )
  		{
! 			p = (Loc) v.get( i );
  			currentResidual = p.y - (a + b * p.x);
  			q = new Loc( p.x, (int) currentResidual );
! 			resid.add( q );
  		}
+ 		
  		return resid;
  	}
  
***************
*** 307,311 ****
  	private void addLoc( Loc p )
  	{
! 		v.addElement( p );
  		numberLocs++;
  		sumx += p.x;
--- 224,228 ----
  	private void addLoc( Loc p )
  	{
! 		v.add( p );
  		numberLocs++;
  		sumx += p.x;



-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click