javascript基于HTML5 canvas制作画箭头组件


Posted in Javascript onJune 25, 2014

样例:

javascript基于HTML5 canvas制作画箭头组件

废话少说,直接上代码:

arrow.js

/**
 * 实现两点间画箭头的功能
 * @author mapleque@163.com
 * @version 1.0
 * @date 2013.05.23
 */
;(function(window,document){
 if (window.mapleque==undefined)
 window.mapleque={};
 if (window.mapleque.arrow!=undefined)
 return;
 
 /**
 * 组件对外接口
 */
 var proc={
 /**
 * 接收canvas对象,并在此上画箭头(箭头起止点已经设置)
 * @param context
 */
 paint:function(context){paint(this,context);},
 /**
 * 设置箭头起止点
 * @param sp起点
 * @param ep终点
 * @param st强度
 */
 set:function(sp,ep,st){init(this,sp,ep,st);},
 /**
 * 设置箭头外观
 * @param args
 */
 setPara:function(args){
  this.size=args.arrow_size;//箭头大小
  this.sharp=args.arrow_sharp;//箭头锐钝
 }
 };
 
 var init=function(a,sp,ep,st){
 a.sp=sp;//起点
 a.ep=ep;//终点
 a.st=st;//强度
 };
 var paint=function(a,context){
 var sp=a.sp;
 var ep=a.ep;
 if (context==undefined)
  return;
 //画箭头主线
 context.beginPath();
 context.moveTo(sp.x,sp.y);
 context.lineTo(ep.x,ep.y);
 //画箭头头部
 var h=_calcH(a,sp,ep,context);
 context.moveTo(ep.x,ep.y);
 context.lineTo(h.h1.x,h.h1.y);
 context.moveTo(ep.x,ep.y);
 context.lineTo(h.h2.x,h.h2.y);
 context.stroke();
 };
 //计算头部坐标
 var _calcH=function(a,sp,ep,context){
 var theta=Math.atan((ep.x-sp.x)/(ep.y-sp.y));
 var cep=_scrollXOY(ep,-theta);
 var csp=_scrollXOY(sp,-theta);
 var ch1={x:0,y:0};
 var ch2={x:0,y:0};
 var l=cep.y-csp.y;
 ch1.x=cep.x+l*(a.sharp||0.025);
 ch1.y=cep.y-l*(a.size||0.05);
 ch2.x=cep.x-l*(a.sharp||0.025);
 ch2.y=cep.y-l*(a.size||0.05);
 var h1=_scrollXOY(ch1,theta);
 var h2=_scrollXOY(ch2,theta);
 return {
  h1:h1,
  h2:h2
  };
 };
 //旋转坐标
 var _scrollXOY=function(p,theta){
 return {
  x:p.x*Math.cos(theta)+p.y*Math.sin(theta),
  y:p.y*Math.cos(theta)-p.x*Math.sin(theta)
 };
 };
 
 var arrow=new Function();
 arrow.prototype=proc;
 window.mapleque.arrow=arrow;
})(window,document);

arrow.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sample of the arrow</title>
<script type="text/javascript" src="./arrow.js"></script>
</head>
<body>
<canvas width=800 height=600 id="arrowLine">请使用支持HTML5的浏览器</canvas>
<script type="text/javascript">
var cont=document.getElementById("arrowLine").getContext('2d');
var a1=new window.mapleque.arrow();
a1.set({x:350,y:300},{x:200,y:200});
a1.paint(cont);
var a2=new window.mapleque.arrow();
a2.set({x:100,y:100},{x:200,y:250});
a2.paint(cont);
var a3=new window.mapleque.arrow();
a3.set({x:100,y:300},{x:150,y:150});
a3.paint(cont);
var a4=new window.mapleque.arrow();
a4.set({x:350,y:150},{x:150,y:250});
a4.setPara({
 arrow_size:0.5,
 arrow_sharp:0.5
})
a4.paint(cont);
</script>
</body>
</html>
Javascript 相关文章推荐
JavaScript调用ajax获取文本文件内容实现代码
Mar 28 Javascript
jQuery的cookie插件实现保存用户登陆信息
Apr 15 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
jQuery中contents()方法用法实例
Jan 08 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
Mar 01 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
基于jQuery实现瀑布流页面
Apr 11 jQuery
React如何利用相对于根目录进行引用组件详解
Oct 09 Javascript
详解Vue.js v-for不支持IE9的解决方法
Dec 29 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
Apr 15 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 Javascript
node.js学习总结之调式代码的方法
Jun 25 #Javascript
javascript获取元素偏移量的方法有哪些
Jun 24 #Javascript
Jquery之Bind方法参数传递与接收的三种方法
Jun 24 #Javascript
JQuery 在线引用及测试引用是否成功
Jun 24 #Javascript
extjs 时间范围选择自动判断的实现代码
Jun 24 #Javascript
搭建pomelo 开发环境
Jun 24 #Javascript
JavaScript支持的最大递归调用次数分析
Jun 24 #Javascript
You might like
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
json数据的列循环示例
2013/09/06 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
使用PDB模式调试Python程序介绍
2015/04/05 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
亿企通软件测试面试题
2012/04/10 面试题
应届行政管理专业个人自我评价
2013/12/28 职场文书
教师节宣传方案
2014/05/23 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
小学生成绩单评语
2014/12/31 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