001: /***********************************************************************************************
002: * Copyright 2002 (C) Nathaniel G. Auvil. All Rights Reserved.
003: *
004: * Redistribution and use of this software and associated documentation ("Software"), with or
005: * without modification, are permitted provided that the following conditions are met:
006: *
007: * 1. Redistributions of source code must retain copyright statements and notices.
008: * Redistributions must also contain a copy of this document.
009: *
010: * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
011: * conditions and the following disclaimer in the documentation and/or other materials
012: * provided with the distribution.
013: *
014: * 3. The name "jCharts" or "Nathaniel G. Auvil" must not be used to endorse or promote
015: * products derived from this Software without prior written permission of Nathaniel G.
016: * Auvil. For written permission, please contact nathaniel_auvil@users.sourceforge.net
017: *
018: * 4. Products derived from this Software may not be called "jCharts" nor may "jCharts" appear
019: * in their names without prior written permission of Nathaniel G. Auvil. jCharts is a
020: * registered trademark of Nathaniel G. Auvil.
021: *
022: * 5. Due credit should be given to the jCharts Project (http://jcharts.sourceforge.net/).
023: *
024: * THIS SOFTWARE IS PROVIDED BY Nathaniel G. Auvil AND CONTRIBUTORS ``AS IS'' AND ANY
025: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
026: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
027: * jCharts OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
028: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
029: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
030: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,STRICT LIABILITY, OR TORT
031: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
032: * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
033: ************************************************************************************************/package org.krysalis.jcharts.axisChart;
034:
035: import org.krysalis.jcharts.chartData.interfaces.IAxisChartDataSet;
036: import org.krysalis.jcharts.imageMap.ImageMapNotSupportedException;
037: import org.krysalis.jcharts.properties.DataAxisProperties;
038:
039: import java.awt.*;
040: import java.awt.geom.Area;
041: import java.awt.geom.GeneralPath;
042:
043: /*************************************************************************************
044: *
045: * @author Nathaniel Auvil
046: * @version $Id: StackedAreaChart.java,v 1.1 2003/05/17 16:56:57 nathaniel_auvil Exp $
047: ************************************************************************************/
048: abstract class StackedAreaChart {
049:
050: /********************************************************************************************
051: * Draws the chart
052: *
053: * @param axisChart
054: * @param iAxisChartDataSet
055: *********************************************************************************************/
056: static void render(AxisChart axisChart,
057: IAxisChartDataSet iAxisChartDataSet) {
058: //---hopefully eliminate support requests asking about this...
059: if (axisChart.getImageMap() != null) {
060: throw new ImageMapNotSupportedException(
061: "HTML client-side image maps are not supported on Area Charts.");
062: }
063:
064: //AreaChartProperties areaChartProperties=(AreaChartProperties) iAxisChartDataSet.getChartTypeProperties();
065:
066: float xPosition = axisChart.getXAxis().getTickStart();
067:
068: GeneralPath generalPaths[] = new GeneralPath[iAxisChartDataSet
069: .getNumberOfDataSets()];
070:
071: //---cache the computed values
072: //float[][] yAxisCoordinates= new float[ iAxisChartDataSet.getNumberOfDataSets() ][ iAxisChartDataSet.getNumberOfDataItems() ];
073:
074: //---StackedAreaCharts can not be drawn on a horizontal axis so y-axis will always be the data axis
075: DataAxisProperties dataAxisProperties = (DataAxisProperties) axisChart
076: .getAxisProperties().getYAxisProperties();
077:
078: float stackedValue = 0f;
079:
080: //LOOP
081: //---initial postion of each line must be set with call to moveTo()
082: //---Do this here so every point does not have to check....if( i == 0 )... in loop
083: for (int i = 0; i < generalPaths.length; i++) {
084: generalPaths[i] = new GeneralPath();
085:
086: generalPaths[i].moveTo(xPosition, axisChart.getYAxis()
087: .getZeroLineCoordinate());
088:
089: stackedValue += iAxisChartDataSet.getValue(i, 0);
090: generalPaths[i].lineTo(xPosition, axisChart.getYAxis()
091: .computeAxisCoordinate(
092: axisChart.getYAxis().getOrigin(),
093: stackedValue,
094: axisChart.getYAxis().getScaleCalculator()
095: .getMinValue()));
096: }
097:
098: //LOOP
099: for (int j = 1; j < iAxisChartDataSet.getNumberOfDataItems(); j++) {
100: xPosition += axisChart.getXAxis().getScalePixelWidth();
101:
102: stackedValue = 0f;
103:
104: //LOOP
105: for (int i = 0; i < generalPaths.length; i++) {
106: stackedValue += iAxisChartDataSet.getValue(i, j);
107: generalPaths[i].lineTo(xPosition, axisChart.getYAxis()
108: .computeAxisCoordinate(
109: axisChart.getYAxis().getOrigin(),
110: stackedValue,
111: axisChart.getYAxis()
112: .getScaleCalculator()
113: .getMinValue()));
114: }
115: }
116:
117: Area[] areas = new Area[generalPaths.length];
118:
119: Area totalArea = null;
120: Area newArea;
121:
122: //LOOP
123: //---close the path and create an Area so can stack them
124: for (int i = 0; i < generalPaths.length; i++) {
125: generalPaths[i].lineTo(xPosition, axisChart.getYAxis()
126: .getZeroLineCoordinate());
127:
128: generalPaths[i].closePath();
129: //generalPaths[ i ].lineTo( axisChart.getXAxisProperties().getTickStartX(), axisChart.getYAxisProperties().getZeroLineCoordinate() );
130:
131: newArea = new Area(generalPaths[i]);
132:
133: //---if this is not the first area, subtract cumulative area
134: if (i > 0) {
135: areas[i] = (Area) newArea.clone();
136: areas[i].subtract(totalArea);
137:
138: totalArea = newArea;
139: } else {
140: areas[0] = newArea;
141: totalArea = areas[0];
142: }
143: }
144:
145: Graphics2D g2d = axisChart.getGraphics2D();
146:
147: //LOOP
148: //---draw each path to the image
149: for (int i = 0; i < areas.length; i++) {
150: g2d.setPaint(iAxisChartDataSet.getPaint(i));
151: //g2d.setStroke( lineChartProperties.getLineStrokes()[ i ] );
152: g2d.fill(areas[i]);
153: }
154: }
155:
156: }
|