PHP绘图对象结构设计与应用实例

对象|设计|应用实例

本文主要阐述如何在PHP中实现绘图对象的结构设计。

在PHP中小型的数据结构可由简单类来实现,即由简单的数据和操作来定义。但随着数据结构的复杂化,简单类不能满足完整体现整个数据结构的需求,由此需要使用类的结构,一句话来描述就是类中的成员也由类来构成。这是面向对象设计方法实现对数据封装、信息隐藏及代码重用的扩展方式,而另一种方式就是类的继承。
本文主要讨论类的结构。

以绘图为例,我们来看关于几何图形的简单例子。
几何图形包含一系列的点,线,面等,而由一些几何公理可知点是其中最基本的构成元素。所以,我们以点作为设计的基本对象,由此来描述线和面对象。用来举例说明类结构的实现方式。

分析
假设点位于某一平面内,在确定了坐标系之后(即给定了原点和坐标轴及其正方向),我们便可以用坐标位置来描述这个点,如图:

直线是由两点来确定的,所以由起始和终止两点便可确定一条线段。如图:

面 ——(不妨举例)矩形,由两条平行对边构成,且相邻两边夹角为90度。绘图时发现,矩形可由对角的两点唯一确定。如图:

基于上述分析,我们开始设计:点类,线类,面类。线和面类中的数据成员包含点类,这就是类的结构,从而由简单类构成复杂类。
设计如下:

从另一个角度考虑,如果不采用类的结构设计方法,一个没有层次的类可能是这样的,以Line为例:

一个简单类,想法是:成员变量代表确定此线段的两个点的坐标(x1,y1),(x2,y2)。

对比两种设计,Line_Bad带来的结果是维护和更改不便,因为没有层次。首先需要维护的成员变量多,四个;若需要设置线段中点的颜色,Line_Bad则需要增加成员函数;若需要将这直线改成三维空间的,Line_Bad则需要增加成员变量,然后修改所有的成员函数。而用Line类则避免了这样的麻烦,设置颜色只需调用Point的方法就可以完成;而改成三维空间,只需增加Point的属性(z坐标)就可以了。而Line类本身几乎不用做任何改动(与PHP的绘图函数有关),省了不少维护修改的力气吧 :)。

现在绘图的基础有了,我们就来举一个实际的应用例子。

在许多统计中常需要用图例来显示各类统计结果,我们就用上面设计的绘图类来实现柱状图的显示。

分析:
柱状图主要由坐标轴和柱体构成。坐标轴可由Line类显示,柱体可由Rectangle类显示。

显示坐标轴如下:

function DrawAxes()
{
$vertspan=200;

$p1=new Point(10,$vertspan+2.5);
$p2=new Point(10,2.5);

$VerticalAxis=new Line($p1,$p2);
$VerticalAxis->Draw();

$p1=new Point(7.5,$vertspan);
$p2=new Point(370,$vertspan);

$HorizontalAxis=new Line($p1,$p2);
$HorizontalAxis->Draw();

}

显示柱体如下:
function Plot($arr_barTotal)
{
$vertspan=200;
//显示比例
$scaleHeight=190;
//确定柱状中最大值
$maxTotal=Max1(&$arr_barTotal);
//确定柱体个数
$total=count($arr_barTotal);

//循环显示柱状体
$dx=15;
$x=10+$dx;

for($i=0;$i<$total;$i++)
{
$rectHeight=($arr_barTotal[$i]/$maxTotal)*$scaleHeight;

$p1=new Point($x,$vertspan-$rectHeight);
$p2=new Point($x+$dx,$vertspan);

$CurrRect= new Rectangle($p1,$p2);
$CurrRect->Draw();

$x+=2.0*$dx;
}
}

主程序:
1) 确定显示数据。
2) 显示坐标轴。
3) 显示柱状体。

//main
$arr_barTotal=array('1','3','34','23','5','25','7'); //显示数据
DrawAxes(); //画坐标轴
Plot($arr_barTotal); //画柱状体

这样主程序框架就完成了:D
效果如下。

如需进一步美化工作,大家可自行添加基础显示类中相应的属性及相应的成员函数,这里就不多述了。

