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 相关文章推荐
chrome原生方法之数组
Nov 30 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
May 31 Javascript
优化Jquery,提升网页加载速度
Nov 14 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
AngularJS HTML编译器介绍
Dec 06 Javascript
JS返回iframe中frameBorder属性值的方法
Apr 01 Javascript
avalonjs实现仿微博的图片拖动特效
May 06 Javascript
jQuery插件ajaxFileUpload使用实例解析
Oct 19 Javascript
yarn与npm的命令行小结
Oct 20 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
Jan 10 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 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
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
网页中的图片的处理方法与代码
2009/11/26 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
js实现登录验证码
2016/12/22 Javascript
js实现图片360度旋转
2017/01/22 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
python通过文件头判断文件类型
2015/10/30 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
户外用品商店创业计划书
2014/01/29 职场文书
中年人生感言
2014/02/04 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
平安工地汇报材料
2014/08/19 职场文书
网站出售协议书范文
2014/10/10 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书