利用PHP GD库可生成各种数学曲线图形。本文展示两种绘制心形的方法:多边形拟合法与极坐标像素绘制法,均输出GIF图片。
笛卡儿心脏线参数方程:
x = 2*sin(t) - sin(2t)
y = 2*cos(t) - cos(2t)
<?php
// 1. 计算360个点坐标
$str = [];
for ($t = 0; $t < 360; $t++) {
$rad = deg2rad($t);
$y = 2*cos($rad) - cos(2*$rad);
$x = 2*sin($rad) - sin(2*$rad);
$x += 3; $y += 3; // 平移至正坐标
$x *= 70; $y *= 70; // 缩放
$x = round($x); $y = round($y);
$str[] = $x;
$y = $y + 2*(180 - $y); // Y轴翻转(图像坐标系原点左上)
$str[] = $y;
}
// 2. 创建画布并绘制
$im = imagecreate(400, 400);
$black = imagecolorallocate($im, 0, 0, 0);
$red = imagecolorallocate($im, 255, 0, 0);
imagepolygon($im, $str, 360, $red); // 绘制多边形
imagestring($im, 5, 190, 190, "love", $red); // 写文字
// 3. 输出
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);
?>
效果:平滑的红色心形轮廓,中心显示"love"文字。
方程:r = (π/50)*i * (1 - sin(π/50*j)) * 40
x = r * cos(π/50*j) * sin(π/50*i) + width/2
y = -r * sin(π/50*j) + height/6
<?php
$width = 600; $height = 650;
header("Content-Type: image/gif");
$img = imagecreate($width, $height);
$bg_color = imagecolorallocate($img, 0, 0, 0);
$red = imagecolorallocate($img, 255, 0, 0);
for ($i = 0; $i <= 100; $i++) {
for ($j = 0; $j <= 100; $j++) {
$r = M_PI/50 * $i * (1 - sin(M_PI/50 * $j)) * 40;
$x = $r * cos(M_PI/50 * $j) * sin(M_PI/50 * $i) + $width/2;
$y = -$r * sin(M_PI/50 * $j) + $height/6;
imagesetpixel($img, $x, $y, $red);
}
}
imagegif($img);
imagedestroy($img);
?>
效果:由密集像素点组成的立体心形,视觉更细腻。
| 函数 | 用途 |
|---|---|
| imagecreate(w,h) | 创建基于调色板的画布 |
| imagecolorallocate(im,r,g,b) | 分配颜色,返回标识符 |
| imagepolygon(im,points,num,color) | 绘制多边形,points为[x1,y1,x2,y2...] |
| imagesetpixel(im,x,y,color) | 绘制单个像素 |
| imagestring(im,font,x,y,str,color) | 绘制字符串 |
| imagegif(im) | 输出GIF格式 |
| imagedestroy(im) | 释放资源 |
imagecreatetruecolor支持真彩色、Alpha透明imagefilter添加模糊、浮雕等效果imagepng)支持无损压缩