附:因为篇幅问题,没有附上源码。
本文中所有代码可在http://10.31.172.7/cgi-bin/cvsweb.cgi/kai/graph/中获得,并已在php4.0.2+Gd1.62环境下调试通过。

时间: 2024-12-02 08:50:55

PHP绘图对象结构设计与应用实例的相关文章

JavaScript通过prototype给对象定义属性用法实例

 这篇文章主要介绍了JavaScript通过prototype给对象定义属性用法,实例分析了prototype的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JavaScript通过prototype给对象定义属性的用法.分享给大家供大家参考.具体分析如下: 下面的JS代码定义了movie对象.在使用对象的过程中又通过prototype给对象添加了isComedy属性,调用的时候直接使用object.isComedy即可,非常方便. ? 1 2 3 4 5 6

JavaScript通过function定义对象并给对象添加toString()方法实例分析

 这篇文章主要介绍了JavaScript通过function定义对象并给对象添加toString()方法,实例分析了javascript中function定义对象及添加方法的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例分析了JavaScript通过function定义对象并给对象添加toString()方法.分享给大家供大家参考.具体分析如下: 下面的JS代码通过function定义了一个movie对象,在movie对象内定义了一个toString方法,toString

html的DOM中Event对象onblur事件用法实例

 这篇文章主要介绍了html的DOM中Event对象onblur事件用法,实例分析了onblur事件的使用范围与对应的javascript使用技巧,需要的朋友可以参考下     本文实例讲述了html的DOM中Event对象onblur事件用法.分享给大家供大家参考.具体分析如下: onblur 事件会在对象失去焦点时发生. 语法如下: 代码如下: onblur="SomeJavaScriptCode" SomeJavaScriptCode 必需.规定该事件发生时执行的 JavaScr

浅析php设计模式之数据对象映射模式_php实例

php中的设计模式中有很多的各种模式了,在这里我们来为各位介绍一个不常用的数据映射模式吧,希望文章能够帮助到各位. 数据映射模式使您能更好的组织你的应用程序与数据库进行交互. 数据映射模式将对象的属性与存储它们的表字段间的结合密度降低.数据映射模式的本质就是一个类,它映射或是翻译类的属性或是方法到数据库的相应字段,反之亦然. 数据映射的作用(工作)就在于能对双方所呈现出的信息的理解,并能对信息的存取进行控制,如根据存储在数据表中的信息 重建新的域对象,或是用域对象的信息来更新或删除数据表中的相关

JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)_基础知识

JavaScript fromCharCode 方法 fromCharCode 方法用于把一个或多个 Unicode 值转换为(大写)字符串,并返回该字符串.其语法如下: 复制代码 代码如下: String.fromCharCode( num1, num2, ... ) 参数说明: 参数 说明 num1/num2 必需.Unicode 编码值 提示:该方法是 String 的静态方法,它的语法应该是 String.fromCharCode(),而不适用于您自己创建的 String 对象. fro

C++之类和对象课后习题简单实例_C 语言

建立一个对象数组,内放5个学生的(学号,成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生的最高成绩者,并输出其学号. #include<iostream> using namespace std; class Student {public: Student(int=10,int=0); int number; int score; void display(); }; Student::Student(int num,int sco):number(num)

python 打印出所有的对象/模块的属性(实例代码)_python

实例如下: import sys def print_all(module_): modulelist = dir(module_) length = len(modulelist) for i in range(0,length,1): print getattr(module_,modulelist[i]) print_all(sys) 以上这篇python 打印出所有的对象/模块的属性(实例代码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心

js 声明数组和向数组中添加对象变量的简单实例_javascript技巧

数组有四种定义的方式 使用构造函数: var a = new Array(); var b = new Array(10); var c = new Array("first", "second", "third"); 或者数组直接量: var d = ["first", "second", "third"]; 扩展: function ObjStory(id,biaoti,author

一款简单的jquery json 对象发送服务器端接收实例

一款简单的jquery json 对象发送服务器端接收实例 模板是这样地 user.id=1; user.name="admin"; $.post("url",{user:user},function(data)//这里的user:user是不是这样写还是直接用{user} { },"json"); 下面来看一个实例 通过网页特效对象封装了数据 var mydata={};  mydata.name=maindata; //maindata是一个