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 相关文章推荐
event.srcElement+表格应用
Aug 29 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
jquery 关于event.target使用的几点说明介绍
Apr 26 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
Jan 09 Javascript
jquery修改网页背景颜色通过css方法实现
Jun 06 Javascript
Augularjs-起步详解
Jul 08 Javascript
微信小程序 图片宽度自适应的实现
Apr 06 Javascript
Bootstrap模态框插件使用详解
May 11 Javascript
JavaScript事件方法(实例讲解)
Jun 27 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
May 10 Javascript
JavaScript函数Call、Apply原理实例解析
Feb 17 Javascript
使用JS实现简易计算器
Jun 14 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生成静态页面详解
2006/12/05 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
PHP写日志的实现方法
2014/11/05 PHP
PHP的反射机制实例详解
2017/03/29 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
JavaScript中null与undefined分析
2009/07/25 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
python实现简单温度转换的方法
2015/03/13 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
开办加工厂创业计划书
2014/01/03 职场文书
临床护士自荐信
2014/01/31 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
离婚协议书范文2014
2014/10/16 职场文书
学生打架检讨书
2014/10/20 职场文书
幼儿园见习总结
2015/06/23 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS