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 1.2.x 升? 1.3.x 注意事项
May 06 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
Sep 14 Javascript
window.showModalDialog()返回值的学习心得总结
Jan 07 Javascript
JS生成随机字符串的多种方法
Jun 10 Javascript
Javascript原型链的原理详解
Jan 05 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
es6学习笔记之Async函数基本教程
May 11 Javascript
基于Vuejs和Element的注册插件的编写方法
Jul 03 Javascript
详解javascript中的babel到底是什么
Jun 21 Javascript
javascript中toFixed()四舍五入使用方法详解
Sep 28 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
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
激活 ActiveX 控件
2006/10/09 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python实现linux下使用xcopy的方法
2015/06/28 Python
python如何实现excel数据添加到mongodb
2015/07/30 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
python验证码图片处理(二值化)
2019/11/01 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
医学生临床实习自我评价
2014/03/07 职场文书
党员民主评议个人总结
2014/10/20 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
公司开除员工通知
2015/04/22 职场文书
行政答辩状范文
2015/05/21 职场文书
班级联欢会主持词
2015/07/03 职场文书