html--万花筒特效

<!DOCTYPE html>
<html lang="en" >

<head>
<meta charset="UTF-8">
<title>Spirograph</title>

<link rel="stylesheet" href="css/style.css">


</head>

<body>

<canvas id="canvas" width="100%" height="100%"/>



<script  src="js/index.js"></script>




</body>

</html>



js

var canvas = document.querySelector("#canvas");
var ctx = canvas.getContext("2d");
var mouseX = 0;
var mouseY = 0;
var a = 0.2;
var t = 0;
var aStep = Math.PI * 0.01;
var globalHue = 0;

init();

function init() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  window.addEventListener("mousemove", e => {
    mouseX = e.clientX;
    mouseY = e.clientY;
  });



  update();

}

function update() {
  requestAnimationFrame(update);
  var time = performance.now() / 60;

  // do stuff here
  a = Math.sin(2 - time * 0.0001);
  t = Math.sin(2 + time * 0.03);
  //aStep = (Math.sin(time * 0.01) + 1.5) * 0.25
  aStep = Math.PI * (0.375 + Math.sin(time * 0.001) * 0.125);

  globalHue += 10;

  draw();
}

function draw() {


  // clear canvas

  ctx.fillStyle = "#000000";
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  // line
  var cx = window.innerWidth / 2;
  var cy = window.innerHeight / 2;
  var x, y, px, py;
  var radius = 0,pradius = 0;
  var totalAngle = Math.PI * 200;
  for (var theta = 0; theta < totalAngle; theta += aStep) {

    pradius = radius;
    radius = (t + Math.pow(2, Math.cos(theta * a))) * 200;
    px = x;
    py = y;
    x = cx + Math.cos(theta) * radius;
    y = cy + Math.sin(theta) * radius;

    if (theta > 0) {
      ctx.beginPath();
      ctx.moveTo(x, y);
      ctx.lineTo(px, py);

      var dx = x - px;
      var dy = y - py;
      var lineSize = Math.sqrt(dx * dx + dy * dy);

      var r = pradius + (radius - pradius) / 2;

      var hue = globalHue + theta / Math.PI * 180;
      ctx.strokeStyle = "hsl(" + hue + ", 100%, 50%)";
      //ctx.lineWidth=clamp(map(r, -200, 200, 0.25, 2), 0.25, 10);
      ctx.lineWidth = .5;
      ctx.stroke();
      ctx.closePath();
    }

  }


}

function map(value, start1, stop1, start2, stop2) {
  return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
}

function clamp(value, min, max) {
  return value < min ? min : value > max ? max : value;
}

css

html, body {
  margin: 0;
  overflow: hidden;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fo安方

觉得俺的文章还行,感谢打赏,爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值