当前位置:中国站长下载文章中心网页编程PHP编程 → 使用 PHP 5.0创建图形的巧妙方法

使用 PHP 5.0创建图形的巧妙方法

减小字体 增大字体 作者:编辑整理  来源:互联网  发布时间:2008-9-15 22:05:26
试代码也需要进行更新,如清单4所示。

清单4.更新后的测试代码

<?phprequire_once("glib.php");functionzsort($a,$b){if($a->z()<$b->z())return-1;if($a->z()>$b->z())return1;return0;}$ge=newGraphicsEnvironment(400,400);$ge->addColor("black",0,0,0);$ge->addColor("red",255,0,0);$ge->addColor("green",0,255,0);$ge->addColor("blue",0,0,255);$gobjs=array();$gobjs[]=newOval(100,"red",50,50,150,150);$gobjs[]=newRectangle(200,"black",100,100,300,300);usort($gobjs,"zsort");foreach($gobjsas$gobj){$gobj->render($ge);}$ge->saveAsPng("test.png");?>

此处需要注意两件事情。首先是我们添加了创建Oval和Rectangle对象的过程,其中第一个参数是z值。其次是调用了usort,它使用了zsort函数来对图形对象根据z值进行排序。

在运行这个程序时,test.png文件应该如图5所示。

图5.红圆在黑方框之后



现在修改下面的代码:

$gobjs[]=newOval(200,"red",50,50,150,150);$gobjs[]=newRectangle(100,"black",100,100,300,300);

再次运行这个代码,突然这个椭圆就在这个方框上面了,如图6所示。

图6.红圆现在在黑方框上面了



红圆现在就出现在黑方框上面了,尽管它是先创建的,也是首先添加到数组中的。这就是z值的实际价值:您可以按照任何顺序来创建对象,并可以通过调整每个对象的z值来调整彼此之间的相对位置。

在这段代码中,z值排序是在这个库之外实现的。让我们通过创建一个新容器对象Group来实现这种功能,其中保存了一组GraphicsObject对象。Group对象然后再处理排序的问题。

Group类的代码如清单5所示。

清单5.Group类

functionzsort($a,$b){if($a->z()<$b->z())return-1;if($a->z()>$b->z())return1;return0;}classGroupextendsGraphicsObject{private$z;protected$members=array();publicfunction__construct($z){$this->z=$z;}publicfunctionadd($member){$this->members[]=$member;}publicfunctionrender($ge){usort($this->members,"zsort");foreach($this->membersas$gobj){$gobj->render($ge);}}publicfunctionz(){return$this->z;}}

Group对象的任务是保持一个对象数组,然后在画图时,逐个对对象zo进行排序和画图。

更新后的测试代码如清单6所示。

清单6.更新后的测试代码

<?phprequire_once("glib.php");$ge=newGraphicsEnvironment(400,400);$ge->addColor("black",0,0,0);$ge->addColor("red",255,0,0);$ge->addColor("green",0,255,0);$ge->addColor("blue",0,0,255);$g1=newGroup(0);$g1->add(newOval(200,"red",50,50,150,150));$g1->add(newRectangle(100,"black",100,100,300,300));$g1->render($ge);$ge->saveAsPng("test.png");?>


现在所有的客户机需要做的是创建一个Group对象。它会处理排序和其他操作。

创建viewport

viewport是一个人造的坐标系统,可以转换成图像的物理坐标系统。viewport的扩展可以是您希望的任何东西。例如,x和y轴的起点和终点可以是-2和2,这样viewport坐标平面的中心就是0,0。这对于三角图形(例如sin和cosine)来说是很好的一个viewport。或者,这个viewport也可以是不对称的,其中y值的范围从-1到1,x值的范围是从0到10,000,这取决于您的需要。

这个viewport的其他值可以确保构建一个400X400的图像所采用的逻辑与构建一个4000X2000的图像所采用的逻辑是相同的。代码负责向这个viewport中写入数据,然后这个viewport自动实现到图像的物理尺寸的自动映射。

