📄 piechart2d.java
字号:
/***********************************************************************************************
* File Info: $Id: PieChart2D.java,v 1.11 2003/04/19 01:55:13 nathaniel_auvil Exp $
* Copyright (C) 2002
* Author: Nathaniel G. Auvil
* Contributor(s):
*
* 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 nathaniel_auvil@users.sourceforge.net
*
* 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.jCharts.nonAxisChart;
import org.jCharts.Chart;
import org.jCharts.types.PieLabelType;
import org.jCharts.chartData.interfaces.IPieChartDataSet;
import org.jCharts.chartData.processors.PieChartDataProcessor;
import org.jCharts.chartText.NumericTagGroup;
import org.jCharts.chartText.TextTagGroup;
import org.jCharts.imageMap.*;
import org.jCharts.properties.*;
import org.jCharts.test.HTMLChartTestable;
import org.jCharts.test.HTMLGenerator;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Arc2D;
import java.awt.geom.Line2D;
/***********************************************************************************************
*
*
************************************************************************************************/
final public class PieChart2D extends Chart implements HTMLChartTestable
{
private float pieX;
private float pieY;
private float diameter;
private IPieChartDataSet iPieChartDataSet;
private PieChartDataProcessor pieChartDataProcessor;
private TextTagGroup textTagGroup;
/************************************************************************************************
* Constructor
*
* @param iPieChartDataSet
* @param legendProperties
* @param chartProperties general chart properties
* @param pixelWidth
* @param pixelHeight
************************************************************************************************/
public PieChart2D( IPieChartDataSet iPieChartDataSet,
LegendProperties legendProperties,
ChartProperties chartProperties,
int pixelWidth,
int pixelHeight )
{
super( legendProperties, chartProperties, pixelWidth, pixelHeight );
this.iPieChartDataSet = iPieChartDataSet;
}
/************************************************************************************************
* Draws the chart
*
************************************************************************************************/
protected void renderChart()
{
PieChart2DProperties properties = (PieChart2DProperties) this.iPieChartDataSet.getChartTypeProperties();
this.pieChartDataProcessor = new PieChartDataProcessor( this.iPieChartDataSet );
this.pieChartDataProcessor.processData();
//---cache calcs used more than once
float edgePaddingTimesTwo = super.getChartProperties().getEdgePadding() * 2;
float halfImageWidth = super.getImageWidth() / 2;
float halfImageHeight = super.getImageHeight() / 2;
FontRenderContext fontRenderContext = super.getGraphics2D().getFontRenderContext();
//---render the TITLE. If no title, this will return zero.
float chartTitleHeight = super.renderChartTitle( this.iPieChartDataSet.getChartTitle(), fontRenderContext );
//---if we want to display value labels on the chart need to determine the width this will take
float widestLabel = 0;
float widestLabelTimesTwo = 0;
float tallestLabel = 0;
float tallestLabelTimesTwo = 0;
if( !properties.getPieLabelType().equals( PieLabelType.NO_LABELS ) )
{
if( properties.getPieLabelType().equals( PieLabelType.VALUE_LABELS ) )
{
this.textTagGroup = new NumericTagGroup( properties.getValueLabelFont(),
fontRenderContext,
properties.showValueLabelCurrency(),
false,
properties.showValueLabelGrouping(),
properties.getValueLabelRoundingPowerOfTen() );
for( int i = 0; i < this.iPieChartDataSet.getNumberOfDataItems(); i++ )
{
((NumericTagGroup) this.textTagGroup).addLabel( this.iPieChartDataSet.getValue( i ) );
}
}
//---PieLabelType.LEGEND_LABELS
else
{
this.textTagGroup = new TextTagGroup( properties.getValueLabelFont(), fontRenderContext );
for( int i = 0; i < this.iPieChartDataSet.getNumberOfLegendLabels(); i++ )
{
this.textTagGroup.addLabel( this.iPieChartDataSet.getLegendLabel( i ) );
}
}
widestLabel = this.textTagGroup.getWidestLabel();
widestLabelTimesTwo = widestLabel * 2;
tallestLabel = this.textTagGroup.getTallestLabel();
tallestLabelTimesTwo = tallestLabel * 2;
}
//---if there is a legend...
if( this.getLegend() != null )
{
float legendX = 0f;
float legendY = 0f;
//---calculate all the legend rendering coordinates and positions.
this.getLegend().calculateDrawingValues( iPieChartDataSet );
//---adjust width and height based on the Legend size.
if( (this.getLegend().getLegendProperties().getPlacement() == LegendAreaProperties.RIGHT)
|| (this.getLegend().getLegendProperties().getPlacement() == LegendAreaProperties.LEFT) )
{
float widthNeeded = this.getLegend().getWidth() + this.getLegend().getLegendProperties().getChartPadding();
widthNeeded += edgePaddingTimesTwo;
float heightAvailable = super.getImageHeight();
heightAvailable -= edgePaddingTimesTwo;
heightAvailable -= chartTitleHeight;
//---if we are going to show labels, include their width...
if( this.textTagGroup != null )
{
widthNeeded += widestLabelTimesTwo;
//todo should have a padding property?
widthNeeded += (properties.getTickLength() * 2);
heightAvailable -= tallestLabelTimesTwo;
}
//---diameter of pie will be at least one pixel, even if the legend takes up the whole image.
//---this will keep the renderer from blowing up.
this.diameter = Math.max( super.getImageWidth() - widthNeeded, 1.0f );
//---make sure we do not make the pie diameter taller than the image
this.diameter = Math.min( this.diameter, heightAvailable );
if( this.getLegend().getLegendProperties().getPlacement() == LegendAreaProperties.RIGHT )
{
//---pie's diameter may not fill image width as may be image height constrained.
//---center the pie chart
this.pieX = halfImageWidth - ((this.getLegend().getWidth() + this.getLegend().getLegendProperties().getChartPadding() + this.diameter) / 2);
//---position legend based on the pie position
legendX = this.pieX + this.diameter + this.getLegend().getLegendProperties().getChartPadding();
legendX += widestLabel;
legendX += properties.getTickLength();
}
else
{
//---position legend based on the pie position
legendX = halfImageWidth - ((this.getLegend().getWidth() + this.getLegend().getLegendProperties().getChartPadding() + this.diameter) / 2);
//---pie's diameter may not fill image width as may be image height constrained.
//---center the pie chart
this.pieX = legendX + this.getLegend().getWidth() + this.getLegend().getLegendProperties().getChartPadding();
}
//---center the legend vertically
legendY = halfImageHeight - (this.getLegend().getHeight() / 2);
legendY += chartTitleHeight / 2;
//---center the pie vertically
this.pieY = halfImageHeight - (this.diameter / 2);
this.pieY += chartTitleHeight / 2;
}
else
{
float heightNeeded = this.getLegend().getHeight() + this.getLegend().getLegendProperties().getChartPadding();
heightNeeded += edgePaddingTimesTwo;
//---add in the chart title height
heightNeeded += chartTitleHeight;
//---diameter of pie will be at least one pixel, even if the legend takes up the whole image.
//---this will keep the renderer from blowing up.
this.diameter = Math.max( super.getImageHeight() - heightNeeded, 1.0f );
//---make sure we do not make the pie diameter wider than the image
this.diameter = Math.min( this.diameter, super.getImageWidth() - edgePaddingTimesTwo );
if( this.getLegend().getLegendProperties().getPlacement() == LegendAreaProperties.BOTTOM )
{
//---pie's diameter may not fill image width as may be image height constrained.
//---center the pie chart
this.pieY = halfImageHeight - ((this.getLegend().getHeight() + this.getLegend().getLegendProperties().getChartPadding() + this.diameter) / 2);
this.pieY += chartTitleHeight / 2;
//---position legend based on the pie position
legendY = this.pieY + this.diameter + this.getLegend().getLegendProperties().getChartPadding();
}
else
{
//---pie's diameter may not fill image width as may be image height constrained.
//---center the pie chart
legendY = halfImageHeight - ((this.getLegend().getHeight() + this.getLegend().getLegendProperties().getChartPadding() + this.diameter) / 2);
legendY += chartTitleHeight / 2;
//---position legend based on the pie position
this.pieY = legendY + this.getLegend().getHeight() + this.getLegend().getLegendProperties().getChartPadding();
}
//---center the legend vertically
legendX = halfImageWidth - (this.getLegend().getWidth() / 2);
//---center the pie vertically
this.pieX = halfImageWidth - (this.diameter / 2);
}
super.getLegend().setX( legendX );
super.getLegend().setY( legendY );
super.getLegend().render();
}
//---else, the Legend is NULL
else
{
float heightNeeded = super.getImageHeight() - edgePaddingTimesTwo - chartTitleHeight;
float widthNeeded = super.getImageWidth() - edgePaddingTimesTwo;
//---if we are going to show labels, include their width...
if( this.textTagGroup != null )
{
widthNeeded -= widestLabelTimesTwo;
widthNeeded -= (properties.getTickLength() * 2);
heightNeeded -= tallestLabelTimesTwo;
heightNeeded -= (properties.getTickLength() * 2);
}
//---if there is no legend, fill the image with the pie
this.diameter = Math.min( heightNeeded, widthNeeded );
float halfDiameter = this.diameter / 2;
//---center the pie horizontally
this.pieX = halfImageWidth - halfDiameter;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -