当前位置: 首页 > 文档资料 > HTML5 Canvas 实战 >

2.9 随机图形属性:绘制开满鲜花的原野

优质
小牛编辑
127浏览
2023-12-01

本节,我们通过绘制色彩缤纷的鲜花,来拥抱我们内心的嬉皮士。

绘制开满鲜花的原野
图2-10 绘制开满鲜花的原野

绘制步骤

按照以下步骤,绘制随机的鲜花遍布整个画布:

1. 定义Flower对象的构造函数:

//定义Flower对象的构造函数
function Flower(context, centerX, centerY, radius, numPetals, color){
  this.context   = context;
  this.centerX   = centerX;
  this.centerY   = centerY;
  this.radius    = radius;
  this.numPetals = numPetals; 
  this.color     = color;
}

2. 定义Flower对象的draw方法,该方法通过一个for循环来绘制多个花瓣,然后绘制一个黄色的花蕊:

//定义Flower对象的draw方法
Flower.prototype.draw  = function(){
  var context  = this.context;
  context.beginPath();
  //绘制花瓣
  for  (var n  =  0; n  < this.numPetals; n++)  {
    var theta1  =  ((Math.PI  *  2)  / this.numPetals)  *  (n  +  1); 
    var theta2  =  ((Math.PI  *  2)  / this.numPetals)  *  (n);
    var x1  =  (this.radius  * Math.sin(theta1))  + this.centerX;
    var y1  =  (this.radius  * Math.cos(theta1))  + this.centerY;
    var x2  =  (this.radius  * Math.sin(theta2))  + this.centerX;
    var y2  =  (this.radius  * Math.cos(theta2))  + this.centerY;
    context.moveTo(this.centerX, this.centerY);
    context.bezierCurveTo(x1, y1, x2, y2, this.centerX, this. centerY);
  }
  context.closePath();
  context.fillStyle  = this.color; 
  context.fill();
  //绘制黄色花蕊
  context.beginPath();
  context.arc(this.centerX, this.centerY, this.radius / 5, 0, 2 * Math.PI, false);
  context.fillStyle  = "yellow"; 
  context.fill();
};

3. 设置2D画布上下文:

window.onload  = function(){
  var canvas  = document.getElementById("myCanvas");
  var context = canvas.getContext("2d");

4. 创建绿色渐变作背景:

  //创建绿色渐变作背景
  context.beginPath();
  context.rect(0,  0, canvas.width, canvas.height);
  var grd  = context.createLinearGradient(0,  0, canvas.width, canvas.height);
  grd.addColorStop(0, "#1EDE70");  //浅绿色
  grd.addColorStop(1, "#00A747");  //深绿色
  context.fillStyle  = grd;
  context.fill();

5. 定义花瓣颜色的数组:

  //定义花瓣颜色的数组
  var colorArray  =  [];
  colorArray.push("red");  //  0
  colorArray.push("orange");  //  1
  colorArray.push("blue");  //  2
  colorArray.push("purple");  //  3

6. 创建一个循环,来随机生成鲜花的位置、尺寸和颜色:

  //定义鲜花的数目
  var numFlowers  =  50;
  //绘制随机放置的鲜花
  for  (var n  =  0; n  < numFlowers; n++)  {
    var centerX  = Math.random()  * canvas.width;
    var centerY  = Math.random()  * canvas.height; 
    var radius  =  (Math.random()  *  25)  +  25;
    var colorIndex = Math.round(Math.random() * (colorArray. length  -  1));
    var thisFlower = new Flower(context, centerX, centerY, radius, 5, colorArray[colorIndex]);
    thisFlower.draw();
  }
};

7. 在HTML文档的body部分嵌入canvas标签:

<canvas id="myCanvas" width="600" height="250" style="border:1px solid black;">
</canvas>

工作原理

本节的全部内容是关于随机对象的属性,并通过HTML5的画布把其结果绘制到屏幕上。总的思想是绘制很多鲜花,这些鲜花的位置、尺寸、颜色都各不相同。

为帮助我们创建开满鲜花的原野,创建一个Flower类将非常有用,由这个类来定义鲜花的属性及绘制鲜花的方法。本节的实例中,我们保持花瓣的数目不变,如果要你来实现,你当然可以改变每朵鲜花的花瓣数目。

实际上,绘制鲜花跟上一节使用循环创建图案:绘制齿轮非常相似,只是此刻,是在一个圆的周围绘制花瓣而不是锯齿线。我已经发现,在HTML5的画布中绘制花瓣的最简单方法,是绘制一条起点和终点相连的贝塞尔曲线。贝塞尔曲线的起点和终点都在鲜花的中心,其控制点在Flower类的draw()方法的每个迭代中定义。

一旦Flower类创建完成并可以运行,我们可以创建一个循环,在循环的每个迭代中实例化一个随机的Flower对象,再调用draw()方法把它们渲染出来。

如果你试着运行本节的例子,你将看到,每次刷新屏幕,这些鲜花都是完全随机的。