<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
div{padding:20px;}
</style>
</head>
<body style="overflow:hidden;">
<script>
var starsAnim = {
init:function(){
canvas = document.createElement("canvas");
ctx = canvas.getContext("2d");
W = window.innerWidth;
H = window.innerHeight;
canvas.width = W;
canvas.height = H;
document.body.appendChild(canvas);
var star = oneStar.init(8,ctx);
}
}
/**
* [oneStar 创建一个多角星]
* @type {Object}
*/
var oneStar = {
init : function(nums,ctx,r,x,y,trangles){
this.c = this.getRandColor(); //多角星颜色
this.r = r ? r : 50; //多角星半径
this.x = x ? x : this.r/2; //中心坐标
this.y = y ? y : this.r/2; //中心坐标
this.ctx = ctx;
this.trangles = trangles ? trangles : 5; //角数。默认是五角星
this.stars = []; //多角星数据
this.drawStars(nums); //绘制多个多角星
},
/**
* drawStar 绘制多角星
* @param {Number} r 半径
* @param {Number} x 中心坐标
* @param {Number} y 中心坐标
* @param {String} c 颜色
*/
drawStar : function(r, x, y, c){
ctx.save();
ctx.translate(x,y); //设置一个随机偏移量,避免星星重叠在一起
var star = [], item=null, angle = Math.PI/this.trangles;
ctx.rotate(-Math.PI/2); //旋转使星星的开始点朝上
for(var i = 0; i < this.trangles*2; i++){
if(!(i&1)){//不是奇数的半径是r
item = {
x : r * Math.cos(angle*i),
y : r * Math.sin(angle*i)
}
}else{//不是奇数的半径是r/2
item = {
x : 0.5 * r * Math.cos(angle*i),
y : 0.5 * r * Math.sin(angle*i)
}
}
star.push(item);
}
this.stars.push(star);
ctx.beginPath();
ctx.strokeStyle = c;
ctx.lineWidth = 5;
ctx.moveTo(star[0].x,star[0].y);
for(var i = 1; i<star.length; i++){
ctx.lineTo(star[i].x,star[i].y);
} ctx.closePath();
// 绘制吊绳
ctx.moveTo(star[0].x,star[0].y);
ctx.lineTo(star[0].x+x+y,star[0].y);
ctx.stroke();
ctx.restore(); },
/**
* drawStars 绘制多角星
* @param {Number} num 绘制数量
*/
drawStars : function(num){
for(var i = 0; i<num; i++){
this.r = ~~(this.getcustomRand(25,60)); //~~表示取整
this.x = this.r + this.x + this.getcustomRand(10,180);
this.y = this.r + this.getcustomRand(80,200);
this.c = this.getRandColor();
this.drawStar(this.r, this.x, this.y, this.c);
console.log(this.stars);
this.stars[i].trans = {
r : this.r,
x : this.x,
y: this.y,
c :this.c
};
}
},
/**
* getRandColor 获取一个随机颜色
* @return {String} 返回一个rgb颜色字符串
*/
getRandColor : function(){
return "rgb("+(~~(Math.random()*255)) + "," + (~~(Math.random()*255)) +","+(~~(Math.random()*255))+")";
},
/**
* getcustomRand 获取一个指定范围的随机~~数
* @param {Number} max 范围右边界
* @param {Number} min 范围左边界
* @return {Number} 返回随机数
*/
getcustomRand : function(max,min){
return Math.random() * (max-min) + min;
}
}
starsAnim.init();
</script>
</body>
</html>

+++++++++++预览:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

canvas绘制多角形小练习的更多相关文章

  1. canvas绘制简单小铅笔

    对应HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  2. 微信小程序-canvas绘制文字实现自动换行

    在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...

  3. 小程序canvas绘制纯色圆角区域 setdata数组某一项

    小程序canvas绘制纯色圆角区域: //方法: roundRectPath:function(ctx, x, y, w, h, r) { ctx.beginPath(); ctx.moveTo(x ...

  4. 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

    小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...

  5. 使用canvas绘制时钟

    使用canvas绘制时钟  什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...

  6. html5 Canvas绘制图形入门详解

    html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...

  7. H5 canvas绘制出现模糊的问题

    在之前做移动端小游戏幸运转盘.九宫格转盘,使用到了 canvas ,也是第一次在项目中使用 canvas 来实现. 近期测试人员反应 canvas 绘制的内容太模糊,心想着用 canvas 绘制出来的 ...

  8. HTML5 canvas 绘制五星红旗

    这个例子并不是自己写的,在网上找的案列,仿照写的,,,自己真的公布董这些算法,看完这个例子还是有一点模糊,,, 如果谁看的比较明白,指点一下,,,多谢!!!! <!doctype html> ...

  9. Canvas绘制一个大鱼喂小鱼的游戏

    Canvas是HTML5中的一部分,强大的API足以让我们绘制我们任意想绘制的东西.利用Canvas的基础学习以及JavaScript面向对象的思想绘制一个小游戏,下面是源码地址https://git ...

随机推荐

  1. 巨蟒python全栈开发linux之centos2

    1.一些命令回顾 在vm中,右击"打开终端",输入命令ifconfig,得到的下图算是一个终端,并且我们可以看到服务器的ip是192.168.34.128 我们通过windows上 ...

  2. box-shadow阴影效果

    .shadowBox{ -moz-box-shadow:5px 5px 5px #A9A9A9; -webkit-box-shadow:5px 5px 5px #A9A9A9; box-shadow: ...

  3. 洛谷 P1640 [SCOI2010]连续攻击问题

    洛谷 一句话题意: 每个武器有两种属性,每种武器只能选择一种属性,从属性1连续递增才算攻击,求最大连续攻击次数. 因为同学告诉我这是二分图最大匹配,自然就往那个方向去想. 那么怎么建图呢? 每个武器只 ...

  4. mysql用户授权以及权限收回

    语法 GRANT privileges [(columns)] ON DATABASE.TABLE TO 'username'@'hostname' [IDENTIFIED BY [PASSWORD] ...

  5. Android系统移植与调试之------->如何使用PhotoShop转换24位的bmp图片为16位bmp图片

    使用Android移植时候,很多图片都需要16为的bmp格式,所以研究了一下如何从24位转换成16位,供大家参阅 step1:查看bmp图片的属性,如下图所示,是24位的 step2:用PhotoSh ...

  6. Wicket:一种构建和测试动态 Web 页面的简化框架

    https://www.ibm.com/developerworks/cn/web/wa-aj-wicket/

  7. javaweb action无法跳转、表单无法跳转的解决方法

    action无法跳转,表单无法跳转的解决方法 刚在网上搜索了一下,发现我的这篇文章已被非常多人转载了去其他站点.暗爽,只是还是希望大家注明出处. 顺便说明一下.下面是在struts2中通过測试的 ac ...

  8. Android Http Get Post

    public class MyHttpUrlCon { public static String settionId = ""; ;// public ReturnData doG ...

  9. jQuery:自学笔记(1)——基础入门

    jQuery:自学笔记(1)——基础入门 认识JQuery 1.jQuery概述 jQuery是一个快速.小巧 .功能丰富的JavaScript函数库.它可以实现“写的少,做的多”的目标. jQuer ...

  10. api token

    具体实现如下: 1. api请求客户端想服务器端一次发送用用户认证信息(用户名和密码),服务器端请求到改请求后,验证用户信息是否正确. 如果正确:则返回一个唯一不重复的字符串(一般为UUID),然后在 ...