📄 graphs.c
字号:
( j=(strlen(msg_h_files)*6) )+ ( strlen(msg_h_hits)*6 )+ 52; gdImageStringUp(im,gdFontSmall,494,s,msg_h_pages,dkgrey); gdImageStringUp(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); gdImageStringUp(im,gdFontSmall,494,s-i-3,"/",dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-4,"/",black); gdImageStringUp(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); gdImageStringUp(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-j-16,"/",black); gdImageStringUp(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); } /* data1 */ for (i=0; i<31; i++) { percent = ((float)data1[i] / (float)maxval); if (percent <= 0.0) continue; x1 = 25 + (i*15); x2 = x1 + 7; y1 = 176 - (percent * 147); gdImageFilledRectangle(im, x1, y1, x2, 176, COLOR1); gdImageRectangle(im, x1, y1, x2, 176, black); } /* data2 */ for (i=0; i<31; i++) { percent = ((float)data2[i] / (float)maxval); if (percent <= 0.0) continue; x1 = 27 + (i*15); x2 = x1 + 7; y1 = 176 - (percent * 147); gdImageFilledRectangle(im, x1, y1, x2, 176, COLOR2); gdImageRectangle(im, x1, y1, x2, 176, black); } /* data5 */ for (i=0; i<31; i++) { if (data5[i]==0) continue; percent = ((float)data5[i] / (float)maxval); if (percent <= 0.0) continue; x1 = 29 + (i*15); x2 = x1 + 7; y1 = 176 - (percent * 147); gdImageFilledRectangle(im, x1, y1, x2, 176, COLOR5); gdImageRectangle(im, x1, y1, x2, 176, black); } /* sites / visits */ maxval=0; for (i=0; i<31; i++) { if (data3[i]>maxval) maxval = data3[i]; if (data6[i]>maxval) maxval = data6[i]; } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); gdImageStringUp(im, gdFontSmall,8,180+(strlen(maxvaltxt)*6), maxvaltxt, black); /* data 6 */ for (i=0; i<31; i++) { percent = ((float)data6[i] / (float)maxval); if (percent <= 0.0) continue; x1 = 25 + (i*15); x2 = x1 + 8; y1 = 276 - (percent * 92); gdImageFilledRectangle(im, x1, y1, x2, 276, COLOR6); gdImageRectangle(im, x1, y1, x2, 276, black); } /* data 3 */ for (i=0; i<31; i++) { percent = ((float)data3[i] / (float)maxval); if (percent <= 0.0) continue; x1 = 29 + (i*15); x2 = x1 + 7; y1 = 276 - (percent * 92); gdImageFilledRectangle(im, x1, y1, x2, 276, COLOR3); gdImageRectangle(im, x1, y1, x2, 276, black); } /* data4 */ fmaxval=0.0; for (i=0; i<31; i++) if (data4[i]>fmaxval) fmaxval = data4[i]; if (fmaxval <= 0.0) fmaxval = 1.0; sprintf(maxvaltxt, "%.0f", fmaxval/1024); gdImageStringUp(im, gdFontSmall,8,280+(strlen(maxvaltxt)*6), maxvaltxt, black); for (i=0; i<31; i++) { percent = data4[i] / fmaxval; if (percent <= 0.0) continue; x1 = 26 + (i*15); x2 = x1 + 10; y1 = 375 - ( percent * 91 ); gdImageFilledRectangle(im, x1, y1, x2, 375, COLOR4); gdImageRectangle(im, x1, y1, x2, 375, black); } /* open file for writing */ if ((out = fopen(fname, "wb")) != NULL) { gdImagePng(im, out); fclose(out); } /* deallocate memory */ gdImageDestroy(im); return (0);}/*****************************************************************//* *//* DAY_GRAPH3 - Day graph with three data sets *//* *//*****************************************************************/int day_graph3( char *fname, char *title, u_long data1[24], u_long data2[24], u_long data3[24]){ /* local variables */ int i,j,s,x1,y1,x2; u_long maxval=0; /* initalize the graph */ init_graph(title,512,256); /* index lines? */ if (graph_lines) { y1=210/(graph_lines+1); for (i=0;i<graph_lines;i++) gdImageLine(im,21,((i+1)*y1)+25,489,((i+1)*y1)+25,dkgrey); } /* x-axis legend */ for (i=0;i<24;i++) { gdImageString(im,gdFontSmall,33+(i*19),238,numchar[i],black); if (data1[i] > maxval) maxval = data1[i]; /* get max val */ if (data2[i] > maxval) maxval = data2[i]; if (data3[i] > maxval) maxval = data3[i]; } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); gdImageStringUp(im, gdFontSmall, 8, 26+(strlen(maxvaltxt)*6), maxvaltxt, black); if (graph_legend) /* print color coded legends? */ { /* Pages/Files/Hits Legend */ s = ( i=(strlen(msg_h_pages)*6) )+ ( j=(strlen(msg_h_files)*6) )+ ( strlen(msg_h_hits)*6 )+ 52; gdImageStringUp(im,gdFontSmall,494,s,msg_h_pages,dkgrey); gdImageStringUp(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); gdImageStringUp(im,gdFontSmall,494,s-i-3,"/",dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-4,"/",black); gdImageStringUp(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); gdImageStringUp(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-j-16,"/",black); gdImageStringUp(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); gdImageStringUp(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); } /* data1 */ for (i=0; i<24; i++) { percent = ((float)data1[i] / (float)maxval); /* percent of 100% */ if (percent <= 0.0) continue; x1 = 29 + (i*19); x2 = x1 + 10; y1 = 232 - (percent * 203); gdImageFilledRectangle(im, x1, y1, x2, 232, COLOR1); gdImageRectangle(im, x1, y1, x2, 232, black); } /* data2 */ for (i=0; i<24; i++) { percent = ((float)data2[i] / (float)maxval); /* percent of 100% */ if (percent <= 0.0) continue; x1 = 32 + (i*19); x2 = x1 + 10; y1 = 232 - (percent * 203); gdImageFilledRectangle(im, x1, y1, x2, 232, COLOR2); gdImageRectangle(im, x1, y1, x2, 232, black); } /* data3 */ for (i=0; i<24; i++) { percent = ((float)data3[i] / (float)maxval); /* percent of 100% */ if (percent <= 0.0) continue; x1 = 35 + (i*19); x2 = x1 + 10; y1 = 232 - (percent * 203); gdImageFilledRectangle(im, x1, y1, x2, 232, COLOR5); gdImageRectangle(im, x1, y1, x2, 232, black); } /* save as png file */ if ( (out = fopen(fname, "wb")) != NULL) { gdImagePng(im, out); fclose(out); } /* deallocate memory */ gdImageDestroy(im); return (0);}/*****************************************************************//* *//* PIE_CHART - draw a pie chart (10 data items max) *//* *//*****************************************************************/int pie_chart(char *fname, char *title, u_long t_val, u_long data1[], char *legend[]){ int i,x,percent,y=47; double s_arc=0.0; int purple, ltpurple, ltgreen, brown; char buffer[128]; struct pie_data gdata; /* init graph and colors */ init_graph(title,512,300); purple = gdImageColorAllocate(im, 128, 0, 128); ltgreen = gdImageColorAllocate(im, 128, 255, 192); ltpurple= gdImageColorAllocate(im, 255, 0, 255); brown = gdImageColorAllocate(im, 255, 196, 128); /* do the circle... */ gdImageArc(im, CX, CY, XRAD, YRAD, 0, 360, black); gdImageArc(im, CX, CY+10, XRAD-2, YRAD-2, 2, 178, black); gdImageFillToBorder(im, CX, CY+(YRAD/2)+1, black, black); /* slice the pie */ gdata=*calc_arc(0.0,0.0); gdImageLine(im,CX,CY,gdata.x,gdata.y,black); /* inital line */ for (i=0;i<10;i++) /* run through data array */ { if ((data1[i]!=0)&&(s_arc<1.0)) /* make sure valid slice */ { percent=(((double)data1[i]/t_val)+0.005)*100.0; if (percent<1) break; if (s_arc+((double)percent/100.0)>=1.0) { gdata=*calc_arc(s_arc,1.0); s_arc=1.0; } else { gdata=*calc_arc(s_arc,s_arc+((double)percent/100.0)); s_arc+=(double)percent/100.0; } gdImageLine(im, CX, CY, gdata.x, gdata.y, black); gdImageFill(im, gdata.mx, gdata.my, i+4); sprintf(buffer,"%s (%d%%)",legend[i], percent); x=480-(strlen(buffer)*7); gdImageString(im,gdFontMediumBold, x+1, y+1, buffer, black); gdImageString(im,gdFontMediumBold, x, y, buffer, i+4); y+=20; } } if (s_arc < 1.0) /* anything left over? */ { gdata=*calc_arc(s_arc,1.0); gdImageFill(im, gdata.mx, gdata.my, white); sprintf(buffer,"%s (%d%%)",msg_h_other,100-(int)(s_arc*100)); x=480-(strlen(buffer)*7); gdImageString(im,gdFontMediumBold, x+1, y+1, buffer, black); gdImageString(im,gdFontMediumBold, x, y, buffer, white); } /* save png image */ if ((out = fopen(fname, "wb")) != NULL) { gdImagePng(im, out); fclose(out); } /* deallocate memory */ gdImageDestroy(im); return (0);}/*****************************************************************//* *//* CALC_ARC - generate x,y coordinates for pie chart *//* *//*****************************************************************/struct pie_data *calc_arc(float min, float max){ static struct pie_data data; double d; /* Calculate max line */ d=max; data.x=cos(d*(2*PI))*((XRAD-2)/2)+CX; data.y=sin(d*(2*PI))*((YRAD-2)/2)+CY; /* Now get mid-point */ d=((min+max)/2); data.mx=cos(d*(2*PI))*(XRAD/3)+CX; data.my=sin(d*(2*PI))*(YRAD/3)+CY; return &data;}/*****************************************************************//* *//* INIT_GRAPH - initalize graph and draw borders *//* *//*****************************************************************/void init_graph(char *title, int xsize, int ysize){ int i; im = gdImageCreate(xsize,ysize); /* allocate color maps, background color first (grey) */ grey = gdImageColorAllocate(im, 192, 192, 192); dkgrey = gdImageColorAllocate(im, 128, 128, 128); black = gdImageColorAllocate(im, 0, 0, 0); white = gdImageColorAllocate(im, 255, 255, 255); green = gdImageColorAllocate(im, 0, 128, 92); orange = gdImageColorAllocate(im, 255, 128, 0); blue = gdImageColorAllocate(im, 0, 0, 255); red = gdImageColorAllocate(im, 255, 0, 0); cyan = gdImageColorAllocate(im, 0, 192, 255); yellow = gdImageColorAllocate(im, 255, 255, 0); /* make borders */ for (i=0; i<5 ;i++) /* do shadow effect */ { gdImageLine(im, i, i, xsize-i, i, white); gdImageLine(im, i, i, i, ysize-i, white); gdImageLine(im, i, ysize-i-1, xsize-i-1, ysize-i-1, dkgrey); gdImageLine(im, xsize-i-1, i, xsize-i-1, ysize-i-1, dkgrey); } gdImageRectangle(im, 20, 25, xsize-21, ysize-21, black); gdImageRectangle(im, 19, 24, xsize-22, ysize-22, white); gdImageRectangle(im, 0, 0, xsize-1, ysize-1, black); /* display the graph title */ gdImageString(im, gdFontMediumBold, 20, 8, title, blue); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -