今天用php写了点东西,其中一个就是画时钟,记下来分享下。
php的gd库里用来绘图还是很不错的。绘制时针分针使用imagefilledpolygon(),绘制表盘刻度线用imageline(),关键在于确定那些点的位置。
没仔细查资料,对php也不太了解,不知道有没有矩阵变换之类的东西,还是自己写吧。
先定义一个平面点集的旋转与平移变换函数,传入参数为大小是偶数的array,奇数位为x,偶数位为y,返回变换后的array。这个在绘制时针分针和表盘刻度的时候很有用。
function transform_points_2d($points, $offset, $angle)
{
$result = array();
$size = sizeof($points);
for ($i=0; $i
$result[$i] = $offset[0] + $points[$i] * cos($angle) + $points[$i+1] * sin($angle);
$result[$i+1] = $offset[1] -$points[$i] * sin($angle) + $points[$i+1] * cos($angle);
}
//print_r($result);
return $result;
}
假设时针分针都是三角形,考虑简单的情况,都指向上方。然后用上面的函数进行变换就可以得到任意位置的顶点集了。
$hour_points0 = array(
7, 8,
-7, 8,
0, -40
);
$minute_points0 = array(
7, 8,
-7, 8,
0, -70
);
就取10点10分吧,广告里都用这个。时针分针分别逆时针和顺时针转60度,并把针的中心平移到图片中心。
$a_h = deg2rad(60); //angle_hour
$a_m = deg2rad(-60); //angle_minute
$center_x = $windowwidth / 2;
$center_y = $windowheight / 2;
$hour_points = transform_points_2d($hour_points0, array($center_x, $center_y), $a_h);
$minute_points = transform_points_2d($minute_points0, array($center_x, $center_y), $a_m);
然后就是创建图片了,这个简单,略。
接下来开始绘制针,用gd库里的填充多边形函数
imagefilledpolygon($image, $hour_points, 3, $color_hour);
imagefilledpolygon($image, $minute_points, 3, $color_minute);
绘制整点的刻度线。道理一样,取一个最简单的刻度线,然后进行变换
$minute_line0 = array(
88, 0,
96, 0
);
$minute_line = $minute_line0;
for ($i=0; $i<12; $i++) {
$minute_line = transform_points_2d($minute_line0, array($center_x, $center_y), deg2rad(30 * $i));
imageline($image, $minute_line[0], $minute_line[1], $minute_line[2], $minute_line[3], $color_hour);
}
绘制其他48条刻度线,方法同上
$minute_line0 = array(
92, 0,
96, 0
);
for ($i=0; $i<60; $i++) {
if ($i % 5 == 0)
continue;
$minute_line = transform_points_2d($minute_line0, array($center_x, $center_y), deg2rad(6 * $i));
imageline($image, $minute_line[0], $minute_line[1], $minute_line[2], $minute_line[3], $color_minute);
}
最后上效果图
参考文献: