canvas中的三角运动(5) —— 圆周运动和椭圆运动

bjfish2012 8年前
   <h2>一. 圆周运动</h2>    <h3>1.1 思路分析:</h3>    <p>圆的方程为:</p>    <pre>  <code class="language-javascript">// (x0, y0)为圆心位置;(x, y)为圆上的点  (x - x0) ^ 2 + (y - y0) ^ 2 = r ^ 2  cos(angle) ^ 2 + sin(angle) ^ 2 = 1</code></pre>    <p>因此,综合以上两式,可得:</p>    <ul>     <li><strong>x = r * cos(angle) + x0</strong></li>     <li><strong>y = r * sin(angle) + y0</strong></li>    </ul>    <p>因此,应用正弦函数计算y坐标,用余弦函数计算x坐标。</p>    <h2>1.2 实例:</h2>    <pre>  <code class="language-javascript">// cancelRequestAnimFrame的兼容函数  window.cancelRequestAnimFrame = ( function() {      return window.cancelAnimationFrame ||          window.webkitCancelRequestAnimationFrame ||          window.mozCancelRequestAnimationFrame ||          window.oCancelRequestAnimationFrame ||          window.msCancelRequestAnimationFrame ||          clearTimeout;  } )();    window.onload = function() {      var canvas = document.getElementById("canvas"),          context = canvas.getContext("2d"),          ball = new Ball(2),          angle = 0,          centerX = canvas.width / 2,          centerY = canvas.height / 2,          radius = 50,          speed = 0.05,          timer = null;            ball.lineWidth = 0;        (function drawFrame() {          timer = window.requestAnimationFrame(drawFrame, canvas);          if(angle > Math.PI * 2 && timer) {              window.cancelRequestAnimFrame(timer);              timer = null;          }          // context.clearRect(0, 0, canvas.width, canvas.height);          ball.y = centerY + Math.sin(angle) * radius;          ball.x = centerX + Math.cos(angle) * radius;          angle += speed;            ball.draw(context);      })();  }</code></pre>    <p>演示如下: <a href="/misc/goto?guid=4959677072878829266" rel="nofollow,noindex">http://codepen.io/dengzhirong/pen/akxQbx</a></p>    <h2>二. 椭圆运动</h2>    <h3>2.1 思路分析:</h3>    <p>椭圆的方程为:</p>    <pre>  <code class="language-javascript">// (x0, y0)为椭圆的圆心位置;(x, y)为椭圆上的点  [(x - x0) / radiusX] ^ 2 + [(y - y0) / radiusY] ^ 2 = 1  cos(angle) ^ 2 + sin(angle) ^ 2 = 1</code></pre>    <p>因此,综合以上两式,可得:</p>    <ul>     <li><strong>x = radiusX * cos(angle) + x0</strong></li>     <li><strong>y = radiusY * sin(angle) + y0</strong></li>    </ul>    <p>由此可得出椭圆运动的坐标值。</p>    <h2>2.2 实例:</h2>    <pre>  <code class="language-javascript">// cancelRequestAnimFrame的兼容函数  window.cancelRequestAnimFrame = ( function() {      return window.cancelAnimationFrame ||          window.webkitCancelRequestAnimationFrame ||          window.mozCancelRequestAnimationFrame ||          window.oCancelRequestAnimationFrame ||          window.msCancelRequestAnimationFrame ||          clearTimeout;  } )();    window.onload = function() {      var canvas = document.getElementById("canvas"),          context = canvas.getContext("2d"),          ball = new Ball(2),          angle = 0,          centerX = canvas.width / 2,          centerY = canvas.height / 2,          radiusX = 150,          radiusY = 100,          speed = 0.05,          timer = null;            ball.lineWidth = 0;        (function drawFrame() {          timer = window.requestAnimationFrame(drawFrame, canvas);          if(angle > Math.PI * 2 && timer) {              window.cancelRequestAnimFrame(timer);              timer = null;          }          // context.clearRect(0, 0, canvas.width, canvas.height);          ball.y = centerY + Math.sin(angle) * radiusY;          ball.x = centerX + Math.cos(angle) * radiusX;          angle += speed;            ball.draw(context);      })();  }</code></pre>    <p>演示如下: <a href="/misc/goto?guid=4959677072968532412" rel="nofollow,noindex">http://codepen.io/dengzhirong/pen/WxWYvX</a></p>    <p> </p>    <p>来自:http://www.dengzhr.com/js/962</p>    <p> </p>