【发布时间】:2020-07-17 05:24:31
【问题描述】:
我正在尝试在完成花瓣后旋转一朵花。 如何仅对花朵实现缓慢的连续旋转效果? 我进行了很多搜索,所有搜索都会导致每次清除框架并重绘。
下面是我试过的代码。
const canvas = document.getElementById("flower");
const ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var a = 0,n = 0,r = 0,c = 6;
var x = 0, y = 0;
var w = window.innerWidth, h = window.innerHeight;
var cx = w/2, cy = h/2, rot = 1;
//draw stem
ctx.beginPath();
ctx.moveTo(cx, h);
ctx.lineWidth = 10;
ctx.strokeStyle = "darkgreen";
ctx.quadraticCurveTo(cx+250, cy+100, cx, cy);
ctx.stroke();
ctx.lineWidth = 1;
//start rotating
const startRotate = () =>{
setInterval(function () {
ctx.save();
ctx.translate(cx, cy);
ctx.rotate(Math.PI / 180 * (rot += 5));
ctx.restore();
}, 100);
}
const startDrawing = () =>{
if(n < 50){ //draw bud
a = (n * 137.5)*(180/Math.PI);
r = c * Math.sqrt(n);
x = r * Math.cos(a*(180/Math.PI)) + cx;
y = r * Math.sin(a*(180/Math.PI)) + cy;
ctx.beginPath();
ctx.arc(x, y, 6, 0, 2 * Math.PI, true);
ctx.strokeStyle = "lime";
ctx.fillStyle = 'yellow';
ctx.fill();
ctx.stroke();
}else{ //draw petals
a = (n * 137.5)*(180/Math.PI);
r = c * Math.sqrt(n);
x = r * Math.cos(a*(180/Math.PI)) + cx;
y = r * Math.sin(a*(180/Math.PI)) + cy;
ctx.beginPath();
ctx.arc(x, y, 6, 0, 2 * Math.PI, true);
ctx.strokeStyle = "black";
ctx.fillStyle = 'hsl('+ a%256 +',100%,50%)';
ctx.fill();
ctx.stroke();
}
n++;
if(n < 300) requestAnimationFrame(startDrawing);
else startRotate();
}
startDrawing();
<canvas id="flower"></canvas>
<script src="main.js"></script>
谢谢
【问题讨论】:
标签: javascript html css canvas