X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Foutput%2Fcharts%2Fpiechart.c;h=c4dc0e67a8b36a0d390e9247e8ec3fc5c886e74c;hb=cf75e794a54ba92f57d71b236de555fcc1d5877e;hp=3fceaf20f5b016bec4d798cdcd298206e87ebd2b;hpb=000e3e8c5818476c3afbc75fad9347aefb6e902a;p=pspp-builds.git diff --git a/src/output/charts/piechart.c b/src/output/charts/piechart.c index 3fceaf20..c4dc0e67 100644 --- a/src/output/charts/piechart.c +++ b/src/output/charts/piechart.c @@ -1,47 +1,49 @@ -/* PSPP - draws pie charts of sample statistics +/* PSPP - a program for statistical analysis. + Copyright (C) 2004 Free Software Foundation, Inc. -Copyright (C) 2004 Free Software Foundation, Inc. -Written by John Darrington + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. */ +#include -#include "config.h" -#include "piechart.h" -#include "chart.h" #include #include #include #include -#include "str.h" -#include "value-labels.h" -#include "misc.h" -#include "plot-chart.h" + + +#include +#include + +#include +#include +#include + +#include "minmax.h" + /* Pie charts of course need to know Pi :) */ #ifndef M_PI -#define M_PI ( 22.0 / 7.0 ) +#define M_PI ( 22.0 / 7.0 ) #endif /* Draw a single slice of the pie */ static void -draw_segment(struct chart *ch, - double centre_x, double centre_y, +draw_segment(struct chart *ch, + double centre_x, double centre_y, double radius, double start_angle, double segment_angle, const char *colour) ; @@ -57,16 +59,16 @@ piechart_plot(const char *title, const struct slice *slices, int n_slices) struct chart *ch = chart_create(); - const double left_label = ch->data_left + + const double left_label = ch->data_left + (ch->data_right - ch->data_left)/10.0; - const double right_label = ch->data_right - + const double right_label = ch->data_right - (ch->data_right - ch->data_left)/10.0; const double centre_x = (ch->data_right + ch->data_left ) / 2.0 ; const double centre_y = (ch->data_top + ch->data_bottom ) / 2.0 ; - const double radius = min( + const double radius = MIN( 5.0 / 12.0 * (ch->data_top - ch->data_bottom), 1.0 / 4.0 * (ch->data_right - ch->data_left) ); @@ -74,44 +76,44 @@ piechart_plot(const char *title, const struct slice *slices, int n_slices) chart_write_title(ch, title); - for (i = 0 ; i < n_slices ; ++i ) + for (i = 0 ; i < n_slices ; ++i ) total_magnetude += slices[i].magnetude; - for (i = 0 ; i < n_slices ; ++i ) + for (i = 0 ; i < n_slices ; ++i ) { static double angle=0.0; - const double segment_angle = + const double segment_angle = slices[i].magnetude / total_magnetude * 2 * M_PI ; - const double label_x = centre_x - + const double label_x = centre_x - radius * sin(angle + segment_angle/2.0); - const double label_y = centre_y + + const double label_y = centre_y + radius * cos(angle + segment_angle/2.0); /* Fill the segment */ draw_segment(ch, - centre_x, centre_y, radius, + centre_x, centre_y, radius, angle, segment_angle, data_colour[i]); - + /* Now add the labels */ - if ( label_x < centre_x ) + if ( label_x < centre_x ) { pl_line_r(ch->lp, label_x, label_y, left_label, label_y ); pl_moverel_r(ch->lp,0,5); - pl_alabel_r(ch->lp,0,0,slices[i].label); + pl_alabel_r (ch->lp, 0, 0, ds_cstr (&slices[i].label)); } else { - pl_line_r(ch->lp, + pl_line_r(ch->lp, label_x, label_y, right_label, label_y ); pl_moverel_r(ch->lp,0,5); - pl_alabel_r(ch->lp,'r',0,slices[i].label); + pl_alabel_r (ch->lp, 'r', 0, ds_cstr (&slices[i].label)); } angle += segment_angle; @@ -126,16 +128,16 @@ piechart_plot(const char *title, const struct slice *slices, int n_slices) } static void -fill_segment(struct chart *ch, - double x0, double y0, +fill_segment(struct chart *ch, + double x0, double y0, double radius, double start_angle, double segment_angle) ; /* Fill a segment with the current fill colour */ static void -fill_segment(struct chart *ch, - double x0, double y0, +fill_segment(struct chart *ch, + double x0, double y0, double radius, double start_angle, double segment_angle) { @@ -143,16 +145,16 @@ fill_segment(struct chart *ch, const double start_x = x0 - radius * sin(start_angle); const double start_y = y0 + radius * cos(start_angle); - const double stop_x = - x0 - radius * sin(start_angle + segment_angle); + const double stop_x = + x0 - radius * sin(start_angle + segment_angle); - const double stop_y = + const double stop_y = y0 + radius * cos(start_angle + segment_angle); assert(segment_angle <= 2 * M_PI); assert(segment_angle >= 0); - if ( segment_angle > M_PI ) + if ( segment_angle > M_PI ) { /* Then we must draw it in two halves */ fill_segment(ch, x0, y0, radius, start_angle, segment_angle / 2.0 ); @@ -180,10 +182,10 @@ fill_segment(struct chart *ch, /* Draw a single slice of the pie */ static void -draw_segment(struct chart *ch, - double x0, double y0, +draw_segment(struct chart *ch, + double x0, double y0, double radius, - double start_angle, double segment_angle, + double start_angle, double segment_angle, const char *colour) { const double start_x = x0 - radius * sin(start_angle); @@ -193,7 +195,7 @@ draw_segment(struct chart *ch, pl_savestate_r(ch->lp); pl_colorname_r(ch->lp, colour); - + pl_pentype_r(ch->lp,1); pl_filltype_r(ch->lp,1); @@ -203,7 +205,7 @@ draw_segment(struct chart *ch, /* Draw line dividing segments */ pl_pentype_r(ch->lp, 1); pl_fline_r(ch->lp, x0, y0, start_x, start_y); - + pl_restorestate_r(ch->lp); }