使用C語(yǔ)言繪制統(tǒng)計(jì)圖中的餅圖
統(tǒng)計(jì)圖餅圖繪制方法(C語(yǔ)言)
常用的統(tǒng)計(jì)圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖。
前幾類圖比較容易繪制,餅圖繪制較難。今值此介紹餅圖的繪制方法。
本方法采用C語(yǔ)言的最基本功能:
(1) 繪圖功能畫線,畫圓,畫長(zhǎng)方形。
(2) 界面美工設(shè)計(jì),界面文字打印輸出。
代碼中有詳細(xì)的注釋,通俗易懂,一看就會(huì)。
效果圖




實(shí)現(xiàn)代碼
下面是繪制餅圖的代碼:
//變量: 可設(shè)置成全局變量或私有變量
Canvas cs ; //畫布,繪制圖表載體
float pi=3.1415926535 ;
float a ; //三角函數(shù) sin (a), cos (a),
float r ; //圓半徑 radius
int i, j, n ;
float x0,y0,x1,y1 ; //作圖坐標(biāo)
float dx,dy ; //中心坐標(biāo)
string ss, ss1, ss2 ; //打印文字
//餅圖的代碼 PieGraph ( ):
PieGraph ( ) { //繪制餅圖和突出顯示圖塊
int p[6] ; //set data or get data
int k[6] ; //作圖數(shù)據(jù)換算
double pn ; //顯示百分比數(shù) " 29.16% "
int setn ; //突出圖塊選項(xiàng)
double ma ; //圖上標(biāo)文字 " 29.16% "
cs.ClearDraw (0,src); //清屏(cls), clear screen
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,250,250,250);
cs.DrawRect (0,4,720,600); //畫圖表底板
cs.SetColor (255,140,140,140);
cs.DrawRect (24,24,706,586); //back
cs.SetColor (255,230,240,250);
cs.DrawRect (20,20,700,580); //back
cs.SetFillMode (0); //0不填色,1填色
cs.SetColor (255,0,0,240);
cs.DrawRect (20,20,700,580); //框線
cs.DrawRect (24,24,696,576); //框線
cs.SetFillMode (1); //0不填色,1填色
cs.SetTextSize (28); //題標(biāo)
cs.SetColor (255,0,0,250);
cs.DrawText ("達(dá)克科技?DUCK",470,60) ;
cs.SetStrokeWidth(2);
//圖例: 圖表底板寬高 720 *600
dx=360 ; dy=300 ; //center
cs.SetColor(255,250,240,240);
cs.DrawCircle(dx,dy,128); //圖底板圓形
cs.SetTextStyle (0);
cs.SetTextSize (18);
r=120 ; //radius
setn=1 ; //突出圖塊選項(xiàng)
p[1]=210; p[2]=165; p[3]=115; p[4]=135; p[5]=95;
//預(yù)設(shè)置數(shù)據(jù) p (5)
//*本圖例預(yù)設(shè)置數(shù)據(jù),可另行設(shè)計(jì)數(shù)據(jù)輸入方法
//為保證圖案填充色需增加線條密度,故作圖整個(gè)
//圓分為 720 線,data p(n) 湊數(shù)成720。
//*若其他數(shù)據(jù)項(xiàng)要按比例換算成總數(shù)相加為720的數(shù)。
//若數(shù)據(jù)項(xiàng)和不滿 720 圖樣就變?yōu)樯刃巍?
//輸入數(shù)據(jù) p(n) 轉(zhuǎn)換成繪圖數(shù)據(jù)值 k(n)
k[0]= -180;
k[1]=k[0]+p[1];
k[2]=k[1]+p[2];
k[3]=k[2]+p[3];
k[4]=k[3]+p[4];
k[5]=k[4]+p[5];
for (n=1; n<=5 ; n++){ //data=5,繪制餅圖
for (i= k[n-1] ; i<=k[n] ; i++){ //draw Piegraph
a=pi/360*i ; //** a/2 繪出的是半圓圖形
if (n==1) cs.SetColor(255,0,250,0);
if (n==2) cs.SetColor(255,240,140,0);
if (n==3) cs.SetColor(255,250,0,0);
if (n==4) cs.SetColor(255,140,40,220);
if (n==5) cs.SetColor(255,0,150,180);
x0=(float)(r*cos (a))+dx; //r=radius
y0=(float)(r*sin (a))+dy;
cs.DrawLine (dx,dy,x0,y0); //逐線繪出
cs.DrawRect (100,n*50,195,30+n*50); //色標(biāo)
//** print data as "29.16%"
s=intToString (p[n]);
cs.DrawText (s, 60,20+n*50);
pn=p[n]*10000/720 ; //擴(kuò)大100, +"%"
pn=pn/100 ; //保留2位小數(shù)
ss1=doubleToString (pn)+"%" ;
cs.SetColor(255,250,250,250);
cs.DrawText (ss1,120,20+n*50);
if (n==1&&setn==1) ss2=ss1 ;
if (n==2&&setn==2) ss2=ss1 ;
cs.SetColor(255,0,0,150); //圖上標(biāo)( n% )
ma=pi/360*((k[n-1]+k[n])/2) ;
x1=(float)((r-45)*cos (ma))+dx-30;
y1=(float)((r-35)*sin (ma))+dy ;
cs.DrawText (ss1,x1,y1);
//*畫環(huán)圖方法: 中心加圓是環(huán)圖,不加圓是餅圖
//cs.SetColor(255,250,240,240);
//cs.DrawCircle(dx,dy,50); //中心加圓是環(huán)圖
cs.Update (); } } //逐線動(dòng)畫顯示繪制過程
//* 演示繪制重點(diǎn)突出的圖塊,暫設(shè)圖例1 和 圖例2
//* 展示二種畫法 //***
//*本圖例預(yù)設(shè)置,可另設(shè)計(jì)圖表點(diǎn)擊選取或其他選項(xiàng)方法 。
// 預(yù)設(shè) setn=1 ; 0=無,setn1-5 可選。
// for (i= k[0] ; i<=k[1] ; i++){ 設(shè)置通用 k (n) , kstart to kend 即可
//*此方法可改寫為 setn1-setn5 通用方法。
sleep (500) ; //延時(shí)
if (setn==1){
for (i= k[0] ; i<=k[1] ; i++){ //銷隱圖塊,圓底色遮罩
a=pi/360*i ;
cs.SetColor (255,250,240,240);
x0=(float)(r*cos (a))+dx;
y0=(float)(r*sin (a))+dy;
cs.DrawLine (dx,dy,x0,y0); }
cs.Update (); //銷隱
for (i= k[0] ; i<=k[1] ; i++){ //繪出突出圖塊
a=pi/360*i ;
cs.SetColor (255,0,240,0);
x0=(float)(r*cos (a))+dx+8 ;
y0=(float)(r*sin (a))+dy-6 ;
cs.DrawLine (dx+8,dy-6,x0,y0); //draw out
cs.SetColor (255,250,250,0);
cs.SetTextSize (20); //show text
cs.DrawText (ss2,dx+20,dy-42) ;
cs.Update (); } } //setn=1, 繪出突出色塊
if (setn==2){
for (i= k[1] ; i<=k[2] ; i++){ //銷隱圖塊
a=pi/360*i ;
cs.SetColor (255,250,240,240);
x0=(float)(r*cos (a))+dx;
y0=(float)(r*sin (a))+dy;
cs.DrawLine (dx,dy,x0,y0); }
cs.Update (); //銷隱
a=pi/360*((k[1]+k[2])/2) ; //*** 這是第二種畫法
x1=(float)(10*cos (a))+dx ;
y1=(float)(10*sin (a))+dy ;
for (i= k[1] ; i<=k[2] ; i++){ //繪出突出圖塊
a=pi/360*i ;
cs.SetColor (255,240,140,0);
x0=(float)(r*cos (a))+x1; //***
y0=(float)(r*sin (a))+y1; //***
cs.DrawLine (x1,y1,x0,y0); //*** draw out
cs.SetColor (255,250,250,0);
cs.SetTextSize (20); //show text
cs.DrawText (ss2,x1+15,y1+60) ; //***
cs.Update (); } } //setn=2, 繪出突出色塊
//繪制立體字
cs.SetFillMode (1); //0不填色,1填色
cs.SetTextSize (60);
cs.SetTextStyle (1);
cs.SetStrokeWidth(1);
ss="統(tǒng)計(jì)圖 - 餅圖" ;
cs.SetColor(255,50,120,20);
cs.DrawText (ss,154,524); //陰影
cs.SetColor(255,0,200,250);
cs.DrawText (ss,150,520); //本字
cs.SetFillMode (0); //0不填色,1填色
cs.SetColor(255,250,0,0);
cs.DrawText (ss,150,520); //框線
cs.Update (); //顯示
}//PieGraph ()
//**** END *****************到此這篇關(guān)于使用C語(yǔ)言繪制統(tǒng)計(jì)圖中的餅圖的文章就介紹到這了,更多相關(guān)C語(yǔ)言餅圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言內(nèi)存對(duì)齊實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言內(nèi)存對(duì)齊,包括內(nèi)存對(duì)其的基本概念及用法,以及注意事項(xiàng),并以實(shí)例形式加以說明,需要的朋友可以參考下2014-09-09
64位linux 編譯c提示gnu/stubs-32.h:No such file or directory的解決方法
這篇文章主要介紹了64位linux 編譯c提示gnu/stubs-32.h:No such file or directory的解決方法,需要的朋友可以參考下2020-03-03
C語(yǔ)言鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
C語(yǔ)言常用庫(kù)函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉
C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來詳細(xì)了解它2022-04-04
C語(yǔ)言位段(位域)機(jī)制結(jié)構(gòu)體的特殊實(shí)現(xiàn)及解析
這篇文章主要為大家介紹了C語(yǔ)言位段位域機(jī)制結(jié)構(gòu)體的特殊實(shí)現(xiàn)講解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-02-02
C語(yǔ)言實(shí)現(xiàn)手機(jī)電話簿管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)手機(jī)電話簿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

