如何在画布中同时旋转两个矩形
How to rotate 2 rectangles in a canvas at the same time?
我知道我可以使用"translate-rate-translate-back-fillrect"过程来旋转一个矩形。
但是,如果我想同时旋转它们,并有一个时间间隔()使它们每秒自动旋转,该怎么办?
每次尝试绘制时,我都试图保存和恢复,但都没有成功。
你似乎走在了正确的轨道上
- 保存
- 平移(rectX,rectY)
- 旋转
- fillRect(-rerectWidth/2,-rerectHeight/2,rectWidth,rectHeight)//绘制带有中心旋转的矩形
- 恢复
对于多个矩形
如果你像这样定义一些矩形对象:
var rects=[];
rects.push({x:50,y:50,w:50,h:35,color:'green',angle:0});
rects.push({x:150,y:120,w:30,h:20,color:'blue',angle:0});
然后你可以把它们放在一个动画帧中,如下所示:
requestAnimationFrame(animate);
function animate(time){
// call for another loop in the animation
requestAnimationFrame(animate);
// clear canvas and redraw all rects
ctx.clearRect(0,0,cw,ch);
for(var i=0;i<rects.length;i++){
// draw this rect at its specified angle
var rect=rects[i];
ctx.save();
ctx.translate(rect.x+rect.w/2,rect.y+rect.h/2);
ctx.rotate(rect.angle);
ctx.fillStyle=rect.color;
ctx.fillRect(-rect.w/2,-rect.h/2,rect.w,rect.h);
ctx.restore();
// increase this rect's angle for next time
rect.angle+=(Math.PI*2)/60;
}
}
requestAnimationFrame
循环速度约为60fps,因此如果将每个循环中矩形的角度增加(Math.PI*2)/60,则将使矩形每秒旋转一整圈。
示例代码和演示:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var rects=[];
rects.push({x:50,y:50,w:50,h:35,color:'green',angle:0});
rects.push({x:150,y:120,w:30,h:20,color:'blue',angle:0});
requestAnimationFrame(animate);
function animate(time){
// call for another loop in the animation
requestAnimationFrame(animate);
// clear canvas and redraw all rects
ctx.clearRect(0,0,cw,ch);
for(var i=0;i<rects.length;i++){
// draw this rect at its specified angle
var rect=rects[i];
ctx.save();
ctx.translate(rect.x+rect.w/2,rect.y+rect.h/2);
ctx.rotate(rect.angle);
ctx.fillStyle=rect.color;
ctx.fillRect(-rect.w/2,-rect.h/2,rect.w,rect.h);
// orientation symbol
ctx.fillStyle='red';
ctx.fillRect(-rect.w/2,-rect.h/2,5,5)
ctx.restore();
// increase this rect's angle for next time
rect.angle+=(Math.PI*2)/60;
}
}
function drawRect(rect){
ctx.save();
ctx.translate(rect.x+rect.w/2,rect.y+rect.h/2);
ctx.rotate(rect.angle);
ctx.fillStyle=rect.color;
ctx.fillRect(-rect.w/2,-rect.h/2,rect.w,rect.h);
ctx.restore();
rect.angle+=deltaAngle;
}
body{ background-color: ivory; }
canvas{border:1px solid red;}
<canvas id="canvas" width=300 height=300></canvas>
相关文章:
- 用两个手指旋转谷歌地图javascript中的地图
- 选择最短的旋转来排列两个图像
- 使用关键帧图像旋转器时,图像不会在两个块之间同步协调
- 围绕其中心旋转两个画布
- 在图像后面旋转两个图像
- 为什么两个潜水器都不旋转
- 在两个轴上旋转THREE.js中的三维矢量
- 如何在画布中同时旋转两个矩形
- 如何在同一时间和同一鼠标事件上旋转两个不同的X3D场景
- 如何在两个方向上旋转图像90
- 如何在同一页面中使用两个不同版本的猫头鹰旋转木马
- 两个在圆圈内旋转的箭头
- 猫头鹰旋转木马,一次滚动两个项目
- jQuery文本旋转/填充适用于单个单词,但不适用于两个单词
- 在相反的方向上旋转两个图像
- 在一个页面上显示两个旋转木马
- 计算两个旋转矩形/多边形的碰撞和相交面积
- JQuery在悬停(3D)时前后旋转两个边
- 基本的li旋转器显示两个而不是一个
- 我如何旋转两个图像[在同一画布上]在相反的方向