|
From: <nat...@us...> - 2003-08-07 21:55:29
|
Update of /cvsroot/jcharts/krysalis-jcharts/src/java/org/krysalis/jcharts/nonAxisChart
In directory sc8-pr-cvs1:/tmp/cvs-serv15651
Modified Files:
RadarChart.java
Log Message:
added license header
Index: RadarChart.java
===================================================================
RCS file: /cvsroot/jcharts/krysalis-jcharts/src/java/org/krysalis/jcharts/nonAxisChart/RadarChart.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** RadarChart.java 4 Aug 2003 09:25:49 -0000 1.1
--- RadarChart.java 7 Aug 2003 21:55:26 -0000 1.2
***************
*** 1,4 ****
--- 1,39 ----
+ /***********************************************************************************************
+ * Copyright 2002 (C) Nathaniel G. Auvil. All Rights Reserved.
+ *
+ * Redistribution and use of this software and associated documentation ("Software"), with or
+ * without modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain copyright statements and notices.
+ * Redistributions must also contain a copy of this document.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * 3. The name "jCharts" or "Nathaniel G. Auvil" must not be used to endorse or promote
+ * products derived from this Software without prior written permission of Nathaniel G.
+ * Auvil. For written permission, please contact nat...@us...
+ *
+ * 4. Products derived from this Software may not be called "jCharts" nor may "jCharts" appear
+ * in their names without prior written permission of Nathaniel G. Auvil. jCharts is a
+ * registered trademark of Nathaniel G. Auvil.
+ *
+ * 5. Due credit should be given to the jCharts Project (http://jcharts.sourceforge.net/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY Nathaniel G. Auvil AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * jCharts OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ ************************************************************************************************/
+
package org.krysalis.jcharts.nonAxisChart;
+
import java.awt.Color;
import java.awt.Graphics2D;
***************
*** 19,228 ****
import org.krysalis.jcharts.properties.util.ChartFont;
! /**
* Represents a radar chart a.k.a. spider chart
*
* @author Rami Hansenne
! * @todo : render legend, use scale processor classes,...
! */
public class RadarChart
! extends Chart {
! private IRadarChartDataSet iRadarChartDataSet;
! private RadarChartDataProcessor radarChartDataProcessor;
! private RadarChartProperties props;
! private double radius, step;
! private Point2D center;
! // scale max value and increment
! private double scaleMax, scaleIncrement;
! // default number of scale increments if no user defined increment
! private static final int DEFAULT_NR_OF_INCREMENTS = 10;
- /************************************************************************************************
- * Constructor
- *
- * @param iRadarChartDataSet
- * @param legendProperties
- * @param chartProperties general chart properties
- * @param pixelWidth
- * @param pixelHeight
- ************************************************************************************************/
- public RadarChart(IRadarChartDataSet iRadarChartDataSet,
- LegendProperties legendProperties,
- ChartProperties chartProperties,
- int pixelWidth,
- int pixelHeight) {
- super(legendProperties, chartProperties, pixelWidth, pixelHeight);
- this.iRadarChartDataSet = iRadarChartDataSet;
- props = (RadarChartProperties) iRadarChartDataSet.getChartTypeProperties();
- if (props == null) {
- props = new RadarChartProperties();
! }
! }
- /************************************************************************************************
- * Draws the chart
- *
- ************************************************************************************************/
- protected void renderChart() {
- Graphics2D g2d = getGraphics2D();
! // turn anti-aliasing on
! g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
! RenderingHints.VALUE_ANTIALIAS_ON);
! FontRenderContext fontRenderContext = super.getGraphics2D().
! getFontRenderContext();
- //---render the TITLE. If no title, this will return zero.
- float chartTitleHeight = super.renderChartTitle(this.iRadarChartDataSet.
- getChartTitle(), fontRenderContext);
! this.radarChartDataProcessor = new RadarChartDataProcessor( this.iRadarChartDataSet );
! this.radarChartDataProcessor.processData();
! // set scale max value
! if (Double.isNaN(props.getScaleMaxValue()))
! this.scaleMax = radarChartDataProcessor.getMaxValue();
! else scaleMax = props.getScaleMaxValue();
! // set scale increment
! if (Double.isNaN(props.getScaleIncrement()))
! this.scaleIncrement = scaleMax/DEFAULT_NR_OF_INCREMENTS;
! else scaleIncrement = props.getScaleIncrement();
! //@todo : adjust chart space in order to correctly render title & legend
! Rectangle chartSpace = new Rectangle(getImageWidth(), getImageHeight());
! center = new Point2D.Double(
! chartSpace.getWidth() / 2 - chartSpace.getX(),
! chartSpace.getHeight() / 2 - chartSpace.getY());
! radius = Math.min(chartSpace.getWidth(), chartSpace.getHeight());
! radius = (radius - (radius * 10) / 100) / 2;
! step = 2 * Math.PI / iRadarChartDataSet.getNumberOfDataItems();
! if (props.getShowGridLines()) {
! drawGridLines(g2d);
! }
! drawAxis(g2d);
! drawRadar(g2d);
! }
! private void drawRadar(
! Graphics2D g) {
! for (int dataset = 0; dataset < iRadarChartDataSet.getNumberOfDataSets();
! dataset++) {
! double currentValue;
! double previousValue = scaleValue(iRadarChartDataSet.getValue(dataset,
! iRadarChartDataSet.getNumberOfDataItems() -
! 1));
- Paint paint = iRadarChartDataSet.getPaint(dataset);
! for (int di = 0; di < iRadarChartDataSet.getNumberOfDataItems();di++) {
! currentValue = previousValue;
! previousValue = scaleValue(iRadarChartDataSet.getValue(dataset, di));
! g.setPaint(paint);
! int c0 = (int) Math.round(center.getX());
! int c1 = (int) Math.round(center.getY());
! int x0 = getX(di+1,previousValue);
! int y0 = getY(di+1,previousValue);
! int x1 = getX(di,currentValue);
! int y1 = getY(di,currentValue);
! if (props.getFillRadar()) {
! Polygon p = new Polygon();
! p.addPoint(c0, c1);
! p.addPoint(x0, y0);
! p.addPoint(x1, y1);
! // make color translucent
! if (paint instanceof Color) {
! Color color = (Color) paint;
! g.setPaint(new Color(color.getRed(), color.getGreen(),
! color.getBlue(), 100));
! }
! g.fillPolygon(p);
! g.setPaint(paint);
! }
! g.drawLine(x0, y0, x1, y1);
! }
! }
! }
! private void drawGridLines(Graphics2D g) {
! g.setColor(Color.lightGray);
! for (int di = 0; di < iRadarChartDataSet.getNumberOfDataItems();
! di++) {
! for (double i = scaleIncrement; i <= scaleMax; i+=scaleIncrement) {
! double pos = scaleValue(i);
! g.drawLine(
! getX(di+1,pos),
! getY(di+1,pos),
! getX(di,pos),
! getY(di,pos));
! }
! }
! }
! private void drawAxis(Graphics2D g) {
! g.setColor(Color.darkGray);
! for (int index = 0; index < iRadarChartDataSet.getNumberOfDataItems();
! index++) {
! String label = iRadarChartDataSet.getAxisLabel(index);
! g.drawLine(
! (int) center.getX(),
! (int) center.getY(),
! getX(index, 1),
! getY(index, 1));
! Rectangle2D bounds = g.getFontMetrics().getStringBounds(label, g);
! // draw axis label
! ChartFont cfont = props.getTitleChartFont();
! if (cfont != null) {
! g.setFont(cfont.getFont());
- }
- g.drawString(
- label,
- (int) (getX(index + 1, 1) - bounds.getWidth() / 2),
- getY(index+1, 1));
- }
! // draw gridline labels
! g.setColor(Color.darkGray);
! g.setFont(props.getAxisLabelChartFont().DEFAULT_AXIS_VALUE.getFont());
! int selectedLine = (int) iRadarChartDataSet.getNumberOfDataItems()/2;
! for (double i = scaleIncrement; i <= scaleMax; i+=scaleIncrement) {
! double pos = scaleValue(i);
! Rectangle2D bounds = g.getFont().getStringBounds("1",
! g.getFontRenderContext());
! g.drawString(props.getGridLabelFormat().format(i),
! getX(selectedLine,pos),
! (int) Math.round(getY(selectedLine,pos) + bounds.getHeight()));
! }
- }
! private int getX(int dataset, double factor) {
! return (int) Math.round(center.getX() + radius * factor * Math.sin(step * dataset));
! }
! private int getY(int dataset, double factor) {
! return (int) Math.round(center.getY() + radius * factor * Math.cos(step * dataset));
! }
! private double scaleValue(double value) {
! if (value>scaleMax)
! value=scaleMax;
! if (scaleMax==0)
! return 0;
! return value/scaleMax;
! }
}
--- 54,297 ----
import org.krysalis.jcharts.properties.util.ChartFont;
!
! /*************************************************************************************
* Represents a radar chart a.k.a. spider chart
*
* @author Rami Hansenne
! * @version $Id$
! * @since 1.0.0
! ************************************************************************************/
!
public class RadarChart
! extends Chart
! {
! private IRadarChartDataSet iRadarChartDataSet;
! private RadarChartDataProcessor radarChartDataProcessor;
! private RadarChartProperties props;
! private double radius, step;
! private Point2D center;
! // scale max value and increment
! private double scaleMax, scaleIncrement;
! // default number of scale increments if no user defined increment
! private static final int DEFAULT_NR_OF_INCREMENTS = 10;
! /************************************************************************************************
! * Constructor
! *
! * @param iRadarChartDataSet
! * @param legendProperties
! * @param chartProperties general chart properties
! * @param pixelWidth
! * @param pixelHeight
! ************************************************************************************************/
! public RadarChart( IRadarChartDataSet iRadarChartDataSet,
! LegendProperties legendProperties,
! ChartProperties chartProperties,
! int pixelWidth,
! int pixelHeight )
! {
! super( legendProperties, chartProperties, pixelWidth, pixelHeight );
! this.iRadarChartDataSet = iRadarChartDataSet;
! props = (RadarChartProperties) iRadarChartDataSet.getChartTypeProperties();
! if( props == null )
! {
! props = new RadarChartProperties();
! }
! }
! /************************************************************************************************
! * Draws the chart
! *
! ************************************************************************************************/
! protected void renderChart()
! {
! Graphics2D g2d = getGraphics2D();
! // turn anti-aliasing on
! g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
! //todo : render legend, use scale processor classes,...
! FontRenderContext fontRenderContext = super.getGraphics2D().
! getFontRenderContext();
! //---render the TITLE. If no title, this will return zero.
! float chartTitleHeight = super.renderChartTitle( this.iRadarChartDataSet.
! getChartTitle(), fontRenderContext );
! this.radarChartDataProcessor = new RadarChartDataProcessor( this.iRadarChartDataSet );
! this.radarChartDataProcessor.processData();
! // set scale max value
! if( Double.isNaN( props.getScaleMaxValue() ) )
! this.scaleMax = radarChartDataProcessor.getMaxValue();
! else
! scaleMax = props.getScaleMaxValue();
! // set scale increment
! if( Double.isNaN( props.getScaleIncrement() ) )
! this.scaleIncrement = scaleMax / DEFAULT_NR_OF_INCREMENTS;
! else
! scaleIncrement = props.getScaleIncrement();
! //todo : adjust chart space in order to correctly render title & legend
! Rectangle chartSpace = new Rectangle( getImageWidth(), getImageHeight() );
! center = new Point2D.Double(
! chartSpace.getWidth() / 2 - chartSpace.getX(),
! chartSpace.getHeight() / 2 - chartSpace.getY() );
! radius = Math.min( chartSpace.getWidth(), chartSpace.getHeight() );
! radius = ( radius - ( radius * 10 ) / 100 ) / 2;
! step = 2 * Math.PI / iRadarChartDataSet.getNumberOfDataItems();
! if( props.getShowGridLines() )
! {
! drawGridLines( g2d );
! }
! drawAxis( g2d );
! drawRadar( g2d );
! }
! private void drawRadar(
! Graphics2D g )
! {
! for( int dataset = 0; dataset < iRadarChartDataSet.getNumberOfDataSets();
! dataset++ )
! {
! double currentValue;
! double previousValue = scaleValue( iRadarChartDataSet.getValue( dataset,
! iRadarChartDataSet.getNumberOfDataItems() -
! 1 ) );
! Paint paint = iRadarChartDataSet.getPaint( dataset );
! for( int di = 0; di < iRadarChartDataSet.getNumberOfDataItems(); di++ )
! {
! currentValue = previousValue;
! previousValue = scaleValue( iRadarChartDataSet.getValue( dataset, di ) );
! g.setPaint( paint );
! int c0 = (int) Math.round( center.getX() );
! int c1 = (int) Math.round( center.getY() );
! int x0 = getX( di + 1, previousValue );
! int y0 = getY( di + 1, previousValue );
! int x1 = getX( di, currentValue );
! int y1 = getY( di, currentValue );
! if( props.getFillRadar() )
! {
! Polygon p = new Polygon();
! p.addPoint( c0, c1 );
! p.addPoint( x0, y0 );
! p.addPoint( x1, y1 );
! // make color translucent
! if( paint instanceof Color )
! {
! Color color = (Color) paint;
! g.setPaint( new Color( color.getRed(), color.getGreen(),
! color.getBlue(), 100 ) );
! }
! g.fillPolygon( p );
! g.setPaint( paint );
! }
! g.drawLine( x0, y0, x1, y1 );
! }
! }
! }
! private void drawGridLines( Graphics2D g )
! {
! g.setColor( Color.lightGray );
! for( int di = 0; di < iRadarChartDataSet.getNumberOfDataItems();
! di++ )
! {
! for( double i = scaleIncrement; i <= scaleMax; i += scaleIncrement )
! {
! double pos = scaleValue( i );
! g.drawLine(
! getX( di + 1, pos ),
! getY( di + 1, pos ),
! getX( di, pos ),
! getY( di, pos ) );
! }
! }
! }
! private void drawAxis( Graphics2D g )
! {
! g.setColor( Color.darkGray );
! for( int index = 0; index < iRadarChartDataSet.getNumberOfDataItems();
! index++ )
! {
! String label = iRadarChartDataSet.getAxisLabel( index );
! g.drawLine(
! (int) center.getX(),
! (int) center.getY(),
! getX( index, 1 ),
! getY( index, 1 ) );
! Rectangle2D bounds = g.getFontMetrics().getStringBounds( label, g );
! // draw axis label
! ChartFont cfont = props.getTitleChartFont();
! if( cfont != null )
! {
! g.setFont( cfont.getFont() );
!
! }
! g.drawString(
! label,
! (int) ( getX( index + 1, 1 ) - bounds.getWidth() / 2 ),
! getY( index + 1, 1 ) );
! }
!
! // draw gridline labels
! g.setColor( Color.darkGray );
! g.setFont( props.getAxisLabelChartFont().DEFAULT_AXIS_VALUE.getFont() );
! int selectedLine = (int) iRadarChartDataSet.getNumberOfDataItems() / 2;
! for( double i = scaleIncrement; i <= scaleMax; i += scaleIncrement )
! {
! double pos = scaleValue( i );
! Rectangle2D bounds = g.getFont().getStringBounds( "1",
! g.getFontRenderContext() );
! g.drawString( props.getGridLabelFormat().format( i ),
! getX( selectedLine, pos ),
! (int) Math.round( getY( selectedLine, pos ) + bounds.getHeight() ) );
! }
!
! }
!
!
! private int getX( int dataset, double factor )
! {
! return (int) Math.round( center.getX() + radius * factor * Math.sin( step * dataset ) );
! }
!
!
! private int getY( int dataset, double factor )
! {
! return (int) Math.round( center.getY() + radius * factor * Math.cos( step * dataset ) );
! }
!
!
! private double scaleValue( double value )
! {
! if( value > scaleMax )
! value = scaleMax;
! if( scaleMax == 0 )
! return 0;
! return value / scaleMax;
! }
}
|