1 23 24 package de.progra.charting.render; 25 26 import java.awt.geom.Ellipse2D ; 27 import java.awt.geom.Arc2D ; 28 import de.progra.charting.CoordSystem; 29 import java.awt.geom.AffineTransform ; 30 import de.progra.charting.PointToPixelTranslator; 31 import java.awt.Graphics2D ; 32 import java.awt.RenderingHints ; 33 import java.awt.Color ; 34 import de.progra.charting.model.ChartDataModel; 35 36 41 public class PieChartRenderer extends AbstractChartRenderer { 42 43 46 public PieChartRenderer(ChartDataModel model) { 47 super(model); 48 } 49 50 54 public PieChartRenderer(CoordSystem cs, ChartDataModel model) { 55 super(cs, model); 56 } 57 58 61 public void renderChart(Graphics2D g) { 62 Object rh = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING); 63 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 64 ChartDataModel m = getChartDataModel(); 65 RowColorModel rcm = getRowColorModel(); 66 67 double height = this.getBounds().getHeight(); 68 double width = this.getBounds().getWidth(); 69 70 int datenreihen = m.getDataSetNumber(); 71 int min_length = Integer.MAX_VALUE; 73 74 for(int i = 0; i < datenreihen; i++) 75 min_length = Math.min(min_length, m.getDataSetLength(i)); 76 77 double center_y = getBounds().getCenterY(); 78 double center_x = getBounds().getCenterX(); 79 80 double rad = Math.min(width * 0.9, height * 0.9); 81 double modelVal = 0.0; 82 for(int reihe = min_length; reihe >= 1; reihe--) { 83 84 double kreis = (double)rad / min_length * reihe; 85 Ellipse2D.Double circle = new Ellipse2D.Double ((double)center_x-kreis/2, 86 (double)center_y-kreis/2, 87 kreis, kreis); 88 89 double sum = 0; 90 double start = 0.0; 91 92 for(int i = 0; i < datenreihen; i++) { 94 modelVal = m.getValueAt(i, reihe - 1).doubleValue(); 95 96 if(modelVal != modelVal) 98 continue; 99 sum += modelVal; 100 } 101 102 for(int i = 0; i < datenreihen; i++) { 103 double value = m.getValueAt(i, reihe - 1).doubleValue(); 104 105 if(value != value) value = 0.0; 107 108 Arc2D.Double arc = new Arc2D.Double (circle.getBounds2D(), 109 (double)start, 110 360.0 * (double)value/(double)sum, 111 Arc2D.PIE); 112 start += 360 * (double)value/(double)sum; 113 114 g.setColor(rcm.getColor(i)); 115 g.fill(arc); 116 } 117 g.setColor(Color.black); 118 g.draw(circle); 119 } 120 121 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, rh); 122 } 123 } 124 | Popular Tags |