html5旋转木马相册,HTML5/Canvas旋转木马动画图案

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var c = document.getElementById('canv');

$ = c.getContext("2d");

c.width = window.innerWidth;

c.height = window.innerHeight;

window.addEventListener('resize', function() {

c.width = window.innerWidth;

c.height = window.innerHeight;

}, false)

function cmul(w, z) {

return [

w[0] * z[0] - w[1] * z[1],

w[0] * z[1] + w[1] * z[0]

];

}

function csub(w, z) {

return [w[0] - z[0], w[1] - z[1]];

}

function modulus(p) {

return Math.sqrt(p[0] * p[0] + p[1] * p[1]);

}

function crecip(z) {

var d = z[0] * z[0] + z[1] * z[1];

return [z[0] / d, -z[1] / d];

}

function cpow(z, n) {

var mod = Math.pow(modulus(z), n),

arg = Math.atan2(z[1], z[0]) * n;

return [mod * Math.cos(arg), mod * Math.sin(arg)];

}

function möb(p) {

var x = p[0],

y = p[1];

var denom = (x + 1) * (x + 1) + y * y;

return [(x * x - 1 + y * y) / denom, 2 * y / denom];

}

function spiral(r, st, delta, gamma, opts) {

var rd = crecip(delta),

md = modulus(delta),

mrd = 1 / md,

colidx = opts.i,

cols = opts.fill,

min_d = opts.min_d,

max_d = opts.max_d,

dg = cmul(delta, gamma),

dog = cmul(delta, crecip(gamma)),

god = cmul(gamma, crecip(delta));

for (var q = st, mod_q = modulus(q); mod_q > min_d; q = cmul(q, rd), mod_q *= mrd) {

colidx = (colidx + cols.length - 1) % cols.length;

}

for (; mod_q < max_d; q = cmul(q, delta), mod_q *= md, colidx = (colidx + 1) % cols.length) {

var quad = [möb(q)];

if (modulus(quad[0]) > 5) continue;

if (colidx == 0)

quad.push(möb(cmul(q, dog)));

quad.push(möb(cmul(q, delta)));

if (colidx == 2)

quad.push(möb(cmul(q, dg)));

quad.push(möb(cmul(q, gamma)));

if (colidx == 1)

quad.push(möb(cmul(q, god)));

if (modulus(csub(quad[0], quad[2])) > 5) continue;

$.fillStyle = cols[colidx];

$.beginPath();

$.moveTo(quad[0][0], quad[0][1]);

$.lineTo(quad[1][0], quad[1][1]);

$.lineTo(quad[2][0], quad[2][1]);

$.lineTo(quad[3][0], quad[3][1]);

$.closePath();

$.fill();

}

}

var p = -9,

q = 27;

var root = doyle(p, q);

var rep = 360;

function anim(t) {

$.setTransform(2, 0, 0, 2, 1, 1);

$.clearRect(0, 0, c.width, c.height);

$.translate(Math.round(c.width / 2), cy = Math.round(c.height / 2));

$.scale(300, 300);

$.rotate(Math.PI / 5);

var min_d = 1e-4,

max_d = 1e4;

var start = cpow(root.a, t);

for (var i = 0; i < q; i++) {

spiral(root.r, start, root.a, root.b, {

fill: ["#B32727", "#2C87DB", "#D4AA2F"],

i: (2 * i) % 0.5,

min_d: min_d,

max_d: max_d

});

start = cmul(start, root.b);

}

}

var fts;

function run(ts) {

if (!fts) fts = ts;

anim(((ts - fts) % (3 * rep)) / rep);

window.requestAnimationFrame(run);

}

run();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值