PHP繪圖對(duì)象結(jié)構(gòu)設(shè)計(jì)與應(yīng)用案例
發(fā)表時(shí)間:2024-06-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本文主要闡述如何在PHP中實(shí)現(xiàn)繪圖對(duì)象的結(jié)構(gòu)設(shè)計(jì)。 在PHP中小型的數(shù)據(jù)結(jié)構(gòu)可由簡(jiǎn)單類(lèi)來(lái)實(shí)現(xiàn),即由簡(jiǎn)單的數(shù)據(jù)和操作來(lái)定義。但隨著數(shù)據(jù)結(jié)構(gòu)的復(fù)雜化,簡(jiǎn)單類(lèi)不能滿(mǎn)足完整體現(xiàn)整個(gè)數(shù)據(jù)結(jié)構(gòu)的需求,由此需要使用類(lèi)的結(jié)構(gòu),一句話來(lái)描述就是類(lèi)中的成員也由類(lèi)來(lái)構(gòu)成。這是面向?qū)ο笤O(shè)計(jì)方法實(shí)現(xiàn)對(duì)數(shù)據(jù)封裝、信息隱...
本文主要闡述如何在PHP中實(shí)現(xiàn)繪圖對(duì)象的結(jié)構(gòu)設(shè)計(jì)。
在PHP中小型的數(shù)據(jù)結(jié)構(gòu)可由簡(jiǎn)單類(lèi)來(lái)實(shí)現(xiàn),即由簡(jiǎn)單的數(shù)據(jù)和操作來(lái)定義。但隨著數(shù)據(jù)結(jié)構(gòu)的復(fù)雜化,簡(jiǎn)單類(lèi)不能滿(mǎn)足完整體現(xiàn)整個(gè)數(shù)據(jù)結(jié)構(gòu)的需求,由此需要使用類(lèi)的結(jié)構(gòu),一句話來(lái)描述就是類(lèi)中的成員也由類(lèi)來(lái)構(gòu)成。這是面向?qū)ο笤O(shè)計(jì)方法實(shí)現(xiàn)對(duì)數(shù)據(jù)封裝、信息隱藏及代碼重用的擴(kuò)展方式,而另一種方式就是類(lèi)的繼承。
本文主要討論類(lèi)的結(jié)構(gòu)。
以繪圖為例,我們來(lái)看關(guān)于幾何圖形的簡(jiǎn)單例子。
幾何圖形包含一系列的點(diǎn),線,面等,而由一些幾何公理可知點(diǎn)是其中最基本的構(gòu)成元素。所以,我們以點(diǎn)作為設(shè)計(jì)的基本對(duì)象,由此來(lái)描述線和面對(duì)象。用來(lái)舉例說(shuō)明類(lèi)結(jié)構(gòu)的實(shí)現(xiàn)方式。
分析
假設(shè)點(diǎn)位于某一平面內(nèi),在確定了坐標(biāo)系之后(即給定了原點(diǎn)和坐標(biāo)軸及其正方向),我們便可以用坐標(biāo)位置來(lái)描述這個(gè)點(diǎn),如圖:
直線是由兩點(diǎn)來(lái)確定的,所以由起始和終止兩點(diǎn)便可確定一條線段。如圖:
面 ——(不妨舉例)矩形,由兩條平行對(duì)邊構(gòu)成,且相鄰兩邊夾角為90度。繪圖時(shí)發(fā)現(xiàn),矩形可由對(duì)角的兩點(diǎn)唯一確定。如圖:
基于上述分析,我們開(kāi)始設(shè)計(jì):點(diǎn)類(lèi),線類(lèi),面類(lèi)。線和面類(lèi)中的數(shù)據(jù)成員包含點(diǎn)類(lèi),這就是類(lèi)的結(jié)構(gòu),從而由簡(jiǎn)單類(lèi)構(gòu)成復(fù)雜類(lèi)。
設(shè)計(jì)如下:
從另一個(gè)角度考慮,如果不采用類(lèi)的結(jié)構(gòu)設(shè)計(jì)方法,一個(gè)沒(méi)有層次的類(lèi)可能是這樣的,以Line為例:
一個(gè)簡(jiǎn)單類(lèi),想法是:成員變量代表確定此線段的兩個(gè)點(diǎn)的坐標(biāo)(x1,y1),(x2,y2)。
對(duì)比兩種設(shè)計(jì),Line_Bad帶來(lái)的結(jié)果是維護(hù)和更改不便,因?yàn)闆](méi)有層次。首先需要維護(hù)的成員變量多,四個(gè);若需要設(shè)置線段中點(diǎn)的顏色,Line_Bad則需要增加成員函數(shù);若需要將這直線改成三維空間的,Line_Bad則需要增加成員變量,然后修改所有的成員函數(shù)。而用Line類(lèi)則避免了這樣的麻煩,設(shè)置顏色只需調(diào)用Point的方法就可以完成;而改成三維空間,只需增加Point的屬性(z坐標(biāo))就可以了。而Line類(lèi)本身幾乎不用做任何改動(dòng)(與PHP的繪圖函數(shù)有關(guān)),省了不少維護(hù)修改的力氣吧 :)。
現(xiàn)在繪圖的基礎(chǔ)有了,我們就來(lái)舉一個(gè)實(shí)際的應(yīng)用例子。
在許多統(tǒng)計(jì)中常需要用圖例來(lái)顯示各類(lèi)統(tǒng)計(jì)結(jié)果,我們就用上面設(shè)計(jì)的繪圖類(lèi)來(lái)實(shí)現(xiàn)柱狀圖的顯示。
分析:
柱狀圖主要由坐標(biāo)軸和柱體構(gòu)成。坐標(biāo)軸可由Line類(lèi)顯示,柱體可由Rectangle類(lèi)顯示。
顯示坐標(biāo)軸如下:
function DrawAxes()
{
$vertspan=200;
$p1=new Point(10,$vertspan+2.5);
$p2=new Point(10,2.5);
$VerticalAxis=new Line($p1,$p2);
$VerticalAxis->Draw();
$p1=new Point(7.5,$vertspan);
$p2=new Point(370,$vertspan);
$HorizontalAxis=new Line($p1,$p2);
$HorizontalAxis->Draw();
}
顯示柱體如下:
function Plot($arr_barTotal)
{
$vertspan=200;
//顯示比例
$scaleHeight=190;
//確定柱狀中最大值
$maxTotal=Max1(&$arr_barTotal);
//確定柱體個(gè)數(shù)
$total=count($arr_barTotal);
//循環(huán)顯示柱狀體
$dx=15;
$x=10+$dx;
for($i=0;$i<$total;$i++)
{
$rectHeight=($arr_barTotal[$i]/$maxTotal)*$scaleHeight;
$p1=new Point($x,$vertspan-$rectHeight);
$p2=new Point($x+$dx,$vertspan);
$CurrRect= new Rectangle($p1,$p2);
$CurrRect->Draw();
$x+=2.0*$dx;
}
}
主程序:
1) 確定顯示數(shù)據(jù)。
2) 顯示坐標(biāo)軸。
3) 顯示柱狀體。
//main
$arr_barTotal=array('1','3','34','23','5','25','7'); //顯示數(shù)據(jù)
DrawAxes(); //畫(huà)坐標(biāo)軸
Plot($arr_barTotal); //畫(huà)柱狀體
這樣主程序框架就完成了:D
效果如下。
如需進(jìn)一步美化工作,大家可自行添加基礎(chǔ)顯示類(lèi)中相應(yīng)的屬性及相應(yīng)的成員函數(shù),這里就不多述了。
附:因?yàn)槠鶈?wèn)題,沒(méi)有附上源碼。
本文中所有代碼可在http://10.31.172.7/cgi-bin/cvsweb.cgi/kai/graph/中獲得,并已在php4.0.2+Gd1.62環(huán)境下調(diào)試通過(guò)。