使用canvas实现箭头效果

1.这篇为最基础的鼠标点击,移动生成一个随意方向的箭头,日后再把复杂的效果补上;

2.涉及到canvas,面向对象,一些数学角度运算,当然还有jq;

3.content:

首先canvas声明

var canvas=document.getElementById('canvas');

var ctx=canvas.getContent('2d');

接下来声明draw对象,省略部分取值,此处为骨干代码;

var draw=function(box,ctx,arr_arrow,flag){//box为最外层盒子,ctx canvas上下文,arr_arrow空数组用于储存,flag按钮

this.box=box;

this.ctx=ctx;

this.arr_arrow=arr_arrow;//储存箭头点

this.flag=flag;

this.moment();

this.retry();

};

draw.prototype={

moment:function(){

var flag_an=false; //事件驱动

 var t=this;

this.box.mousedown(function(e){

var e= e||window.event;

var obj={};

obj.a=e.offsetX;

obj.b=e.offsetY;

t.arr_arrow[0]=obj;

flag_an=true; });

this.box.mousemove(function(e){

if(flag_an){

var e= e||window.event;

var obj={};

obj.a=e.offsetX;

obj.b=e.offsetY;

t.arr_arrow[1]=obj;

t.ctx.clearRect(0,0,480,270);

t.draw_arrow();

} });

this.box.mouseup(function(){

flag_an=false;

});

} ,

draw_arrow:function(){ //箭头 //

var t=this;

t.develop(t.arr_arrow[0].a,t.arr_arrow[0].b,t.arr_arrow[1].a,t.arr_arrow[1].b);

},

jiantou:function(x,y,p,q){

var xn1,yn1,xn2,yn2;

xn1=(x-p)*Math.cos(Math.PI/4)-(y-q)*Math.sin(Math.PI/4)+p;

yn1=(x-p)*Math.sin(Math.PI/4)+(y-q)*Math.cos(Math.PI/4)+q;

xn2=(x-p)*Math.cos(Math.PI*1.75)-(y-q)*Math.sin(Math.PI*1.75)+p;

yn2=(x-p)*Math.sin(Math.PI*1.75)+(y-q)*Math.cos(Math.PI*1.75)+q;

return {x1:Number(xn1),x2:Number(xn2),y1:Number(yn1),y2:Number(yn2)

} //此处为箭头尖角处的旋转方法,改变角度即可调整,箭头开口大小

},

develop:function(a,b,p,q){

//绘制处代码

var that=this;

var a=a;

var b=b;

var p=p;

var q=q;

var x,y;

//第一象限

if(p<=a&&q<=b){

x=p+(Math.abs(p-a)/10); y=q+(Math.abs(q-b)/10);

};

//第二象限

if(p>=a&&q<=b){

x=p-(Math.abs(p-a)/10); y=q+(Math.abs(q-b)/10);

};

//第三象限

if(p<=a&&q>=b){

x=p+(Math.abs(p-a)/10); y=q-(Math.abs(q-b)/10);

}

//第四象限

if(p>=a&&q>=b){ x=p-(Math.abs(p-a)/10); y=q-(Math.abs(q-b)/10);

} //x,y为截取所绘制线段生成箭头端,1/10处的坐标。因为设置的箭头的尖角的长度是整体长度的1/10;

var objCenter=that.jiantou(x,y,p,q);//旋转坐标,返回为两个旋转后的坐标,位于线段两侧,并且与线段夹角为45度;

ctx.beginPath();

ctx.moveTo(a,b);

ctx.lineTo(p,q);

ctx.lineTo(objCenter.x1,objCenter.y1);

ctx.lineTo(p,q);

ctx.lineTo(objCenter.x2,objCenter.y2);

ctx.lineStyle=2;

ctx.strokeStyle='#00f';

ctx.stroke();

ctx.closePath();// 绘制,没什么好说的

}

}

4.基本上就可以简单达到所需的箭头效果,改天再加上复杂的配合,如箭头中部存在法线箭头,绘制多边形,多边形内部增加方向箭头,以及绘制多个箭头,可控制数目上限,并且标记箭头生成顺序等。

posted @ 2017-04-26 17:16  butchersheep  阅读(4967)  评论(0编辑  收藏  举报