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 相关文章推荐
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
图片轮换效果实现代码(点击按钮停止执行)
Apr 12 Javascript
jQuery实现购物车多物品数量的加减+总价计算
Jun 06 Javascript
使用phantomjs进行网页抓取的实现代码
Sep 29 Javascript
JavaScript中Cookie操作实例
Jan 09 Javascript
有效提高JavaScript执行效率的几点知识
Jan 31 Javascript
jQuery实现调整表格单列顺序完整实例
Jun 20 Javascript
静态页面html中跳转传值的JS处理技巧
Jun 22 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
小程序自定义组件实现城市选择功能
Jul 18 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
Aug 19 Javascript
小程序登录/注册页面设计的实现代码
May 24 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
验证码按回车不变解决方法
2013/03/29 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
微信小程序 navbar实例详解
2017/05/11 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
Python列表操作方法详解
2020/02/09 Python
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
SQL Server笔试题
2012/01/10 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
年级组长自我鉴定
2014/02/22 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
二年级作文之动物作文
2019/11/13 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js