要让您的viewport正常工作,您需要将这个viewport的范围从0,0修改为1,1,这可以让图形对象回调图形环境,从而将viewport的坐标转换成物理坐标。您可以将所有的代码都放到BoxObject基类中进行简化。

图7显示了有关新添加的代码的两个内容。首先是添加的tx和ty方法,这会将x和y坐标从viewport转换成物理图像的坐标。第二个是对BoxObject增加了draw方法,它的派生类应该用来进行制图。BoxObject在render方法中实现viewport的转换,并使用物理坐标来调用draw方法。使用这种方法,Line、Oval和Rectangle类都可以利用viewport坐标,而不需要担心坐标转换的问题。

图7.所添加的图形环境viewport转换


这个新库的代码如清单7所示:

清单7.具有viewport支持的图形库

<?phpclassGraphicsEnvironment{public$width;public$height;public$gdo;public$colors=array();publicfunction__construct($width,$height){$this->width=$width;$this->height=$height;$this->gdo=imagecreatetruecolor($width,$height);$this->addColor("white",255,255,255);imagefilledrectangle($this->gdo,0,0,$width,$height,$this->getColor("white"));}publicfunctionwidth(){return$this->width;}publicfunctionheight(){return$this->height;}publicfunctionaddColor($name,$r,$g,$b){$this->colors[$name]=imagecolorallocate($this->gdo,$r,$g,$b);}publicfunctiongetGraphicObject(){return$this->gdo;}publicfunctiongetColor($name){return$this->colors[$name];}publicfunctionsaveAsPng($filename){imagepng($this->gdo,$filename);}publicfunctiontx($x){return$x*$this->width;}publicfunctionty($y){return$y*$this->height;}}abstractclassGraphicsObject{abstractpublicfunctionrender($ge);abstractpublicfunctionz();}functionzsort($a,$b){if($a->z()<$b->z())return-1;if($a->z()>$b->z())return1;return0;}classGroupextendsGraphicsObject{private$z;protected$members=array();publicfunction__construct($z){$this->z=$z;}publicfunctionadd($member){$this->members[]=$member;}publicfunctionrender($ge){usort($this->members,"zsort");foreach($this->membersas$gobj){$gobj->render($ge);}}publicfunctionz(){return$this->z;}}abstractclassBoxObjectextendsGraphicsObject{protected$color;protected$sx;protected$sy;protected$ex;protected$ey;protected$z;publicfunction__construct($z,$color,$sx,$sy,$ex,$ey){$this->z=$z;$this->color=$color;$this->sx=$sx;$this->sy=$sy;$this->ex=$ex;$this->ey=$ey;}publicfunctionrender($ge){$rsx=$ge->tx($this->sx);$rsy=$ge->ty($this->sy);$rex=$ge->tx($this->ex);$rey=$ge->ty($this->ey);$this->draw($rsx,$rsy,$rex,$rey,$ge->getGraphicObject(),$ge->getColor($this->color));}abstractpublicfunctiondraw($sx,$sy,$ex,$ey,$gobj,$color);publicfunctionz(){return$this->z;}}classLineextendsBoxObject{publicfunctiondraw($sx,$sy,$ex,$ey,$gobj,$color){imageline($gobj,$sx,$sy,$ex,$ey,$color);}}classRectangleextendsBoxObject{publicfunctiondraw($sx,$sy,$ex,$ey,$gobj,$color){imagefilledrectangle($gobj,$sx,$sy,$ex,$ey,$color);}}classOvalextendsBoxObject{publicfunctiondraw($sx,$sy,$ex,$ey,$gobj,$color){$w=$ex-$sx;$h=$ey-$sy;imagefilledellipse($gobj,$sx+($w/2),$sy+($h/2),$w,$h,$color);}}?>

G

上一页  [1] [2] [3]  下一页