今天在给同事演示PHP输出各种三角矩形等奇怪图形的时候,突然有个同事发难说咱们画一个菱形吧!于是我们便在三角形矩形的基础上进行思考。它比单纯的输出一个直线型的图形要复杂一些,在数学上稍微有些难度。
首先矩形就不必多说了,是由嵌套的循环输出得到的,代码如下
for($i=1;$i<=5;$i++){
for($k=1;$k<=5;$k++){
echo '<span>*</span>';
}
echo '<br/>';
}
原理是执行两个循环,外层循环完成每行的输出和换行,内层循环完成行内每个元素的输出。
下面输出三角形我们可以这样(这里为避免不同浏览器对空格解析的长短不一,我使用了不同颜色来区分背景和图案)
for($i=1;$i<=5;$i++){
for($k=1;$k<=5;$k++){
if($k>$i){
echo '<span>*</span>';
}else{
echo '<span style="color:#f00">*</span>';
}
}
echo '<br/>';
}
好了我们先简单说一下三角形的原理,我们可以画一个直角三角形,这样呢我们可以利用上矩形的两条边,于是问题就变成了我们需要一条斜线来分割这个矩形,也就是给这个矩形斜着来一刀。数学上我们要画一条线呢,需要知道这一条线上点的规律,这条矩形对角线呢,也有规律,那就是在这条线上的每个点的$i和$k是相同的,那好办了,我们判断一下每个元素,如果他属于这条线的上侧,那我们就输出黑色,如果他属于下侧或属于这跳线,那我们输出红色的。这样三角形就画好了,同理这个三角形的位置和角度都是可以变得,这大家可以自行探索。就不一一列举了。
接下来问题来了,如果画一个菱形呢,我们画三角形的时候通过分割矩形轻松得到,但菱形如果通过切割矩形的话我们要切四次,很麻烦,在这里我的方案比较简单。代码如下
for($i=-2;$i<=2;$i++){//$i = (-2) (-1) (0) (1) (2)
for($j=1;$j<=5;$j++){//$k = (1)(2)(3)(4)(5)
if ($j>abs($i) && $j<=(5-abs($i))){//能通过if的数 (3) (234) (12345) (234) (3)
echo '<span style="color:#ff0000">*</span>';
}else{
echo '<span>*</span>';
}
}
echo '<br/>';
}
在这里我使用了绝对值。因为在绘画一个菱形的时候,想用一个嵌套循环实现的话,难度在于刚才我们分割的线是固定斜率的,而我们画菱形的时候斜率在图形中点变化了。这其实可以通过两个嵌套循环来实现,第一个嵌套循环输出三角形,第二个嵌套循环输出倒三角形,两个三角形拼成一个菱形。但我灵光一闪,觉得菱形斜率的变化和我们自然数的绝对值的变化是一样的。于是我们让外层循环从-2到2,内层循环判断的时候利用PHP的abs函数取外层循环变量的绝对值。再把二者进行比对。这样就完成了菱形的生成。但其他方法也是有的,比如翻转,拼接,切割等其它方法。下次有时间我将输出图形总结一下发出来。