使用JavaScript在Canvas上画出一片星空
随着Html5的迅猛发展,画布也变得越来越重要。下面我就写一个关于在canvas上画出一片星空的简单的代码的示例。
理论基础
- 初始化一个canvas,获得一个用于绘制图形的上下文环境context。并指定为2d方式进行绘图。
- 画一个五角星其实就是找点和连线的过程。根据几何知识,可以使用两个同心圆来方便的求得相应的坐标位置。
- 设置状态,完成五角星的绘制过程。最后应用于整片星空,绘制很多的五角星。
封装好的五角星绘制函数
下面这个绘制的五角星的方法是可以被复用的,注释也写的比较的清楚。
/**
* 画一个五角星的封装的函数
* @param {Object} cxt 提供绘图的上下文的环境
* @param {Object} r 充当绘图时小圆的半径的值
* @param {Object} R 充当绘图时大圆的半径的值
* @param {Object} x 绘图时x轴方向上的偏移量
* @param {Object} y 绘图时y轴方向上的偏移量
* @param {Object} rota 绘图时图形旋转的角度,表示顺时针的旋转方向!
*/
function drawStar(cxt, r,R ,x,y,rota){
cxt.beginPath();
//使用循环的方式确定点的位置
for(var i =0 ;i<5 ;i++){
//外层大圆上的五个点的位置
cxt.lineTo(Math.cos((18+i*72-rota)/180*Math.PI)*R+x
,-Math.sin((18+i*72-rota)/180*Math.PI)*R+y);
//内层小圆上点的位置
cxt.lineTo(Math.cos((54+i*72-rota)/180*Math.PI)*r+x
,-Math.sin((54+i*72-rota)/180*Math.PI)*r+y);
}
cxt.closePath();
//设置一些状态
cxt.fillStyle="bf1";
cxt.strokeStyle="#fd5";
cxt.lineWidth=3;
cxt.lineJoin="round";
cxt.fill();
cxt.stroke();
}
星空的代码演示
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>创建一个Canvas的小实例</title>
<style>
#canvas{
border: dashed solid #321234;
background: black;
}
</style>
</head>
<body>
<h1>Canvas 实例</h1>
<hr />
<br />
<canvas id="canvas">
如果这段文字出现,那就说明你的浏览器不支持Canvas哟!
</canvas>
<script>
window.onload= function(){
var canvas = document.getElementById("canvas");
canvas.width=800;
canvas.height=800;
var context = canvas.getContext("2d");
//画一片星空开始吧
for(var i=0 ;i<200;i++){
var R = Math.random()*10+10;
var x = Math.random()*canvas.width;
var y = Math.random()*canvas.height;
var r = Math.random()*360;
drawStar(context,R/2,R,x,y,r);
}
}
/**
* 画一个五角星的封装的函数
* @param {Object} cxt 提供绘图的上下文的环境
* @param {Object} r 充当绘图时小圆的半径的值
* @param {Object} R 充当绘图时大圆的半径的值
* @param {Object} x 绘图时x轴方向上的偏移量
* @param {Object} y 绘图时y轴方向上的偏移量
* @param {Object} rota 绘图时图形旋转的角度,表示顺时针的旋转方向!
*/
function drawStar(cxt, r,R ,x,y,rota){
cxt.beginPath();
//使用循环的方式确定点的位置
for(var i =0 ;i<5 ;i++){
//外层大圆上的五个点的位置
cxt.lineTo(Math.cos((18+i*72-rota)/180*Math.PI)*R+x
,-Math.sin((18+i*72-rota)/180*Math.PI)*R+y);
//内层小圆上点的位置
cxt.lineTo(Math.cos((54+i*72-rota)/180*Math.PI)*r+x
,-Math.sin((54+i*72-rota)/180*Math.PI)*r+y);
}
cxt.closePath();
//设置一些状态
cxt.fillStyle="bf1";
cxt.strokeStyle="#fd5";
cxt.lineWidth=3;
cxt.lineJoin="round";
cxt.fill();
cxt.stroke();
}
</script>
</body>
</html>
程序运行结果
总结
这段代码是基于在imooc上Canvas详解而制作的。在这里非常感谢作者给我的启发。另外我觉得在图形的相关的绘制过程中一些常用的而且有用的代码很是值得我们将其封装起来,以便于今后的代码的复用。省时省力还高效!
使用JavaScript在Canvas上画出一片星空的更多相关文章
- canvas上画出坐标集合,并标记新坐标,背景支持放大缩小拖动功能
写在前面:项目需求,用户上传一个区位的平面图片,用户可以在图片上添加新的相机位置,并且展示之前已绑定的相机坐标位置,图片支持放大缩小&拖动的功能.新增坐标,页面展示相对canvas定位,保存时 ...
- (转)第02节:在Canvas上画简单的图形
我们现在已经可以在HTML中使用Fabric.js库了,那这节我们就详细的学习一下如何在canvas上画出简单的图形. 在画东西之前我们需要了解画任何东西的基本三个步骤: 声明画布(canvas),用 ...
- Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解
在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...
- 第五讲:使用html5中的canvas动态画出物理学上平抛运动
<html> <head> <title>平抛运动</title> <script src="../js/jscex.jscexRequ ...
- Android教程:在百度地图上画出轨迹
[日期:2013-04-14] 来源:Linux社区 作者:crazyxin1988 [字体:大 中 小] 接着上面的项目<Android访问webservice.客户端登录注册> ...
- 如何在canvas中画出一个太极图
先放一个效果图: 代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /&g ...
- WPF在圆上画出刻度线
思路 我们可以使用Ellipse先画出一个圆当背景,然后用Canvas再叠加画上刻度线,就能得到如下的效果 我们先用Ellipse画一个橙色的圆,然后将Canvas的宽度和高度绑定到Ellipse的宽 ...
- [Java]在窗口界面上画出硬盘中图片文件
利用类javax.swing.JPanel来在窗口界面上画图.图片文件通过javax.imageio.ImageIO类来获取. import java.awt.Graphics; import jav ...
- HTML5 canvas上画文字出现乱码
不是这个的问题, <html> <head> <meta charset="utf-8"/> </head> 是因为从网上复制粘贴下 ...
随机推荐
- 解决win10 VC++6.0 应用程序无法正常运行 0xc0000142
废话不多说,无法正常运行原因就是win10不兼容中文版的vc,解决方法就是一句话,用英文版的msdev.exe替换中文版的msdev.exe,msdev.exe是vc的启动程序.直接上来教你怎么做.废 ...
- vrn:基于直接体积回归的单幅图像大姿态三维人脸重建
3D面部重建是一个非常困难的基本计算机视觉问题.目前的系统通常假设多个面部图像(有时来自同一主题)作为输入的可用性,并且必须解决许多方法学挑战,例如在大的面部姿势,表情和不均匀照明之间建立密集的对应. ...
- 【python教程01】 编辑器
工欲善其事,必先利其器.学习python,首先应该安装好开发中使用的编辑器. 那么在这里说一下我们推荐的两款:sublime text && pycharm 为什么推荐这两款编辑 ...
- Servlet技术 Cookie与Session
会话过程:用户打开浏览器,点击链接访问资源,最后到关闭浏览器的整个过程称之为会话. 会话使用:与服务器进行会话的过程中产生数据,数据被保存下来,服务器根据数据对客户进行辨别,做出个性化的响应. 介绍两 ...
- 基于babylon3D模型研究3D骨骼动画(1)
3D骨骼动画是实现较为复杂3D场景的重要技术,Babylon.js引擎内置了对骨骼动画的支持,但Babylon.js使用的骨骼动画的模型多是从3DsMax.Blender等3D建模工具转换而来,骨骼动 ...
- brew的MAC安装
1.介绍 brew是一个软件包管理工具,类似于centos下的yum或者ubuntu下的apt-get,非常方便,免去了自己手动编译安装的不便 brew 安装目录 /usr/local/Cellar ...
- Lucene——Field.Store(存储域选项)及Field.Index(索引选项)
Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...
- 使用redis做缓存
redis常本用来作为缓存服务器.缓存的好处是减少服务器的压力,数据查询速度快.解决数据响应慢的问题. 添加缓存:只用redis的Hash数据类型添加缓存. 例如:需要在查询的业务功能中,添加缓存 1 ...
- opencv 3.1.0 访问像素值的三种方法(C++)
三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访 ...
- 迭代器&生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...