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 相关文章推荐
JS小框架 fly javascript framework
Nov 26 Javascript
Javascript 中的类和闭包
Jan 08 Javascript
基于Asp.net与Javascript控制的日期控件
May 22 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
Feb 15 Javascript
微信小程序五星评分效果实现代码
Apr 06 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
Feb 05 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
Sep 25 Javascript
使用Node.js实现一个多人游戏服务器引擎
Mar 13 Javascript
vue 路由守卫(导航守卫)及其具体使用
Feb 25 Javascript
分享一款超好用的JavaScript 打包压缩工具
Apr 26 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
Sep 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字符串 ==比较运算符的副作用
2009/10/21 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
Javascript中Eval函数的使用
2010/03/23 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
python3中property使用方法详解
2019/04/23 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
网络工程师的自我评价
2013/10/02 职场文书
高级人员简历的自我评价分享
2013/11/03 职场文书
人事主管的岗位职责
2013/11/16 职场文书
军校大学生个人的自我评价
2014/02/17 职场文书