鱼C论坛

 找回密码
 立即注册
查看: 3489|回复: 2

[已解决]关于canvas旋转的问题

[复制链接]
发表于 2018-4-18 16:03:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
连续旋转的时候有270度是黑的,像这样:
无标题.png

html代码
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <title>旋转动画</title>
  6.                 <script src="js/rotate.js" type="text/javascript" charset="utf-8"></script>
  7.                 <style type="text/css">
  8.                         body{
  9.                                 background: #000;
  10.                         }
  11.                         #c1{
  12.                                 background: #fff;
  13.                         }
  14.                 </style>
  15.         </head>
  16.         <body>
  17.                 <canvas id="c1" width="400" height="400">
  18.                         <span style="color: red;">浏览器不支持canvas</span>
  19.                 </canvas>
  20.         </body>
  21. </html>
复制代码


js代码
  1. window.onload=function(){
  2.         var oC = document.getElementById('c1');
  3.         var oGC = oC.getContext('2d');
  4.        
  5.         var num = 0;
  6.        
  7.         oGC.translate(200,200);
  8.        
  9.         setInterval(function(){
  10.                 num++;
  11.                
  12.                 oGC.save();
  13.                
  14.                 oGC.clearRect(0,0,oC.width,oC.height);
  15.                
  16.                 oGC.rotate(num*Math.PI/180);
  17.                
  18.                 oGC.fillRect(0,0,100,100);
  19.                
  20.                 oGC.restore();
  21.                
  22.         },10);
  23. }
复制代码


不知道哪里有问题
最佳答案
2018-4-19 11:05:53
本帖最后由 不二如是 于 2018-4-19 11:36 编辑

目前鱼油的代码:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>旋转动画</title>
  6.     <style type="text/css">
  7.         body{
  8.             background: #000;
  9.         }
  10.         #c1{
  11.             background: #fff;
  12.         }
  13.     </style>
  14. </head>
  15. <body>
  16. <canvas id="c1" width="400" height="400">
  17.     <span style="color: red;">浏览器不支持canvas</span>
  18. </canvas>

  19. <script>
  20.     window.onload=function(){
  21.         var oC = document.getElementById('c1');
  22.         var oGC = oC.getContext('2d');

  23.         var num = 0;

  24. //      转换画布的用户坐标系统。水平和垂直进行偏移
  25.         oGC.translate(200,200);

  26.         setInterval(function(){
  27.             num++;

  28.             oGC.save();

  29. //            删除一个画布的矩形区域400*400
  30.            oGC.clearRect(0,0,oC.width,oC.height);

  31. //            旋转
  32.             oGC.rotate(num*(Math.PI/180));


  33. //            填充一个矩形
  34. //            fillRect(x, y, width, height)
  35. //            x, y        矩形的左上角的坐标。
  36. //            width, height        矩形的大小。
  37.             oGC.fillRect(0,0,100,100);

  38.             oGC.restore();

  39.         },10);
  40.     }

  41. </script>
  42. </body>
  43. </html>
复制代码

Apr-19-2018 10-45-47.gif


利用矩形的对角线宽度,围绕圆心进行画圆。

这个画圆,是靠“挖空”画布白色,呈现body黑色实现的。

所以要动态清除画布的白色,也就是通过矩形对角线轨迹,完成背景色黑的的呈现。

第一遍save,啥也木有,后面的clearRect也啥也木有

然后rotate为空,fillRect执行,挖出一个100*100的黑色矩形。
Snip20180419_84.png


进入定时器第二遍,该矩形会被清除,然后就这么画矩形,旋转,清除,restore。。。
Snip20180419_85.png
Snip20180419_86.png


关键就在清除的中心和restore()之间的顺序。

Snip20180419_82.png
Snip20180419_83.png


如果只想画出一个整圆,可以直接注释掉清除画布(修改中心和半径也行):
  1. //            oGC.clearRect(0,0,oC.width,oC.height);
复制代码

Apr-19-2018 11-03-06.gif

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-18 19:16:30 | 显示全部楼层
把 oGC.clearRect(0,0,oC.width,oC.height);改为 oGC.clearRect(-200,-200,oC.width,oC.height);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-19 11:05:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 不二如是 于 2018-4-19 11:36 编辑

目前鱼油的代码:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>旋转动画</title>
  6.     <style type="text/css">
  7.         body{
  8.             background: #000;
  9.         }
  10.         #c1{
  11.             background: #fff;
  12.         }
  13.     </style>
  14. </head>
  15. <body>
  16. <canvas id="c1" width="400" height="400">
  17.     <span style="color: red;">浏览器不支持canvas</span>
  18. </canvas>

  19. <script>
  20.     window.onload=function(){
  21.         var oC = document.getElementById('c1');
  22.         var oGC = oC.getContext('2d');

  23.         var num = 0;

  24. //      转换画布的用户坐标系统。水平和垂直进行偏移
  25.         oGC.translate(200,200);

  26.         setInterval(function(){
  27.             num++;

  28.             oGC.save();

  29. //            删除一个画布的矩形区域400*400
  30.            oGC.clearRect(0,0,oC.width,oC.height);

  31. //            旋转
  32.             oGC.rotate(num*(Math.PI/180));


  33. //            填充一个矩形
  34. //            fillRect(x, y, width, height)
  35. //            x, y        矩形的左上角的坐标。
  36. //            width, height        矩形的大小。
  37.             oGC.fillRect(0,0,100,100);

  38.             oGC.restore();

  39.         },10);
  40.     }

  41. </script>
  42. </body>
  43. </html>
复制代码

Apr-19-2018 10-45-47.gif


利用矩形的对角线宽度,围绕圆心进行画圆。

这个画圆,是靠“挖空”画布白色,呈现body黑色实现的。

所以要动态清除画布的白色,也就是通过矩形对角线轨迹,完成背景色黑的的呈现。

第一遍save,啥也木有,后面的clearRect也啥也木有

然后rotate为空,fillRect执行,挖出一个100*100的黑色矩形。
Snip20180419_84.png


进入定时器第二遍,该矩形会被清除,然后就这么画矩形,旋转,清除,restore。。。
Snip20180419_85.png
Snip20180419_86.png


关键就在清除的中心和restore()之间的顺序。

Snip20180419_82.png
Snip20180419_83.png


如果只想画出一个整圆,可以直接注释掉清除画布(修改中心和半径也行):
  1. //            oGC.clearRect(0,0,oC.width,oC.height);
复制代码

Apr-19-2018 11-03-06.gif

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 21:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表