Canvas特效 旋转+轨迹详解

这篇博客详细介绍了在Canvas中实现旋转和轨迹的方法。对于旋转,通过三角函数的知识改变点的位置。轨迹的实现则利用了帧之间的图像淡化,通过绘制线条连接小球的上一帧与当前帧的位置,并通过调整步长来优化轨迹的平滑度。完整源码可在文中获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
这一节我来给大家介绍canvas的旋转和轨迹

旋转

在这里插入图片描述

学过三角函数的都知道在圆上的点 x随着cosθ改变,y随着sinθ改变

x = cosθ, y = sinθ
范围是[-1,1]
如果我们想让一个点旋转的半径增大,那么只需要将其范围扩大即可
x = cosθ * s, y = sinθ *s

x = Math.cos(this.theta) * this.distance;
y = Math.sin(this.theta) * this.distance;

轨迹

在这里插入图片描述

在这里插入图片描述

如何向这样绘制一个轨迹呢?

如果你学过剪辑的话,就一定知道所谓重影分身不过是将上一帧的图像淡化保留
同样,我们只需要给小球在进行下一帧移动的时候加上一层“膜”

 ctx.fillStyle = 'rgba(255,255,255,0.1)';
 ctx.fillRect(0,0,canvas.width,canvas.height);

给每次小球要更新之前,让上一帧的小球变淡,这样就可以描绘出一条轨迹

所以我们绘制多个小球让其旋转,每个小球的颜色,半径,起始位置,与旋转点的距离都应不同

在这里插入图片描述
我们可以看出在移动鼠标的时候,小球下一帧是突然就刷出来
而不是演示中平滑的一条轨迹
所以我们不能直接用小球来绘制轨迹,应该采用线条
将小球填充色清除,记录小球上一帧的坐标,
将小球上一帧与当前帧两点连线

//ctx.fillStyle = this.color;
//ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
//ctx.fill();
ctx.strokeStyle = this.color;
ctx.lineWidth = this.radius;
ctx.moveTo(lastPosition.x,lastPosition.y);
ctx.lineTo(this.x,this.y);
ctx.stroke();

在这里插入图片描述
改为两点连线以后啊,我们发现移动鼠标的时候,线会扭曲,变得很丑

要改进很简单,我们需要引入一个步长的概念

假设你在正常情况下10s内走10米需要10步
现在让你在10s内走20步,你就需要步子迈小,步伐加快
同样,我们让小球从点A运动到另一个点B时 1单位时间打印一次
现在我们1单位时间打印n次,n越大 那么小球的轨迹就越多
所以
我们记录上一帧鼠标坐标,始终打印上一帧鼠标坐标
并且上一帧鼠标坐标更新机制为 (a+b)/ n

 // 拖拽效果
this.lastMouse.x += (mouse.x - this.lastMouse.x) / dragSpeed;
this.lastMouse.y += (mouse.y - this.lastMouse.y) / dragSpeed
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值