变化莫测万花规

来源 :电脑爱好者 | 被引量 : 0次 | 上传用户:flyingmomo1986
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  本文可以学到
  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,正好与数学中阶乘的运算吻合。
  递归是编程中一种很重要的算法,它让程序沿着设定的路径自己调用自己,达到一定的条件时再沿着走过的路径返回。大部分的递归都可以使用循环来实现,但是有部分难题使用递归才能很好地解决。编写递归程序需要有良好的逻辑思维能力,并且能够分析问题的本质去层层简化问题。有兴趣的读者可以尝试写出解决“汉诺塔”问题的递归程序。
其他文献
圣诞节、元旦将至,年末大片接踵而来。正如大家所知道的,很多大片在上映后网上就很快可以下载。你的掌上播放器能直接播放吗?当然要看支持哪种格式啦。现在虽然各种格式的视频文件在网络上都不少,不过大多数是RMVB格式,如果每段影片都要通过转换才能播放自然很不方便。好在现在市面上已经有好多支持RMVB直接播放的“全能”MP4了。这次我们就来选购一款直接支持RMVB格式的MP4播放器。    “全能播放”MP
期刊
平时我们拍照的时候,遇到太阳光或者灯光特别强烈,所拍的主体物若处于背光位置,或者遇到拍摄环境比较昏暗,而闪光灯无法起作用时,拍出来的照片就会显得黑黑的,缺乏层次。不过只要用Photoshop的“暗调/高光”工具,就能够轻松解决这些问题。    1用Photoshop打开要编辑的照片,在菜单中选择“图像-调整-暗调/高光”工具;    2通过滑竿调节暗调和高光的数量,在预览图中我们就能看到图像变得明
期刊
摘 要:在国家教育改革不断深化改革与发展的当前,对幼儿阶段的教育重视程度也越来越高。但不可忽视的是,我国乡镇中心幼儿园的教学仍存在诸多问题,主要表现在与城市幼儿园相比之下的经济基础、环境因素、教师队伍等多方面的差异,其中教师队伍的管理问题直接关乎乡镇中心幼儿园的教学质量,对于幼儿的身心健康发展起着至关重要的影响作用。因此,基于当前现状,分析乡镇中心幼儿园教师队伍管理出现的主要问题,有效加强与提升乡
期刊
摘 要:本文介绍了高三地理课堂“201010”模式内涵,并以案例分析了“201010”模式一、二轮复习具体实践过程;分析实施“201010”课堂模式后的问题并提出“201010”模式改进措施。  关键词:高三地理课堂;小组合作学习;“201010”;教学实践  1 “201010”模式的内涵  “201010”教学模式具体内涵是指在课堂40分钟内,将课堂时间大体划分为三部分,教师讲授和总结知识考点
期刊
摘 要:随着我国国家对小学教育事业的重视程度的增加,我国的小学教育质量与水平也在不断的进步与发展,越来越多的新方法、新教学措施被应用到小学教学过程中,很大程度上激发了小学生的学习积极性,同时丰富了小学生的学习生活。在小学数学教学中,情境教学的方法就是一种新的、非常有效的教学方式,但是在使用这种方法的过程中许多教育工作者仍然存在问题与使用不当的情况,这就导致教学方法形式化,没有发挥出情境教学在数学教
期刊
说起“影音盒子”,大家可能对这个名字倍感陌生。其实,这里说的影音盒子,指的是一类具有特殊功能的硬盘或光驱盒子,它们能够直接播放硬盘或光驱中的影音文件。它们既不是专门的硬盘播放器,也不是功能单一的硬盘盒,而是为了适应DIY人群的需要,以硬盘盒的面目出现的。“    边缘产品,“影音盒子”的前世今生    “影音盒子”其实并不是什么高科技产品,很早就已经出现了,但是在国内市场上一直是不温不火。比较典型
期刊
2007北京通讯展三看点  ■本刊记者/于峰    “我们更加关心本次通讯展给老百姓带了哪些新东西,以及他们在今后如何影响我们的生活。毕竟通讯已经与我们每个人息息相关”    10月23日至27日,2007年(第16届)中国国际通信设备技术展览会在北京国际展览中心举行。此次展会规模空前,使用了国际展览中心8个展馆的11个展厅以及部分室外场地,总展出面积超过50000平方米。国内外知名厂商、运营商悉
期刊
年末将至,两大显卡阵营都要发布自己的重要产品:NVIDIA G92核心的8800GT显卡、ATi RV670核心的HD3870/3850,这将是下一代显卡的最主流产品。既然下一代将至,现有的部分显卡必然会被淘汰,那样的话对消费者来说是十分麻烦的……    DX10是未来唯一选择    下半年开始,DX10相关游戏已逐步推出。对新显卡的选择,DX9的产品已经不再适合。例如曾大红大紫的NVIDIA G
期刊
随着各种智能手机、PDA、MP3/MP4以及数码相机等掌上设备的性能越来越强,对存储卡的要求也越来越高。昔日最大2GB容量的SD卡经常爆满,缓慢的读写速度也开始跟不上影音娱乐的需求。金士顿最近针对这部分市场推出了下一代MiniSDHC和MicroSDHC存储卡,为未来的掌上移动存储开了个好头。    SDHC=高速+大容量的SD卡    所谓SDHC,实际上就是SD High Capacity(大
期刊
摘 要:临床医学专业研究生的培养是为我国提供临床医学高级科研人才的重要手段。随着我国医疗事业的不断发展和提高,我国医学研究型人才的需求量和水平要求都大大提升,需要临床医学专业的学生在独立完成临床工作的前提下,通过分析和整理临床数据和结果,对科研过程进行更深入的探索,進一步促进我国临床医疗工作的进步,从而实现我国医疗水平的提高和发展。相比传统的医疗模式,社会群众对临床医学专业研究生的教育教学产生了更
期刊