博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用canvas绘制dribble风格水波浪
阅读量:6688 次
发布时间:2019-06-25

本文共 1173 字,大约阅读时间需要 3 分钟。

先放一张简单的效果图

?原理

sin函数估计大家都会,用到的公式为amplitude * sin(frequency * x) + displacement

我们可以通过改变函数的振幅和频率来达到控制曲线动画。

?开始

定义一个Wave

```

class Wave {

  constructor(color) {
    this.t = 0;
    this.step = w / 300;
    this.color = color;
    this.speed = 0.1;
    this.a = 30;
    this.f = 20;
    this.d = 20;
  }
  caculate(x) {
    this.amplitude = this.a;
    this.frequency = this.f * (1 / w);
    this.displacement = this.d;
    // A*sin(Bx + C) + D
    return (
      this.amplitude * Math.sin(this.frequency * x + this.t) + this.displacement
    );
  }
  render() {
    this.t += this.speed;
    ctx.save();
    ctx.beginPath();
    ctx.translate(0, h / 2);
    ctx.lineWidth = 1;
    ctx.moveTo(0, 0);
    for (let i = this.step; i < w; i += this.step) {
      ctx.lineTo(i, this.caculate(i));
    }
    ctx.lineTo(w, this.caculate(w));
    ctx.lineTo(w, h);
    ctx.lineTo(0, h);
    ctx.fillStyle = this.color;
    ctx.fill();
    ctx.closePath();
    ctx.restore();
  }
}
```

这里面没有什么特别的魔法,很容易就能够画出一条波浪。

但是稍微有点感觉的人就会发现整个动画特别僵硬,就像是一张图片在做平移一样。作为一个有理想的人怎么可以忍。

?改进

很容易发现让人觉得僵硬的原因是波浪的波峰一直是这么高,如果能让波峰的大小也随着改动的画就OK了。

添加一点小小的细节,定义一个this.k的值,然后修改

this.amplitude = this.a;

改为

this.amplitude = this.a * sin(((this.t / this.k) * this.k) / 5);

看到这里你可能会好奇这迷一样的函数怎么来的,我们的目标是让振幅也跟着变动,所以就乘以了一个sin函数来让振幅也可以高高低低变化。

?最后

案例简单实现

参考链接

转载地址:http://akeao.baihongyu.com/

你可能感兴趣的文章
Windows下swoole扩展的编译安装部署
查看>>
你只是假装很努力
查看>>
ipc 进程间通讯的AIDL
查看>>
C语言版——点亮LED灯,深入到栈
查看>>
安装setuptools和pip
查看>>
C#使用BeginInvoke和EndInvoke异步下载和获取返回结果
查看>>
MII_GMII_RGMII_RMII_SMII_SSMII_TBI_RTBI
查看>>
ceph-RGW Jewel版新概念
查看>>
001-对象——基础知识
查看>>
Redis 高可用集群
查看>>
jQuery图片tab栏切换
查看>>
2.C#知识点:I/O
查看>>
ios 集成react native
查看>>
两个自定义对象List列表取交集(intersection)
查看>>
使用git克隆指定分支的代码
查看>>
gradle 项目构建以及发布maven 私服&& docker 私服构建发布
查看>>
struts2与spring集成时,关于class属性及成员bean自动注入的问题
查看>>
django数据库操作-增删改查-多对多关系以及一对多(外键)关系
查看>>
微服务概念快速了解
查看>>
Java 开源博客 Solo 2.5.0 发布
查看>>