php绘制时钟刻度,php绘制时钟

这篇博客介绍了如何利用PHP的GD库来绘制时钟,通过定义平面点集的旋转和平移变换函数,实现时针和分针在不同时间位置的精确绘制。作者分享了具体的代码实现,包括绘制时针、分针以及表盘刻度线的过程,并给出了10点10分时钟的示例效果。
摘要由CSDN通过智能技术生成

今天用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);

}

最后上效果图

0818b9ca8b590ca3270a3433284dd417.png

参考文献:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值