使用PHP5创建图形巧妙方法(二)

鸟语花香的鱼

鸟语花香的鱼

2016-01-29 13:30

使用PHP5创建图形巧妙方法(二),使用PHP5创建图形巧妙方法(二)

添加维数

  我们的第一个需求 提供图形对象的能力 已经满足了,现在应该开始满足第二个需求了:可以使用一个 z 值将一个对象放到其他对象的上面或下面。

  我们可以将每个 z 值当作是原始图像的一个面。所画的元素是按照 z 值从最小到最大的顺序来画的。例如,让我们画两个图形元素:一个红色的圆和一个黑色的方框。圆的 z 值是 100,而黑方框的 z 值是 200。这样会将圆放到方框之后,如图 3 所示:

  图3. 不同 z 值的面

不同 z 值的面

  我们只需要修改一下 z 值就可以将这个红圆放到黑方框之上。要实现这种功能,我们需要让每个 GraphicsObject 都具有一个 z() 方法,它返回一个数字,就是 z 值。由于您需要创建不同的图形对象(Line、Oval 和 Rectangle),您还需要创建一个基本的类 BoxObject,其他 3 个类都使用它来维护起点和终点的坐标、z 值和这个对象的颜色(请参看图 4)。

  图 4. 给系统添加另外一维:z 值
给系统添加另外一维:z 值

  这个图形库的新代码如清单 3 所示:

  清单 3. 可以处理 z 信息的图形库

 <?php class GraphicsEnvironment {   public $width;   public $height;   public $gdo;   public $colors = array();   public function __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" ) );   }   public function width() { return $this-width; }   public function height() { return $this-height; }   public function addColor( $name, $r, $g, $b )   {     $this-colors[ $name ] = imagecolorallocate(       $this-gdo,       $r, $g, $b );   }   public function getGraphicObject()   {     return $this-gdo;   }   public function getColor( $name )   {     return $this-colors[ $name ];   }   public function saveAsPng( $filename )   {     imagepng( $this-gdo, $filename );   } } abstract class GraphicsObject {   abstract public function render( $ge );   abstract public function z(); } abstract class BoxObject extends GraphicsObject {   protected $color;   protected $sx;   protected $sy;   protected $ex;   protected $ey;   protected $z;   public function __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;   }   public function z() { return $this-z; } } class Line extends BoxObject {   public function render( $ge )   {     imageline( $ge-getGraphicObject(),       $this-sx, $this-sy,       $this-ex, $this-ey,       $ge-getColor( $this-color ) );   } } class Rectangle extends BoxObject {   public function render( $ge )   {     imagefilledrectangle( $ge-getGraphicObject(),       $this-sx, $this-sy,       $this-ex, $this-ey,       $ge-getColor( $this-color ) );   } } class Oval extends BoxObject {   public function render( $ge )   {     $w = $this-ex - $this-sx;     $h = $this-ey - $this-sy;     imagefilledellipse( $ge-getGraphicObject(),       $this-sx + ( $w / 2 ),       $this-sy + ( $h / 2 ),       $w, $h,       $ge-getColor( $this-color ) );   } } ? 

  测试代码也需要进行更新,如清单 4 所示。

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

展开更多 50%)
分享

猜你喜欢

使用PHP5创建图形巧妙方法(二)

PHP
使用PHP5创建图形巧妙方法(二)

使用PHP5创建图形的巧妙方法四

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

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

使用PHP5创建图形的巧妙方法三

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

使用PHP5创建图形巧法(一)

PHP
使用PHP5创建图形巧法(一)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

PHP5试用(二)

Web开发
PHP5试用(二)

初探 PHP5 (二)

PHP
初探 PHP5 (二)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

C#中数据库操作

C#中数据库操作

Flash模拟360度互动环景的简单方法(2)

Flash模拟360度互动环景的简单方法(2)
下拉加载更多内容 ↓