【问题标题】:Making a spinning spiral做一个旋转的螺旋
【发布时间】:2013-04-29 19:42:04
【问题描述】:

我找到了一个绘制螺旋的代码,我需要让它旋转 360 度(类似于催眠效果)。我试图为它制作动画,但我不知道如何正确实现它。我没时间了。如果代码尽可能简单,那就太好了。

这是螺旋代码:

<canvas id="myCanvas" width="300" height="300"></canvas>
<script type="text/javascript">
    var c=document.getElementById("myCanvas");
    var cxt=c.getContext("2d");
    var centerX = 150;
    var centerY = 150;
    cxt.moveTo(centerX, centerY);

    var STEPS_PER_ROTATION = 60;
    var increment = 2*Math.PI/STEPS_PER_ROTATION;       
    var theta = increment;

    while( theta < 40*Math.PI) {
      var newX = centerX + theta * Math.cos(theta); 
      var newY = centerY + theta * Math.sin(theta); 
      cxt.lineTo(newX, newY);
      theta = theta + increment;
    }
    cxt.stroke();
</script>

【问题讨论】:

标签: javascript animation rotation spiral


【解决方案1】:

虽然Xotic750's answer 更好,因为没有经常发生数学重新计算,here's the jsFiddle of a JavaScript-only alternative。此版本提供的优势是在没有CSS3 animation support 的浏览器上向后兼容。

CSS3 动画支持最近才出现在 Firefox、Safari、Internet Explorer 和 Opera(桌面、移动和 Mini)中。 Chrome(桌面和移动)和黑莓浏览器是仅有的在早期阶段就支持动画的浏览器。


解释:

var counter = 0;
setInterval(function () {
    DrawSpiral(counter);
    counter += 0.075;
}, 10);
  • counter 是一个变量,它将保持 count 螺旋在下一次重绘时应位于的位置。
  • DrawSpiral 是执行实际工作的函数。

有两个因素有助于改变旋转速度; counter (+= 0.075) 和 setInterval 延迟 (50) 的变化。

这两个因素应该成反比。换句话说,增加 setInterval 延迟应该与减少 计数器变化同时进行。


与原来的变化:

cxt.save();
cxt.clearRect(0, 0, c.width, c.height);

cxt.beginPath();
  • 将您的螺旋绘图代码封装到DrawSpiral(...) 函数中。
  • cxt.save() 存储当前的转换。
  • cxt.clearRect(...) 清除画布(以免在之前的绘图之上绘制)。
  • cxt.beginPath() 开始一个新的线路路径(基本上是切断最后一条线路)。

下一组变化:

var newX = centerX + theta * Math.cos(theta - mod);
var newY = centerY + theta * Math.sin(theta - mod);
  • ... Math.cos(theta - mod)newX 值更改为下一个“spot”。
  • ... Math.sin(theta - mod)newY 值更改为下一个“spot”。

请记住,此方法可能会稍微慢一些,具体取决于浏览器、CPU、显卡等。

【讨论】:

  • +1 干得好!有没有支持 HTML5 画布但不支持 CSS3 的浏览器?只是想知道......
  • @Xotic750 我发现的不同之处在于旧版本的 Firefox、Safari、IE 和 Opera(桌面、迷你、移动)。他们都有supported canvas 用于相当多的版本,然而,CSS3 的animation 直到最近才出现。 Chrome(桌面版和移动版)和黑莓浏览器似乎在很早的时候就同时支持这两种浏览器。
【解决方案2】:

好的,这是一种使用 CSS 动画而不是数学计算的解决方案。

CSS

@-webkit-keyframes myCanvas {
    0% { -webkit-transform: rotateZ(360deg); }
    100% { -webkit-transform: rotateZ(0deg); }
}
@-moz-keyframes myCanvas {
    0% { -moz-transform: rotateZ(360deg); }
    100% { moz-transform: rotateZ(0deg); }
}
@keyframes myCanvas {
    0% { transform: rotateZ(360deg); }
    100% { transform: rotateZ(0deg); }
}

#myCanvas {
    -webkit-animation: myCanvas 2s infinite linear;
    -moz-animation: myCanvas 2s infinite linear;
    animation: myCanvas 2s infinite linear;
}

HTML

<canvas id="myCanvas" width="300" height="300"></canvas>

Javascript

var c = document.getElementById("myCanvas");
var cxt = c.getContext("2d");
var centerX = 150;
var centerY = 150;
cxt.moveTo(centerX, centerY);

var STEPS_PER_ROTATION = 60;
var increment = 2 * Math.PI / STEPS_PER_ROTATION;
var theta = increment;

while (theta < 40 * Math.PI) {
    var newX = centerX + theta * Math.cos(theta);
    var newY = centerY + theta * Math.sin(theta);
    cxt.lineTo(newX, newY);
    theta = theta + increment;
}

cxt.stroke();

开启jsfiddle

【讨论】:

  • 感谢您的回复!我试图放入 Dreamweaver,但它不起作用。有什么我可能错的建议吗?
  • 不是最模糊的,我不使用 Dreamweaver - 不能说编辑器会像浏览器一样工作。
  • 那么请您看一下这个并提供任何提示吗? imageshack.us/photo/my-images/29/codeqf.jpg
  • 我没有看到任何给定的#myCanvas css 命令合并到您的工作中。
  • 如果我没听错,你说的是这个。它不会改变任何东西。 imageshack.us/photo/my-images/521/code2.jpg/?sa=0 我非常需要这个才能工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2023-03-10
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多