正 文

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


www.7dspace.com  更新日期:2006-1-13 1:25:50  七度空间


  添加维数

  我们的第一个需求 —— 提供图形对象的能力 —— 已经满足了,现在应该开始满足第二个需求了:可以使用一个 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 所示。

8页,页码:[1] [2] [3] [4] [5] [6] [7] [8] 

上一篇:把你的摄像头架到网上去
下一篇:照片处理:钻戒金属质感完美修复
标题:使用PHP 5.0创建图形的巧妙方法 作者:Jack Herrington 来源:ibm ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