- ·上一篇文章:理解PHP中的MVC编程之MVC框架简介
- ·下一篇文章:PHP编程的十个高级技巧
使用 PHP 5.0创建图形的巧妙方法
raphicsEnvironment类中的viewport转换代码是高亮显示的,正如GraphicsObject中的render代码一样,这会回调图形环境来进行坐标转换的工作。
测试代码只需要稍加修改即可(请参看清单8)。这些对象现在需要在0,0和1,1之间的viewport中进行指定。
清单8.使用新viewport坐标的测试代码
图8.具有灵活viewport规范的图形环境
清单9显示了更新后的GraphicsEnvironment代码。
清单9.更新后的GraphicsEnvironment代码
现在这个构造函数可以利用另外4个参数了,它们分别是viewport的起点和终点。tx和ty函数使用新的viewport坐标,并将viewport坐标转换成物理坐标。
测试代码如清单10所示。
清单10.viewport测试代码
这段测试代码会在-1000,-1000与1000,000之间创建一个viewport。对象会被重新放置,以适合这个新的坐标系统。
测试代码的输出如图9所示。
图9.viewport绘制的图像转换为一个400X400的图像
如果您希望图像的大小是400X200,就可以采用下面的方法:
您会得到一个纵向缩小后的图像,如图10所示。
图10.图形的400X200版本
这展示了代码如何自动调整图像的大小来适合所请求的图像。
结束语
动态图可以为应用程序添加一个新的交互层。使用这种面向对象的系统可以让构建复杂图形变得非常简单,比使用标准的PHP库中的基本操作来画图更加简单。另外,您还可以实现画不同大小或类型的图像,并且可以长期使用相同的代码来画不同类型的媒介,例如SVG、PDF、Flash和其他类型的媒介。
测试代码只需要稍加修改即可(请参看清单8)。这些对象现在需要在0,0和1,1之间的viewport中进行指定。
清单8.使用新viewport坐标的测试代码
$g1=newGroup(0);$g1->add(newOval(200,"red",0.1,0.1,0.5,0.5));$g1->add(newRectangle(100,"black",0.4,0.4,0.9,0.9));
这非常不错,但是您可能实际上并不希望使用一个0,0与1,1之间的viewport;而是希望使用任意的viewport——例如,在-1000,-1000到1000,1000之间。要让这成为可能,这个图形环境就需要知道viewport的起点和终点。
图8.具有灵活viewport规范的图形环境
清单9显示了更新后的GraphicsEnvironment代码。
清单9.更新后的GraphicsEnvironment代码
classGraphicsEnvironment{public$vsx;public$vsy;public$vex;public$vey;public$width;public$height;public$gdo;public$colors=array();publicfunction__construct($width,$height,$vsx,$vsy,$vex,$vey){$this->vsx=$vsx;$this->vsy=$vsy;$this->vex=$vex;$this->vey=$vey;$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){$r=$this->width/($this->vex-$this->vsx);return($x-$this->vsx)*$r;}publicfunctionty($y){$r=$this->height/($this->vey-$this->vsy);return($y-$this->vsy)*$r;}}现在这个构造函数可以利用另外4个参数了,它们分别是viewport的起点和终点。tx和ty函数使用新的viewport坐标,并将viewport坐标转换成物理坐标。
测试代码如清单10所示。
清单10.viewport测试代码
<?phprequire_once("glib.php");$ge=newGraphicsEnvironment(400,400,-1000,-1000,1000,1000);$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",-800,-800,0,0));$g1->add(newRectangle(100,"black",-400,-400,900,900));$g1->render($ge);$ge->saveAsPng("test.png");?>
这段测试代码会在-1000,-1000与1000,000之间创建一个viewport。对象会被重新放置,以适合这个新的坐标系统。
测试代码的输出如图9所示。
图9.viewport绘制的图像转换为一个400X400的图像
如果您希望图像的大小是400X200,就可以采用下面的方法:
$ge=newGraphicsEnvironment(400,200,-1000,-1000,1000,1000);
您会得到一个纵向缩小后的图像,如图10所示。
图10.图形的400X200版本
这展示了代码如何自动调整图像的大小来适合所请求的图像。
结束语
动态图可以为应用程序添加一个新的交互层。使用这种面向对象的系统可以让构建复杂图形变得非常简单,比使用标准的PHP库中的基本操作来画图更加简单。另外,您还可以实现画不同大小或类型的图像,并且可以长期使用相同的代码来画不同类型的媒介,例如SVG、PDF、Flash和其他类型的媒介。
