PHP 13th provides a complete set of practical methods for creating a graph. This article will show you how to use PHP to build an object-oriented graphic layer. The use of object-oriented systems can be used to build complex graphics, which is more than using the basic functions provided in the standard PHP library. This article will show you how to use PHP to build an object-oriented graphics layer. The use of object-oriented systems can be used to build complex graphics, which is much easier than using the basic functions provided in the standard PHP library to build graphics.
I divide a graphic editing program into two types: a plotting program, which can be used to draw an image in pixels or pixels; and a plotting program, which provides a set of objects, for example, line, ellipse, and rectangle, you can use these objects to combine them into a large image, such as JPEG. The plotting program is ideal for pixel-level control. However, for business graphics, the ing program is a good method, because most graphics are composed of rectangles, lines, and edges.
The basic operations of PHP built-in plotting are very similar to those of the plotting program. They are very powerful for image rendering, but this is not suitable if you want your images to be a set of objects. This article will show you how to build an object-oriented graphics library based on the PHP graphics library. You will use the object-oriented extension provided in PHP V5.
With the support of object-oriented graphics, your graphic code is very easy to understand and maintain. You may also need to combine images from a single graphic source into multiple types of media: Flash movies, SVG, and so on.
Target
Creating a Graph object library includes three main objectives:
Switch from basic operation to object
It does not use imageline, imagefilledrectangle, and other graphic functions. this library should provide some objects, such as Line, Rectangle, and Oval, which can be used to create images. It should also support building larger complex objects or grouping objects.
Z-value sorting is supported.
The plotting program allows the painter to move the graphic objects up and down on the screen surface. This library should support the function of placing an object before and after other objects: it uses a z value to define the height of the object starting from the graphic plane. The later the object with a larger z value is drawn, the more objects with a smaller z value appear.
Provides viewport conversion.
Generally, the coordinate space of the data is different from that of the image. Basic Graph operations in PHP are performed on the coordinate plane of the image. This graphics library should support the viewport specification, so that you can specify the image in a coordinate system that programmers are familiar with, and can automatically scale to adapt to any image size.
Because there are many features, you will write code step by step to show how the code is constantly adding features.
Basic knowledge
Let's first look at a graphical environment object and an interface called GraphicsObject, which is implemented using a Line class and is used to draw a Line. UML 1.
Figure 1. graphic environment and graphic object interface
The GraphicsEnvironment class saves the graphic objects and a set of colors, including the width and height. The saveAsPng method outputs the current image to a specified file.
GraphicsObject is a required interface for any graphic object. To start using this interface, you must use the render method to draw this object. It is implemented by a Line class. it uses four coordinates: the x value of start and end, and the y value of start and end. It also has a color. When render is called, this object draws a line of color from sx, sy to ex, ey specified by the name.
The code of this library is shown in listing 1.
Listing 1. basic graphics library
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 ); } class Line extends GraphicsObject { private $color; private $sx; private $sy; private $ex; private $ey; public function __construct( $color, $sx, $sy, $ex, $ey ) { $this->color = $color; $this->sx = $sx; $this->sy = $sy; $this->ex = $ex; $this->ey = $ey; } public function render( $ge ) { imageline( $ge->getGraphicObject(), $this->sx, $this->sy, $this->ex, $this->ey, $ge->getColor( $this->color ) ); } } ?> |
The test code is shown in list 2:
List 2. test code of the basic graphics library
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 []= new Line( "black", 10, 5, 100, 200 ); $gobjs []= new Line( "blue", 200, 150, 390, 380 ); $gobjs []= new Line( "red", 60, 40, 10, 300 ); $gobjs []= new Line( "green", 5, 390, 390, 10 ); foreach( $gobjs as $gobj ) { $gobj->render( $ge ); } $ge->saveAsPng( "test.png" ); ?> |
This test program creates a graphical environment. Then create several lines that point to different directions and have different colors. Then, the render method can draw them to the graphic plane. Finally, this code saves the image as test.png.
In this article, we use the following command line interpreter to run this code, as shown below:
Figure 2 shows the format of the generated test.png file in Firefox.
. Simple graphic object testing
This is certainly not as beautiful as Mona Lisa, but it can meet the current work needs.
[NextPage]
Add dimension
Our first requirement-the ability to provide graphical objects-has been met, and now we should begin to meet the second requirement: you can use a z value to put an object above or below another object.
We can regard each z value as a surface of the original image. The elements are drawn in the order of minimum to maximum z values. For example, let's draw two graphic elements: a red circle and a black box. The z value of the circle is 100, while the z value of the black box is 200. This will place the circle behind the box, as shown in 3:
. Faces with different z values
We only need to modify the z value to put the red circle above the black box. To implement this function, we need to make every GraphicsObject have a z () method, which returns a number, that is, the z value. Because you need to create different graphic objects (Line, Oval, and Rectangle), you also need to create a basic class BoxObject, the other three classes use it to maintain the coordinates, z values, and colors of the start and end points (see figure 4 ).
Figure 4. add another dimension: z value to the system
The new code of this graphic library is shown in listing 3:
Listing 3. graphic library that can process z information
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 ) ); } } ?> |
The test code also needs to be updated, as shown in listing 4.
Listing 4. updated test code
z() < $b->z() ) return -1; if ( $a->z() > $b->z() ) return 1; return 0; } $ge = new GraphicsEnvironment( 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 []= new Oval( 100, "red", 50, 50, 150, 150 ); $gobjs []= new Rectangle( 200, "black", 100, 100, 300, 300 ); usort( $gobjs, "zsort" ); foreach( $gobjs as $gobj ) { $gobj->render( $ge ); } $ge->saveAsPng( "test.png" ); ?> |
Pay attention to two things here. First, we added the process of creating Oval and Rectangle objects. The first parameter is the z value. Second, usort is called, which uses the zsort function to sort graphic objects by z value.
PHP builds an object-oriented graphic layer. The use of object-oriented systems can be used to build complex graphics, which is better than the basic functions provided in the standard PHP library...