# canvas绘制多角形小练习

<!doctype html>
<html lang="en">
<meta charset="UTF-8">
<title></title>
<style>
</style>
<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>


+++++++++++预览：+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

posted @ 2018-03-27 18:24  幽竹小妖  阅读(207)  评论(0编辑  收藏  举报