论文部分内容阅读
本文可以学到
1 PHP函数的概念和基本用法
2 学会自己定义函数
3 了解神秘的递归函数
本文相关活动
本文中提到的万花规模型,它的算法曾在《电脑爱好者》1999年12期上刊登过。如果您找到了《电脑爱好者》1999年12期,还可以优先参加《电脑爱好者》15周年有奖活动,活动网址为http://bbs.cfan.com.cn/forum-181-1.html
网络大补贴
PHP程序设计的函数
http://docs.php.net/manual/zh/language.functions.php
PHP程序设计的函数分类列表
http://docs.php.net/manual/zh/extensions.php
本文相关源代码下载
http://work.newhua.com/cfan/200722/22php.rar
变幻莫测的万花规
今天,我先给大家看一个图片,如图1所示。看到这个图,很多人都会想起孩童时期的小玩具—万花规,一块薄板中间有个大的空圆,中间放一块小的圆板,小圆板上有可以插入笔尖的小孔,小圆板与大空圆间有细细的小齿相啮合。将圆珠笔尖插入小圆板的孔内,扭着笔杆绕着大空圆转动就可以画出变幻莫测的花样图案。现在,我们要让PHP变成“万花规”,不用亲自动手,它自己就能动态画出美丽的图案。
(1)
实战1:正弦曲线画出来
在第20期入门篇中,我们知道PHP可以在图片上写字。实际上,PHP不仅可以写字,还能画图。下面,就让它先帮我们画出正弦曲线。因为万花规画图使用的正是正弦曲线和余弦曲线,学会了画正弦曲线,就完成了万花规程序的大部分了。代码如下:
<?php
$im = imagecreatetruecolor(360, 200);
$color = "#000000";
$r = substr($color, 1, 2);$r = hexdec($r);
$g = substr($color, 3, 2);$g = hexdec($g);
$b = substr($color, 5, 2);$b = hexdec($b);
$color_black = imagecolorallocate($im, $r, $g, $b);
$color = "#FF0000";
$r = substr($color, 1, 2);$r = hexdec($r);
$g = substr($color, 3, 2);$g = hexdec($g);
$b = substr($color, 5, 2);$b = hexdec($b);
$color_red = imagecolorallocate($im, $r, $g, $b);
imagefill($im, 0, 0, $color_white);
for($i = 0; $i < 360; $i += 1){
$d = deg2rad($i);
$x = $i;
$y = 100 - sin($d) * 100 ;
imagesetpixel($im, $x, $y, $color_red);
}
header("Content-type:image/png");
imagepng($im);
imagedestroy($im);
?>
在PHP中,像imagecreatetru ecolor这样的字符串被称呼为函数,它们可以帮程序完成一件或多件事情。有了控制我们可以控制程序的流程,有了变量我们可以记录程序的运行数据,有了函数我们就可以让程序做具体的事情。PHP提供了种类丰富的函数,可以操作数据库、发送电子邮件,还可以处理图像、文本等,甚至可以生成Flash动画。
上面代码中,imagecreatetru ecolor函数用来制作一个空的画板$im。和数学中的函数类似,PHP中的大部分函数都可以传入一些数据,然后输出结果,这些传入的数据,就叫做函数的参数,而输出的结果,就叫做返回值。imagecreatetruecolor传入的参数是360和200,它表示制作的画板大小为宽360像素和高200像素。不同函数的参数是不同的,因为函数的功能是不同的,它们需要的参数也是有区别的,关于每个函数及参数的详细说明,在PHP手册中都详细列出了。
有了空的画板,就可以选用一些颜色来画画了。学过网页制作的朋友都知道,“#000000”和"#FF0000"是网页中的黑色和红色,#后面的数字每两位一组分别对应RGB值。随后,使用substr函数,来分别取得RGB的对应的字符串,通过hexdec函数把它们转换为十进制的数值,传入到imagecolorallocate函数,来取得可以在画板$im中可以使用的黑色$color_black。用相同的方法,又取得红色$color_red。然后,使用imagefill函数,把空画板$im底色涂成黑色。
画板底色准备好了,通过一个循环,就可以在画板上画出正弦曲线。这里用$i表示0到360角度,同时作为x轴坐标值,每一次画一个点。因为正弦函数接受的参数是弧度,就用deg2rad函数把角度转换为弧度,然后和数学里面一样,通过sin函数得到y轴的坐标值,再乘上100来放大正弦值。因为PHP作图时的y轴和数学里面的y轴正好相反,而且小于0的地方画不出来,所以要把y轴值取反,然后向下移动100个点。有了x轴和y轴的坐标值,告诉imagesetpixel这个函数,用红色$color_red,在画布$im画出一个点。循环一遍,PHP就画完了。 v
(2)
最后,用header函数告诉浏览器要输出图形了,用imagepng函数把画板$im的信息输出来,最后用imagedestroy清场。在浏览器上,你就可以看到正弦曲线了。
小提示
★PHP手册中有每个函数的详细说明,为了更好地使用函数,我建议大家先看看http://docs.php.net/manual/zh/about.prototypes.php,了解如何去阅读函数的定义。如果看到了一个函数,不知道具体定义是什么,你可以访问网址http://docs.php.net/加上函数名称来查找函数的定义,例如:http://docs.php.net/imagecreatetruecolor。
实战2:正弦余弦联合打造百变万花规
在实战1中,通过正弦函数得到对应的坐标值画出了正弦曲线,下面我们结合余弦函数来画出万花规的图案,代码如下:
<?php
function html2rgb($color)
{
$r = substr($color, 1, 2);$r = hexdec($r);
$g = substr($color, 3, 2);$g = hexdec($g);
$b = substr($color, 5, 2);$b = hexdec($b);
return array($r, $g, $b);
}
function imagecolor($im, $color)
{
$colors = html2rgb($color);
return imagecolorallocate($im, $colors[0], $colors[1], $colors[2]);
}
function kaleidoscope($im, $lR, $sR, $pR, $rD, $color)
{
$color_pen = imagecolor($im, $color);
for($i = 1; $i <= $rD;$i += 1){
$A = deg2rad($i);
$B = $lR / $sR * $A;
$x = ($lR - $sR) * cos($A) + $pR * cos($B - $A) + 150;
$y = ($lR - $sR) * sin($A) - $pR * sin($B - $A) + 150;
imagesetpixel($im, $x, $y, $color_pen);
}
}
$im = imagecreatetruecolor(300, 300);
$color_black = imagecolor($im, "#000000");
imagefill($im, 0, 0, $color_black);
kaleidoscope($im, 120, rand(25,35), 30, 3600, "#FF0000");
kaleidoscope($im, 120, rand(55,65), 40, 3600, "#00FF00");
header("Content-type:image/png");
imagepng($im);
imagedestroy($im);
?>
你可能看到现在的代码和实战1的代码,发生了很大的变化。实际上,它和实战1的代码所做的事情并没有太大的变化。看起来不同,是因为定义了自己的函数。在实战1中,每取得一次颜色,取色的代码就要写一次,如果要取得多种颜色,那取色的代码就要重复很多次了。PHP不仅提供了大量的函数,它也允许我们使用function来定义函数,把需要的代码放到一起就可以了,让程序自动帮我们做重复的事情了。
代码中定义了一个html2rgb函数,一旦传入一个网页格式的颜色值给$color,就从$color中取得RGB对应值,再通过一个数组把RGB返回。代码中还定义了imagecolor函数,传入网页格式的颜色,它会调用html2rgb函数得到RGB值,再调用imagecolorallocate函数返回画板中使用的颜色数据。而kaleidoscope这个函数,它根据传入的参数来画出对应的图案,其中就使用了正弦函数sin和余弦函数cos。
通过自定义的函数,我们的主要程序就会变得非常简洁了,制作一个宽300高300的空画板并涂黑,调用kaleidoscope函数用红色画一次图案,再以kaleidoscope函数用绿色画一次图案,最后显示出图案即可。因为使用了rand函数,它每次会随机取得不同的数值作为参数传递给kaleidoscope函数,所以刷新浏览器,画出的图案就发生变化,程序就成为了变幻莫测的万花规。
高手论道:神秘的递归
函数的调用有一种特殊的用法就是自己调用自己,可以将问题层层简化并使用精炼的代码来实现,这就是递归。以下就是一段求阶乘(n!)的代码:
<?php
function f($i)
{
if ($i <= 1){
return 1;
}
return $i*f($i-1);
}
echo f(3);
?>
在数学中,3!=3*2*1,而在上面的程序中,f(3)=3*f(3-1)=3*2*f(2-1)=3*2*1,正好与数学中阶乘的运算吻合。
递归是编程中一种很重要的算法,它让程序沿着设定的路径自己调用自己,达到一定的条件时再沿着走过的路径返回。大部分的递归都可以使用循环来实现,但是有部分难题使用递归才能很好地解决。编写递归程序需要有良好的逻辑思维能力,并且能够分析问题的本质去层层简化问题。有兴趣的读者可以尝试写出解决“汉诺塔”问题的递归程序。
1 PHP函数的概念和基本用法
2 学会自己定义函数
3 了解神秘的递归函数
本文相关活动
本文中提到的万花规模型,它的算法曾在《电脑爱好者》1999年12期上刊登过。如果您找到了《电脑爱好者》1999年12期,还可以优先参加《电脑爱好者》15周年有奖活动,活动网址为http://bbs.cfan.com.cn/forum-181-1.html
网络大补贴
PHP程序设计的函数
http://docs.php.net/manual/zh/language.functions.php
PHP程序设计的函数分类列表
http://docs.php.net/manual/zh/extensions.php
本文相关源代码下载
http://work.newhua.com/cfan/200722/22php.rar
变幻莫测的万花规
今天,我先给大家看一个图片,如图1所示。看到这个图,很多人都会想起孩童时期的小玩具—万花规,一块薄板中间有个大的空圆,中间放一块小的圆板,小圆板上有可以插入笔尖的小孔,小圆板与大空圆间有细细的小齿相啮合。将圆珠笔尖插入小圆板的孔内,扭着笔杆绕着大空圆转动就可以画出变幻莫测的花样图案。现在,我们要让PHP变成“万花规”,不用亲自动手,它自己就能动态画出美丽的图案。
(1)
实战1:正弦曲线画出来
在第20期入门篇中,我们知道PHP可以在图片上写字。实际上,PHP不仅可以写字,还能画图。下面,就让它先帮我们画出正弦曲线。因为万花规画图使用的正是正弦曲线和余弦曲线,学会了画正弦曲线,就完成了万花规程序的大部分了。代码如下:
<?php
$im = imagecreatetruecolor(360, 200);
$color = "#000000";
$r = substr($color, 1, 2);$r = hexdec($r);
$g = substr($color, 3, 2);$g = hexdec($g);
$b = substr($color, 5, 2);$b = hexdec($b);
$color_black = imagecolorallocate($im, $r, $g, $b);
$color = "#FF0000";
$r = substr($color, 1, 2);$r = hexdec($r);
$g = substr($color, 3, 2);$g = hexdec($g);
$b = substr($color, 5, 2);$b = hexdec($b);
$color_red = imagecolorallocate($im, $r, $g, $b);
imagefill($im, 0, 0, $color_white);
for($i = 0; $i < 360; $i += 1){
$d = deg2rad($i);
$x = $i;
$y = 100 - sin($d) * 100 ;
imagesetpixel($im, $x, $y, $color_red);
}
header("Content-type:image/png");
imagepng($im);
imagedestroy($im);
?>
在PHP中,像imagecreatetru ecolor这样的字符串被称呼为函数,它们可以帮程序完成一件或多件事情。有了控制我们可以控制程序的流程,有了变量我们可以记录程序的运行数据,有了函数我们就可以让程序做具体的事情。PHP提供了种类丰富的函数,可以操作数据库、发送电子邮件,还可以处理图像、文本等,甚至可以生成Flash动画。
上面代码中,imagecreatetru ecolor函数用来制作一个空的画板$im。和数学中的函数类似,PHP中的大部分函数都可以传入一些数据,然后输出结果,这些传入的数据,就叫做函数的参数,而输出的结果,就叫做返回值。imagecreatetruecolor传入的参数是360和200,它表示制作的画板大小为宽360像素和高200像素。不同函数的参数是不同的,因为函数的功能是不同的,它们需要的参数也是有区别的,关于每个函数及参数的详细说明,在PHP手册中都详细列出了。
有了空的画板,就可以选用一些颜色来画画了。学过网页制作的朋友都知道,“#000000”和"#FF0000"是网页中的黑色和红色,#后面的数字每两位一组分别对应RGB值。随后,使用substr函数,来分别取得RGB的对应的字符串,通过hexdec函数把它们转换为十进制的数值,传入到imagecolorallocate函数,来取得可以在画板$im中可以使用的黑色$color_black。用相同的方法,又取得红色$color_red。然后,使用imagefill函数,把空画板$im底色涂成黑色。
画板底色准备好了,通过一个循环,就可以在画板上画出正弦曲线。这里用$i表示0到360角度,同时作为x轴坐标值,每一次画一个点。因为正弦函数接受的参数是弧度,就用deg2rad函数把角度转换为弧度,然后和数学里面一样,通过sin函数得到y轴的坐标值,再乘上100来放大正弦值。因为PHP作图时的y轴和数学里面的y轴正好相反,而且小于0的地方画不出来,所以要把y轴值取反,然后向下移动100个点。有了x轴和y轴的坐标值,告诉imagesetpixel这个函数,用红色$color_red,在画布$im画出一个点。循环一遍,PHP就画完了。 v
(2)
最后,用header函数告诉浏览器要输出图形了,用imagepng函数把画板$im的信息输出来,最后用imagedestroy清场。在浏览器上,你就可以看到正弦曲线了。
小提示
★PHP手册中有每个函数的详细说明,为了更好地使用函数,我建议大家先看看http://docs.php.net/manual/zh/about.prototypes.php,了解如何去阅读函数的定义。如果看到了一个函数,不知道具体定义是什么,你可以访问网址http://docs.php.net/加上函数名称来查找函数的定义,例如:http://docs.php.net/imagecreatetruecolor。
实战2:正弦余弦联合打造百变万花规
在实战1中,通过正弦函数得到对应的坐标值画出了正弦曲线,下面我们结合余弦函数来画出万花规的图案,代码如下:
<?php
function html2rgb($color)
{
$r = substr($color, 1, 2);$r = hexdec($r);
$g = substr($color, 3, 2);$g = hexdec($g);
$b = substr($color, 5, 2);$b = hexdec($b);
return array($r, $g, $b);
}
function imagecolor($im, $color)
{
$colors = html2rgb($color);
return imagecolorallocate($im, $colors[0], $colors[1], $colors[2]);
}
function kaleidoscope($im, $lR, $sR, $pR, $rD, $color)
{
$color_pen = imagecolor($im, $color);
for($i = 1; $i <= $rD;$i += 1){
$A = deg2rad($i);
$B = $lR / $sR * $A;
$x = ($lR - $sR) * cos($A) + $pR * cos($B - $A) + 150;
$y = ($lR - $sR) * sin($A) - $pR * sin($B - $A) + 150;
imagesetpixel($im, $x, $y, $color_pen);
}
}
$im = imagecreatetruecolor(300, 300);
$color_black = imagecolor($im, "#000000");
imagefill($im, 0, 0, $color_black);
kaleidoscope($im, 120, rand(25,35), 30, 3600, "#FF0000");
kaleidoscope($im, 120, rand(55,65), 40, 3600, "#00FF00");
header("Content-type:image/png");
imagepng($im);
imagedestroy($im);
?>
你可能看到现在的代码和实战1的代码,发生了很大的变化。实际上,它和实战1的代码所做的事情并没有太大的变化。看起来不同,是因为定义了自己的函数。在实战1中,每取得一次颜色,取色的代码就要写一次,如果要取得多种颜色,那取色的代码就要重复很多次了。PHP不仅提供了大量的函数,它也允许我们使用function来定义函数,把需要的代码放到一起就可以了,让程序自动帮我们做重复的事情了。
代码中定义了一个html2rgb函数,一旦传入一个网页格式的颜色值给$color,就从$color中取得RGB对应值,再通过一个数组把RGB返回。代码中还定义了imagecolor函数,传入网页格式的颜色,它会调用html2rgb函数得到RGB值,再调用imagecolorallocate函数返回画板中使用的颜色数据。而kaleidoscope这个函数,它根据传入的参数来画出对应的图案,其中就使用了正弦函数sin和余弦函数cos。
通过自定义的函数,我们的主要程序就会变得非常简洁了,制作一个宽300高300的空画板并涂黑,调用kaleidoscope函数用红色画一次图案,再以kaleidoscope函数用绿色画一次图案,最后显示出图案即可。因为使用了rand函数,它每次会随机取得不同的数值作为参数传递给kaleidoscope函数,所以刷新浏览器,画出的图案就发生变化,程序就成为了变幻莫测的万花规。
高手论道:神秘的递归
函数的调用有一种特殊的用法就是自己调用自己,可以将问题层层简化并使用精炼的代码来实现,这就是递归。以下就是一段求阶乘(n!)的代码:
<?php
function f($i)
{
if ($i <= 1){
return 1;
}
return $i*f($i-1);
}
echo f(3);
?>
在数学中,3!=3*2*1,而在上面的程序中,f(3)=3*f(3-1)=3*2*f(2-1)=3*2*1,正好与数学中阶乘的运算吻合。
递归是编程中一种很重要的算法,它让程序沿着设定的路径自己调用自己,达到一定的条件时再沿着走过的路径返回。大部分的递归都可以使用循环来实现,但是有部分难题使用递归才能很好地解决。编写递归程序需要有良好的逻辑思维能力,并且能够分析问题的本质去层层简化问题。有兴趣的读者可以尝试写出解决“汉诺塔”问题的递归程序。