canvas实现彩色线条流动曲线动画效果代码

代码语言:html

所属分类:动画

代码描述:canvas实现彩色线条流动曲线动画效果代码,有点像艺术家笔下的画作

代码标签: canvas 彩色 线条 流动 曲线 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

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

<head>
  <meta charset="UTF-8">

  
  
  
  
<style>
body {
  font-family: Arial, Helvetica, "Liberation Sans", FreeSans, sans-serif;
  background-color: #000;
  margin: 0;
  padding: 0;
  border-width: 0;
}
</style>

  
</head>

<body translate="no">
  
  
      <script >
"use strict";



const nbEddies = 7;
const nbParticles = 1003; // number of particles
const lifeTime = 1000; // average lifetime of particles
let noGen;
let canv, ctx; // canvas and drawing context
let maxx, maxy; // size of client Window
let lRef, rWidth, rHeight;

let eddies; // array of eddies
let particles; // array of particles

let messages; // ID provided by window.requestAnimationFrame();
let globHue;
let tbCells, cells, kcell;
let ncx, ncy;

/* shortcuts for Math */

const mrandom = Math.random; // see above alternative function for reproductible results
const mfloor = Math.floor;
const mround = Math.round;
const mceil = Math.ceil;
const mabs = Math.abs;
const mmin = Math.min;
const mmax = Math.max;

const mPI = Math.PI;
const mPIS2 = Math.PI / 2;
const m2PI = Math.PI * 2;
const msin = Math.sin;
const mcos = Math.cos;
const matan2 = Math.atan2;
const mexp = Math.exp;

const mhypot = Math.hypot;
const msqrt = Math.sqrt;

//-----------------------------------------------------------------------------
// miscellaneous functions
//-----------------------------------------------------------------------------

function alea(min, max) {
  // random number [min..max[ . If no max is provided, [0..min[

  if (typeof max == "undefined") return min * mrandom();
  return min + (max - min) * mrandom();
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

function intAlea(min, max) {
  // random integer number [min..max[ . If no max is provided, [0..min[

  if (typeof max == "undefined") {
    max = min;
    min = 0;
  }
  return mfloor(min + (max - min) * mrandom());
} // intAlea

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function arrayShuffle(array) {
  /* randomly changes the order of items in an array
         only the order is modified, not the elements
      */
  let k1, temp;
  for (let k = array.length - 1; k >= 1; --k) {
    k1 = intAlea(0, k + 1);
    temp = array[k];
    array[k] = array[k1];
    array[k1] = temp;
  } // for k
  return array;
} // arrayShuffle

//------------------------------------------------------------------------

class Eddy {
  constructor() {
    this.x = alea(-0.02, rWidth + 0.02);
    this.y = alea(-0.02, rHeight + 0.02);

    this.coeffR = 0.001 * alea(0.7, 1.3); // coefficient for radial velocity
    //        this.coeffR = 0.001 * (alea(0.7, 1.3));        // coefficient for radial velocity
    this.radius = 0.2 + alea(-0.1, 0.1); // radius where angular velocity is max
    //        this.radius = 0.2 + alea(-0.10, 0.10);          // radius where angular velocity is max
    this.coeffA1 = 0.017 * alea(0.8, 1.2); // coefficient in exponent for angular velocity
    //        this.coeffA1 = 0.008 * alea(0.8, 1.2);         // coefficient in exponent for angular velocity
    this.coeffA2 = 0.01 * alea(0.8, 1.2); // multiplying coefficient for angular velocity
    //        this.coeffA2 = 0.015 * alea(0.8, 1.2);       // multiplying coefficient for angular velocity
    this.dir = mrandom() > 0.5 ? 1 : -1; // direction of rotation
  } // constructor

  // for movement of Eddy
} // class Eddy
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function createEddies() {
  eddies = []; // create empty array;
  for (let k = 0; k < nbEddies; ++k) {
    eddies.push(new Eddy());
  } // for k
} // createEddies

//------------------------------------------------------------------------
function sortCells() {
  let d1, d2, d1x, d1y;
  cells.sort((c1, c2) => {
    if (c1.cnt != c2.cnt) return c1.cnt - c2.cnt;
    if (c1.kx < ncx / 2) d1x = c1.kx;else
    d1x = ncx - 1 - c1.kx;
    if (c1.ky < ncy / 2) d1y = c1.ky;else
    d1y = ncy - 1 - c1.ky;
    d1 = mmin(d1x, d1y);
    if (c2.kx < ncx / 2) d1x = c2.kx;else
    d1x = ncx - 1 - c2.kx;
    if (c2.ky < ncy / 2) d1y = c2.ky;else
    d1y = ncy - 1 - c2.ky;
    d2 = mmin(d1x, d1y);
    return d1 - d2;
  });
}
//------------------------------------------------------------------------
class Particle {
  constructor() {
    let c = cells[kcell];
    ++kcell;
    if (kcell > 0.0005 * cells.length) {
      sortCells();
      kcell = 0;
    }

    let x = c.kx + Math.random() - 5; // random point in cell
    let y = c.ky + Math.random() - 5;
    this.x = x / lRef;
    this.y = y / lRef;
    this.sat = `${intAlea(50, 101)}%`;
    this.light = `${intAlea(30, 80)}%`;
    this.TTL = alea(lifeTime * 0.8, lifeTime * 1.2); // time to live
    this.hue =.........完整代码请登录后点击上方下载按钮下载查看

网友评论0