HTML5 SVG画在直线中间的箭头

箭头的路径实际上是一个等腰三角形的路线,

所以用sin,cos,tan等三角函数则可准确计算出箭头的位置和方向。

这样,箭头的方向就可以自动适应线条的方向,一点都不歪

如图


JS代码

/**
 * 画带有箭头的直线,箭头在中间
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 * @returns path
 */
function drawLineArrow(x1,y1,x2,y2){
	  var path;
      var slopy,cosy,siny;
	  var Par=10.0;
      var x3,y3;
	  slopy=Math.atan2((y1-y2),(x1-x2));   
      cosy=Math.cos(slopy);   
      siny=Math.sin(slopy); 
   	 
   	  path="M"+x1+","+y1+" L"+x2+","+y2;
	     
      x3=(Number(x1)+Number(x2))/2;
	  y3=(Number(y1)+Number(y2))/2;

	  path +=" M"+x3+","+y3;
	  
	  path +=" L"+(Number(x3)+Number(Par*cosy-(Par/2.0*siny)))+","+(Number(y3)+Number(Par*siny+(Par/2.0*cosy)));

	  path +=" M"+(Number(x3)+Number(Par*cosy+Par/2.0*siny)+","+ (Number(y3)-Number(Par/2.0*cosy-Par*siny)));
	  path +=" L"+x3+","+y3;

	  return path;
}

我这里是用js拼装的一个path路径,如果是用其他的语言,如flex 等,把代码中的path拼装部分换成相应的2D对象方法 moveTo,lineTo 就好了


得到path之后用snap.svg 画出来就好了,

完整的代码,需要用到jquery 和 snap.svg

<svg id="svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="622px" height="417px">
	
</svg>
<script src="jquery.min.js"></script>
<script src="snap.svg-min.js"></script>


<script>
/**
 * 画带有箭头的直线,箭头在中间
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 * @returns path
 */
function drawLineArrow(x1,y1,x2,y2){
	  var path;
      var slopy,cosy,siny;
	  var Par=10.0;
      var x3,y3;
	  slopy=Math.atan2((y1-y2),(x1-x2));   
      cosy=Math.cos(slopy);   
      siny=Math.sin(slopy); 
   	 
   	  path="M"+x1+","+y1+" L"+x2+","+y2;
	     
      x3=(Number(x1)+Number(x2))/2;
	  y3=(Number(y1)+Number(y2))/2;


	  path +=" M"+x3+","+y3;
	  
	  path +=" L"+(Number(x3)+Number(Par*cosy-(Par/2.0*siny)))+","+(Number(y3)+Number(Par*siny+(Par/2.0*cosy)));


	  path +=" M"+(Number(x3)+Number(Par*cosy+Par/2.0*siny)+","+ (Number(y3)-Number(Par/2.0*cosy-Par*siny)));
	  path +=" L"+x3+","+y3;


	  return path;
}


$(function(){


	var svg = Snap("#svg");
	
	var path1 = drawLineArrow(100,120,200,300);
	svg.paper.path(path1).attr({
   		stroke: "red",
   		strokeWidth: 2	
	});


	var path2 = drawLineArrow(20,20,20,70);
	svg.paper.path(path2).attr({
   		stroke: "blue",
   		strokeWidth: 2	
	});


	var path3 = drawLineArrow(70,30,170,30);
	svg.paper.path(path3).attr({
   		stroke: "black",
   		strokeWidth: 2	
	});
});
</script>

完整Demo下载地址: http://download.csdn.net/detail/tuposky/8107475


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五只鸭子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值