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和ActionScript的交互实现代码
Aug 01 Javascript
用客户端js实现带省略号的分页
Apr 27 Javascript
js 数值转换为3位逗号分隔的示例代码
Feb 19 Javascript
json的定义、标准格式及json字符串检验
May 11 Javascript
JS 使用for循环遍历子节点查找元素
Sep 06 Javascript
javascript实现数组去重的多种方法
Mar 14 Javascript
微信小程序 数据绑定详解及实例
Oct 25 Javascript
node.js入门教程之querystring模块的使用方法
Feb 27 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
Jan 30 Javascript
vue移动端弹框组件的实例
Sep 25 Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 Javascript
微信小程序登录态和检验注册过没的app.js写法
May 22 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
2020最新CPU的性能排名
2020/04/02 数码科技
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP 事件机制(2)
2011/03/23 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
Flask框架的学习指南之用户登录管理
2016/11/20 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
python list排序的两种方法及实例讲解
2017/03/20 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
NumPy 数组使用大全
2019/04/25 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫
python实现学生信息管理系统(面向对象)
2022/06/05 Python