贝塞尔曲线 蓝天白云
2020-07-19 本文已影响0人
Ray_afab
WX20200719-131041@2x.png
有点繁杂 必须发个文章记录下
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>XP壁纸</title>
<style>
#canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
</style>
</head>
<body>
<div id="canvas-warp">
<canvas id="canvas">
你的浏览器居然不支持Canvas?!赶快换一个吧!!
</canvas>
</div>
<script>
window.onload = function(){
var canvas = document.getElementById("canvas");
canvas.width = 800;
canvas.height = 600;
var context = canvas.getContext("2d");
context.fillStyle = "#FFF";
context.fillRect(0,0,800,600);
drawPrairie(context);
drawSky(context);
for(var i=0; i <5; i++){
var x0 = 500 * Math.random() + 50;
var y0 = 200 * Math.random() + 50;
var c0 = 100 * Math.random() + 50;
drawCloud(context, x0, y0, c0);
}
};
function drawSky(cxt){
cxt.save();
cxt.beginPath();
cxt.moveTo(0, 420);
cxt.bezierCurveTo(250, 300, 350, 550, 800, 390);
cxt.lineTo(800,0);
cxt.lineTo(0,0);
cxt.closePath();
var lineStyle = cxt.createRadialGradient(400, 0, 50, 400, 0, 200);
lineStyle.addColorStop(0, "#42A9AA");
lineStyle.addColorStop(1, "#2491AA");
cxt.fillStyle = lineStyle;
cxt.fill();
cxt.restore();
}
function drawPrairie(cxt){
cxt.save();
cxt.beginPath();
cxt.moveTo(0, 400);
cxt.bezierCurveTo(250, 300, 350, 550, 800, 400);
cxt.lineTo(800,600);
cxt.lineTo(0,600);
cxt.closePath();
var lineStyle = cxt.createLinearGradient(0, 600, 600, 0);
lineStyle.addColorStop(0, "#00AA58");
lineStyle.addColorStop(0.3, "#63AA7B");
lineStyle.addColorStop(1, "#04AA00");
cxt.fillStyle = lineStyle;
cxt.fill();
cxt.restore();
}
/*渲染单个云朵
context: canvas.getContext("2d")对象
cx: 云朵X轴位置
cy: 云朵Y轴位置
cw: 云朵宽度
*/
function drawCloud(cxt, cx, cy, cw) {
//云朵移动范围即画布宽度
var maxWidth = 800;
//如果超过边界从头开始绘制
cx = cx % maxWidth;
//云朵高度为宽度的60%
var ch = cw * 0.6;
//开始绘制云朵
cxt.beginPath();
cxt.fillStyle = "white";
//创建渐变
var grd = cxt.createLinearGradient(0, 0, 0, cy);
grd.addColorStop(0, 'rgba(255,255,255,0.8)');
grd.addColorStop(1, 'rgba(255,255,255,0.5)');
cxt.fillStyle = grd;
//在不同位置创建5个圆拼接成云朵现状
cxt.arc(cx, cy, cw * 0.19, 0, 60, false);
cxt.arc(cx + cw * 0.08, cy - ch * 0.3, cw * 0.11, 0, 360, false);
cxt.arc(cx + cw * 0.3, cy - ch * 0.25, cw * 0.25, 0, 60, false);
cxt.arc(cx + cw * 0.6, cy, cw * 0.21, 0, 60, false);
cxt.arc(cx + cw * 0.3, cy - ch * 0.1, cw * 0.28, 0, 60, false);
cxt.closePath();
cxt.fill();
}
</script>
</body>
</html>