今まで、選挙の結果などを円グラフで描いていた。

色々試行錯誤した結果、これを標準として使っている。

 

一応10分割以内ならばこのプログラムでOKだが、それ以上だと

色と分割数などを追加、変更するのみ。

例として10分割、入力は 1,2,3,4,5,6,7,8,9,10

 

/* 【 円グラフを分割 】 */
// 本プログラムは最大10個の分割が出来る
// ① 円を何分割するか入力する(num)
// ② 各分割した数値を入力する(k[n])
// グラフは0度から左回り

 

#include<stdio.h>
#include<math.h>
#include "Func_Header.f"

 

void unit(int col);  // 各セクションをペイント
 
int xc=340,yc=240;
int color[] = {0x0000ff,0x00a5ff,0xff00ff,0xffff00,0x00ffff,0x00ff00,
 0xcbc0ff,0xff0000,0x008000,0xffffff};
 // 赤,橙,マゼンタ,シアン,黄,黄緑,ピンク,青,緑,白
double pi=3.14159;
double th,r,angle,base;

 

int main(void)
{
___ FILE *fp;

___ double k[10],ang[10],total;
___ double ave[10],radius=150;
___ int num,m,n,num1;
___ double ave_total=0;
  
___ printf("    円をいくつに分けるか? = ");
___ fscanf(stdin,"%d",&num);
 
___ printf(" "); 
___ for(n=0;n<=(num-1);n++){
______  printf("  No.(%d) = ",n+1);  
______  fscanf(stdin,"%lf",&k[n]);
______  total += k[n];
______  ave[n] = k[n]/total;     
______  printf("    今までの合計 = %3.1f ",total);
___ }  

___ printf("     入力の合計 = %3.1f ",total);
 
___ printf(" "); 
___ for(n=0;n<=(num-1);n++){
______  ave[n] = k[n]/total; 
______  printf("    各個の割合(%d) = %3.1f(%) ",(n+1),ave[n]*100);
_______ ave_total+=ave[n]*100;
___ }


___ printf("     ave_total = %3.1f(%) ",ave_total);

___ th=angle*pi/180;             //angle(degree) ⇒ th(radian)
___ base=(abs)(radius*cos(th));  //底辺

___ ang[0]=k[0]*(360/total);
___ for(m=0;m<=9;m++)  ang[m+1]=ang[m]+k[m+1]*(360/total);

 

//  円グラフ

____for(angle=0;angle<ang[0];angle+=0.1)      unit(color[0]); // 赤
____for(num1=1;num1<=8;num1++){
_______for(angle=ang[num1-1];angle<ang[num1];angle+=0.1) unit(color[num1]);
____}

___for(angle=ang[8];angle<360;angle+=0.1)    unit(color[9]); // 白(その他)
 
___circle(xc,yc,radius,0xffffff);  // 円の外周
 
 /* ファイル作成 */
___fp=fopen("divide_circle.bmp","wb");
___fwrite(header24, 1, 54, fp);

___fwrite(bmp, 1, 640*480*3, fp);
___fclose(fp);
  

___printf("   ファイル出力 divide_circle.bmp ");
___rewind(stdin);
___getchar();
___return 0;
}

void unit(int col)
{
___th=angle*pi/180;
___for(r=0;r<=base;r++)  point(xc+r*cos(th),yc+r*sin(th),col);
}

 divide_circle_.png

 divide_circle.png