演示地址: http://sipeng.net/yanshi/stars/snows.html
//封装绘制五角星的函数
function drawStar(cxt, r, R, x, y, rot) {
/*
cxt: 绘制的上下文环境
r: 内圆的半径
R: 外圆的半径
x: 五角星的中心点距离X轴的坐标位置
y: 五角星的中心点距离Y轴的坐标位置
rot: 五角星的旋转角度
*/
cxt.beginPath();
for (var i = 0; i < 5; i++) {
cxt.lineTo(Math.cos((18 + i * 72 - rot) / 180 * Math.PI) * R + x,
-Math.sin((18 + i * 72 - rot) / 180 * Math.PI) * R + y);
cxt.lineTo(Math.cos((54 + i * 72 - rot) / 180 * Math.PI) * r + x,
-Math.sin((54 + i * 72 - rot) / 180 * Math.PI) * r + y);
}
cxt.closePath();
cxt.lineWidth = 3;//星星边框
cxt.strokeStyle = randomColor();//星星边框颜色
cxt.fillStyle = "#ffff40";//星星填充颜色
cxt.stroke();//绘制边框
cxt.fill();//填充颜色
}
//星星自由落体函数
var angle = 0;
function xxposi() {
angle += 0.01;
for (var i = 0; i < snowNum; i++) {
var p = initPosi[i];
//记住两个公式:Math.sin(弧度)返回是一个0 1 -1 的数字
//math.cos(1 0 -1 ) 自由体,
p.y += Math.cos(angle + p.d) + 1 + p.r * 0.625;
p.x += Math.sin(angle) * 8;
//如果雪花到了边界,进行边界处理
if (p.x > winWid + 5 || p.x < -5 || p.y > winHei) {
if (i % 4 > 0) {
initPosi[i] = { x: Math.random() * winWid, y: -10, r: p.r, d: p.d };
} else {
//控制方向
if (Math.sin(angle) > 0) {
initPosi[i] = { x: -5, y: Math.random() * winHei, r: p.r, d: p.d };
} else {
initPosi[i] = { x: winWid + 5, y: Math.random() * winHei, r: p.r, d: p.d };
}
}
}
}
}