📄 gdc_pie.c
字号:
} else { others[i] = TRUE; slice_angle I(0,i) = -MAXFLOAT; } last += this; } } /* ----- go ahead and start the GIF ----- */ im = gdImageCreate( GIFWIDTH, GIFHEIGHT ); /* --- allocate the requested colors --- */ BGColor = clrallocate( im, GDCPIE_BGColor ); LineColor = clrallocate( im, GDCPIE_LineColor ); PlotColor = clrallocate( im, GDCPIE_PlotColor ); if( GDCPIE_EdgeColor != GDC_NOCOLOR ) { EdgeColor = clrallocate( im, GDCPIE_EdgeColor ); if( threeD ) EdgeColorShd = clrshdallocate( im, GDCPIE_EdgeColor ); } /* --- set color for each slice --- */ for( i=0; i<num_points; ++i ) if( GDCPIE_Color ) { unsigned long slc_clr = GDCPIE_Color[i]; SliceColor[i] = clrallocate( im, slc_clr ); if( threeD ) SliceColorShd[i] = clrshdallocate( im, slc_clr ); } else { SliceColor[i] = PlotColor; if( threeD ) SliceColorShd[i] = clrshdallocate( im, GDCPIE_PlotColor ); } pscl = (2.0*M_PI)/tot_val; /* ----- calc: smallest a slice can be ----- */ /* 1/2 circum / num slices per side. */ /* determined by number of labels that'll fit (height) */ /* scale to user values */ /* ( M_PI / (GIFHEIGHT / (SFONTHGT+1)) ) *//* min_grphable = tot_val *//* ( 2.0 * (float)GIFHEIGHT / (float)(SFONTHGT+1+TFONTHGT+2) );*/ if( threeD ) { /* draw background shaded pie */ { float _rad1 = rad; /* _WIN32 does not like rad1, using _rad1, instead (jordan) */ for( i=0; i<num_points; ++i ) if( !(others[i]) && (!GDCPIE_missing || !GDCPIE_missing[i]) ) { float rad = _rad1; gdImageLine( im, CX(i,1), CY(i,1), IX(i,1,1), IY(i,1,1), SliceColorShd[i] ); gdImageLine( im, CX(i,1), CY(i,1), IX(i,2,1), IY(i,2,1), SliceColorShd[i] ); gdImageArc( im, CX(i,1), CY(i,1), rad*2, rad*2, TO_INT_DEG_FLOOR(slice_angle I(1,i))+270, TO_INT_DEG_CEIL(slice_angle I(2,i))+270, SliceColorShd[i] ); _rad1 = rad; rad *= 3.0/4.0; gdImageFillToBorder( im, IX(i,0,1), IY(i,0,1), SliceColorShd[i], SliceColorShd[i] ); rad = _rad1; if( GDCPIE_EdgeColor != GDC_NOCOLOR ) { gdImageLine( im, CX(i,1), CY(i,1), IX(i,1,1), IY(i,1,1), EdgeColorShd ); gdImageLine( im, CX(i,1), CY(i,1), IX(i,2,1), IY(i,2,1), EdgeColorShd ); gdImageArc( im, CX(i,1), CY(i,1), rad*2, rad*2, TO_INT_DEG(slice_angle I(1,i))+270, TO_INT_DEG(slice_angle I(2,i))+270, EdgeColorShd); } } } /* fill in connection to foreground pie */ /* this is where we earn our keep */ { struct tmp_slice_t #ifdef USE_ALLOCA *tmp_slice = (struct tmp_slice_t*)alloca ((2*num_points+2) * sizeof (struct tmp_slice_t));#else tmp_slice[2*num_points+2];#endif int t, num_slice_angles = 0; for( i=0; i<num_points; ++i ) if( !GDCPIE_missing || !GDCPIE_missing[i] ) { if( RAD_DIST1(slice_angle I(1,i)) < RAD_DIST2(slice_angle I(0,i)) ) tmp_slice[num_slice_angles].hidden = FALSE; else tmp_slice[num_slice_angles].hidden = TRUE; tmp_slice[num_slice_angles].i = i; tmp_slice[num_slice_angles].slice = slice_angle I(0,i); tmp_slice[num_slice_angles++].angle = slice_angle I(1,i); if( RAD_DIST1(slice_angle I(2,i)) < RAD_DIST2(slice_angle I(0,i)) ) tmp_slice[num_slice_angles].hidden = FALSE; else tmp_slice[num_slice_angles].hidden = TRUE; tmp_slice[num_slice_angles].i = i; tmp_slice[num_slice_angles].slice = slice_angle I(0,i); tmp_slice[num_slice_angles++].angle = slice_angle I(2,i); /* identify which 2 slices (i) have a tangent parallel to depth angle */ if( slice_angle I(1,i)<MOD_2PI(pie_3D_rad+M_PI_2) && slice_angle I(2,i)>MOD_2PI(pie_3D_rad+M_PI_2) ) { tmp_slice[num_slice_angles].i = i; tmp_slice[num_slice_angles].hidden = FALSE; tmp_slice[num_slice_angles].slice = slice_angle I(0,i); tmp_slice[num_slice_angles++].angle = MOD_2PI( pie_3D_rad+M_PI_2 ); } if( slice_angle I(1,i)<MOD_2PI(pie_3D_rad+3.0*M_PI_2) && slice_angle I(2,i)>MOD_2PI(pie_3D_rad+3.0*M_PI_2) ) { tmp_slice[num_slice_angles].i = i; tmp_slice[num_slice_angles].hidden = FALSE; tmp_slice[num_slice_angles].slice = slice_angle I(0,i); tmp_slice[num_slice_angles++].angle = MOD_2PI( pie_3D_rad+3.0*M_PI_2 ); } } qsort( tmp_slice, num_slice_angles, sizeof(struct tmp_slice_t), (int(*)(const void*,const void*))ocmpr); for( t=0; t<num_slice_angles; ++t ) { gdPoint gdp[4]; i = tmp_slice[t].i; gdp[0].x = CX(i,0); gdp[0].y = CY(i,0); gdp[1].x = CX(i,1); gdp[1].y = CY(i,1); gdp[2].x = OX(i,tmp_slice[t].angle,1); gdp[2].y = OY(i,tmp_slice[t].angle,1); gdp[3].x = OX(i,tmp_slice[t].angle,0); gdp[3].y = OY(i,tmp_slice[t].angle,0); if( !(tmp_slice[t].hidden) ) gdImageFilledPolygon( im, gdp, 4, SliceColorShd[i] ); else { rad -= 2.0; /* no peeking */ gdp[0].x = OX(i,slice_angle I(0,i),0); gdp[0].y = OY(i,slice_angle I(0,i),0); gdp[1].x = OX(i,slice_angle I(0,i),1); gdp[1].y = OY(i,slice_angle I(0,i),1); rad += 2.0; gdp[2].x = OX(i,slice_angle I(1,i),1); gdp[2].y = OY(i,slice_angle I(1,i),1); gdp[3].x = OX(i,slice_angle I(1,i),0); gdp[3].y = OY(i,slice_angle I(1,i),0); gdImageFilledPolygon( im, gdp, 4, SliceColorShd[i] ); gdp[2].x = OX(i,slice_angle I(2,i),1); gdp[2].y = OY(i,slice_angle I(2,i),1); gdp[3].x = OX(i,slice_angle I(2,i),0); gdp[3].y = OY(i,slice_angle I(2,i),0); gdImageFilledPolygon( im, gdp, 4, SliceColorShd[i] ); } if( GDCPIE_EdgeColor != GDC_NOCOLOR ) { gdImageLine( im, CX(i,0), CY(i,0), CX(i,1), CY(i,1), EdgeColorShd ); gdImageLine( im, OX(i,tmp_slice[t].angle,0), OY(i,tmp_slice[t].angle,0), OX(i,tmp_slice[t].angle,1), OY(i,tmp_slice[t].angle,1), EdgeColorShd ); } } } } /* ----- pie face ----- */ { /* float last = 0.0;*/ float _rad1 = rad; /* _WIN32 does not like rad1, using _rad1, instead (jordan) */ for( i=0; i<num_points; ++i ) if( !others[i] && (!GDCPIE_missing || !GDCPIE_missing[i]) ) { float rad = _rad1; /* last += val[i];*/ /* EXPLODE_CX_CY( slice_angle[0][i], i );*/ gdImageLine( im, CX(i,0), CY(i,0), IX(i,1,0), IY(i,1,0), SliceColor[i] ); gdImageLine( im, CX(i,0), CY(i,0), IX(i,2,0), IY(i,2,0), SliceColor[i] ); gdImageArc( im, CX(i,0), CY(i,0), (int)rad*2, (int)rad*2, TO_INT_DEG_FLOOR(slice_angle I(1,i))+270, TO_INT_DEG_CEIL(slice_angle I(2,i))+270, SliceColor[i] ); _rad1 = rad; rad *= 3.0/4.0; gdImageFillToBorder( im, IX(i,0,0), IY(i,0,0), SliceColor[i], SliceColor[i] ); /* catch missed pixels on narrow slices */ gdImageLine( im, CX(i,0), CY(i,0), IX(i,0,0), IY(i,0,0), SliceColor[i] ); rad = _rad1; if( GDCPIE_EdgeColor != GDC_NOCOLOR ) { gdImageLine( im, CX(i,0), CY(i,0), IX(i,1,0), IY(i,1,0), EdgeColor ); gdImageLine( im, CX(i,0), CY(i,0), IX(i,2,0), IY(i,2,0), EdgeColor ); gdImageArc( im, CX(i,0), CY(i,0), rad*2, rad*2, TO_INT_DEG(slice_angle I(1,i))+270, TO_INT_DEG(slice_angle I(2,i))+270, EdgeColor ); } } } if( GDCPIE_title ) { int title_len; cnt_nl( GDCPIE_title, &title_len ); GDCImageStringNL( im, &GDC_fontc[GDCPIE_title_size], (GIFWIDTH-title_len*GDC_fontc[GDCPIE_title_size].w)/2, 1, GDCPIE_title, LineColor, GDC_JUSTIFY_CENTER ); } /* labels */ if( lbl ) { float liner = rad; rad += GDCPIE_label_dist; for( i=0; i<num_points; ++i ) { if( !others[i] && (!GDCPIE_missing || !GDCPIE_missing[i]) ) { char pct_str[1+4+1+1]; int pct_wdth; int lbl_wdth; short num_nl = cnt_nl( lbl[i], &lbl_wdth ); int lblx, pctx, lbly, pcty = 0, linex, liney; lbl_wdth *= GDC_fontc[GDCPIE_label_size].w; sprintf( pct_str, (GDCPIE_percent_labels==GDCPIE_PCT_LEFT || GDCPIE_percent_labels==GDCPIE_PCT_RIGHT) && lbl[i]? "(%.0f%%)": "%.0f%%", (val[i]/tot_val) * 100.0 ); pct_wdth = GDCPIE_percent_labels == GDCPIE_PCT_NONE? 0: strlen(pct_str) * GDC_fontc[GDCPIE_label_size].w; lbly = (liney = IY(i,0,0))-( num_nl * (1+GDC_fontc[GDCPIE_label_size].h) ) / 2; lblx = pctx = linex = IX(i,0,0); if( slice_angle I(0,i) > M_PI ) /* which semicircle */ { lblx -= lbl_wdth; pctx = lblx; ++linex; } else --linex; switch( GDCPIE_percent_labels ) { case GDCPIE_PCT_LEFT: if( slice_angle I(0,i) > M_PI ) pctx -= lbl_wdth-1; else lblx += pct_wdth+1; pcty = IY(i,0,0) - ( 1+GDC_fontc[GDCPIE_label_size].h ) / 2; break; case GDCPIE_PCT_RIGHT: if( slice_angle I(0,i) > M_PI ) lblx -= pct_wdth-1; else pctx += lbl_wdth+1; pcty = IY(i,0,0) - ( 1+GDC_fontc[GDCPIE_label_size].h ) / 2; break; case GDCPIE_PCT_ABOVE: lbly += (1+GDC_fontc[GDCPIE_label_size].h) / 2; pcty = lbly - (GDC_fontc[GDCPIE_label_size].h); break; case GDCPIE_PCT_BELOW: lbly -= (1+GDC_fontc[GDCPIE_label_size].h) / 2; pcty = lbly + (GDC_fontc[GDCPIE_label_size].h) * num_nl; break; case GDCPIE_PCT_NONE: default: ; /* needed for _WIN32 !! */ } if( GDCPIE_percent_labels != GDCPIE_PCT_NONE ) gdImageString( im, GDC_fontc[GDCPIE_label_size].f, slice_angle I(0,i) <= M_PI? pctx: pctx+lbl_wdth-pct_wdth, pcty, (u_char*)pct_str, LineColor ); if( lbl[i] ) GDCImageStringNL( im, &GDC_fontc[GDCPIE_label_size], lblx, lbly, lbl[i], LineColor, slice_angle I(0,i) <= M_PI? GDC_JUSTIFY_LEFT: GDC_JUSTIFY_RIGHT ); if( GDCPIE_label_line ) { float rad = liner; gdImageLine( im, linex, liney, IX(i,0,0), IY(i,0,0), LineColor ); } } } rad -= GDCPIE_label_dist; } gdImageGif(im, gif_fptr); gdImageDestroy(im); return;}/* $Id: gdc_pie.c,v 1.7 2003/05/21 16:05:37 renaud Exp $ * local variables: * mode: c * tab-width: 4 * fill-column: 120 * end: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -