zoukankan      html  css  js  c++  java
  • canvas画随机闪烁的星星

    canvas画一颗星星:

    规则的星星有内切圆和外切圆,每两个点之间的角度是固定的,因此可得到星星的每个点的坐标,画出星星。

     1  function drawStars(x,y,radius1,radius2,num,drawType,color){
     2                 var angle = 360/(num*2);
     3                 var arr = [];
     4                 for(var i=0;i<num*2;i++){
     5                     var starObj = {};
     6                     if(i%2==0){
     7                         starObj.x = x+radius1*Math.cos(i*angle*Math.PI/180);
     8                         starObj.y = y+radius1*Math.sin(i*angle*Math.PI/180);
     9                     }else{
    10                         starObj.x = x+radius2*Math.cos(i*angle*Math.PI/180);
    11                         starObj.y = y+radius2*Math.sin(i*angle*Math.PI/180);
    12                     }
    13                     arr.push(starObj);
    14                 }
    15 
    16                 cxt.beginPath();
    17                 cxt.fillStyle=color;
    18                 cxt.strokeStyle = color;
    19                 cxt.moveTo(arr[0].x,arr[0].y);
    20                 for(var i=1;i<arr.length;i++){
    21                     cxt.lineTo(arr[i].x,arr[i].y);
    22                 }
    23                 cxt.closePath();
    24                 if(drawType=="fill"){
    25                     cxt.fill();
    26                 }else{
    27                     cxt.stroke();
    28                 }
    29             }

    给星星添加随机属性:

     1 var starArr=[];                           //多个星星对象
     2             for(var i=0;i<5;i++){
     3                 var starObj={
     4                     radius1:10+5*Math.random(),
     5                     radius2:2+4*Math.random(),
     6                     x:30+(canvas.width-60)*Math.random(),
     7                     y:30+(canvas.height-60)*Math.random(),
     8                     num:4,
     9                     angle:360*Math.random(),
    10                     changeAngle:-5+10*Math.random(),
    11                     color:"rgb("+parseInt(255*Math.random())+","+parseInt(255*Math.random())+","+parseInt(255*Math.random())+")"
    12                 }
    13                 starArr.push(starObj);
    14             }

    随机产生星星并添加动画(闪烁、旋转等):

     1 setInterval(function(){
     2                 cxt.clearRect(0,0,500,500);
     3                 for(var i=0;i<starArr.length;i++) {
     4                     starArr[i].angle+=starArr[i].changeAngle;
     5                     cxt.save();
     6                     cxt.beginPath();
     7                     cxt.translate(starArr[i].x, starArr[i].y);
     8                     cxt.rotate(starArr[i].angle * Math.PI / 180);
     9                     cxt.scale(Math.sin(starArr[i].angle * Math.PI / 180), Math.sin(starArr[i].angle * Math.PI / 180));
    10                     cxt.globalAlpha = Math.abs(Math.sin(starArr[i].angle * Math.PI / 180));
    11                     drawStars(0,0,starArr[i].radius1, starArr[i].radius2, starArr[i].num, "fill", "white");
    12                     cxt.restore();
    13                 }
    14             },30);

    到此,随机产生有动画的星星就完了。

         下面还补充点,当我在angular中使用canvas画星星时,我的做法时window.onload=function(canvas()),FF等均正常,在IE9中报错,canvas.getContext('2d')为null,不知道是什么原因,我在directive中用canvas,canvas.getContext('2d')不为null,但是没法画出星星,没找到原因,最后曲线救国。。在canvas下加了个隐藏的图片,图片的onload执行canvas(),够曲折的方法,如果有更好的方法或是知道原因的,欢迎留言提供,不甚感激。

  • 相关阅读:
    为什么要用webUI?
    探索WebKit内核(一)------ 菜鸟起步
    主进程退出的时候,杀死所有子进程
    那两年炼就的Android内功修养
    飞鸽---局域网聊天软件攻防战
    如何利用Fluxion诱惑目标用户获取WPA密码
    性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench
    解决maven编译错误:程序包com.sun.xml.internal.ws.spi不存在
    Apache-Flink深度解析-DataStream-Connectors之Kafka
    linux下find(文件查找)命令的用法总结
  • 原文地址:https://www.cnblogs.com/ethy/p/4397958.html
Copyright © 2011-2022 走看看