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 相关文章推荐
JMenuTab简单使用说明
Mar 13 Javascript
编写简单的jQuery提示插件
Dec 21 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
Jquery获取当前城市的天气信息
Aug 05 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
微信小程序 组件的外部样式externalClasses使用详解
Sep 06 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 Javascript
vue实现信息管理系统
May 30 Javascript
react结合bootstrap实现评论功能
May 30 Javascript
JS实现手风琴特效
Nov 08 Javascript
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
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 定界符格式引起的错误
2011/05/24 PHP
PHP数组实例总结与说明
2011/08/23 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
Javascript中eval函数的使用方法与示例
2007/04/09 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
django 信号调度机制详解
2019/07/19 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
项目考察欢迎辞
2014/01/17 职场文书
少先队学雷锋活动总结范文
2014/03/09 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
倡议书的写法
2014/08/30 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
批评与自我批评范文
2014/10/15 职场文书
新员工入职感想
2015/08/07 职场文书
MySQL七种JOIN类型小结
2021/10/24 MySQL
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis