1. 程式人生 > >HTML5 SVG畫在直線中間的箭頭

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

相關推薦

HTML5 SVG直線中間箭頭

箭頭的路徑實際上是一個等腰三角形的路線,所以用sin,cos,tan等三角函式則可準確計算出箭頭的位置和方向。 這樣,箭頭的方向就可以自動適應線條的方向,一點都不歪 如圖 JS程式碼 /** * 畫帶有箭頭的直線,箭頭在中間 * @param x1 * @para

直線 水平夾角的 帶箭頭

                                                           畫直線  水平夾角的   帶箭頭的 #include <graphics.h> #include <math.h> #define P

MFC中如何帶實心箭頭直線

工作中遇到話流程圖的專案,需要畫帶箭頭的直線,經過摸索,解決;思路如下: (1) 兩個點(p1,p2)確定一個直線,以直線的一個端點(假設p2)為原點,設定一個角度 (2)以P2為原點得到向量P2P1(P),向量P旋轉theta角得到向量P1,向量P旋轉-theta角得到向

HTML5 SVG

canvas rul https 更強 空間 同時 的確 公司 col 1.SVG歷史: 在2003年1月14日,SVG1.1被確定為W3C標準。 參與定義SVG的公司有:Adobe,apple,IBM等公司 2.什麽是SVG? Scalable Vector Gra

單文件中直線

之前需要將單文件分成兩個框 1.給對話方塊新增四個編輯框和一個按鈕。右鍵單擊編輯框,新增變數,類別為value,型別double,變數名m_startlinex。 2.在類檢視中,對話方塊類中右鍵在對話方塊標頭檔案中新增函式OnDrawline,同時在對話

gnuplot 跟據資料直線

#load '/Users/QY/Desktop/data.plt'   set xlabel  font "Helvetica,16"   #設定座標軸x標題的字型 set ylabel  font "Helvetica,16"  

[原創]altium designerPCB中間挖洞

在PCB中,keepout層畫圖形(圓形 扇形 矩形 都可以),然後選中這個圖形。在Tool選單下,點選convert, 兩種情況: 第一種(如果是畫PCB庫的話): 1. 選擇 create region from selected primitives(只有這個選項) 2. 然後雙擊

Matlab直線、圓、球

1、畫直線連線(x1,y1),(x2,y2) function [ ] = plot_line(x1,y1,x2,y2) plot([x1,x2],[y1,y2],'r-'); xlabel('x'); % x軸註解   ylabel('y'); % y軸註解   end

HoughLines()函式 直線在影象上

#include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; int main(

如何用svg一個騷氣的名字

1. 前言 前端實現動畫 即使很炫的那種,說白了 各種 @keyframe a b c d 組合加上自己的創意,也不是很難,直到有一天看到一個 像蚯蚓一樣 描邊的 動畫,感覺挺不錯,後來發現是svg 做的,於是學習了下 svg的基礎知識,搞了了一個顯示自己名字的動畫 2. svg 在本文中需要的基礎知識

如何用visio直線同時去掉跨線

1、最近在寫論文,用visio畫圖的過程中發現連線線都是折線,如下圖1所示。那麼如何才能畫出如圖2所示的直線來呢?                         

【計算機圖形】直線

由於計算機的解析度有限,計算機圖形只是看起來平滑,放大後就能看到階梯狀的鋸齒。(可以開啟windows畫圖檢驗)。所以畫線畫圓的本質問題就是下一個點取(x + 1, y )或(x, y + 1)還是(x + 1, y + 1)? 一、畫直線: 1. DDA(

Bresenham演算法直線

void Bresenham_line(CDC *pDC, int x0, int y0, int x1, int y1, long color) { int dx = abs(x1

xcb:直線,曲線,矩形

#include <stdlib.h> #include <stdio.h> #include <xcb/xcb.h> int main () { xcb_connection_t *c; xcb_screen_t *scree

計算機圖形學-----直線

void init(void){    glClearColor(1.0,1.0,1.0,0.0);    glMatrixMode(GL_PROJECTION);    gluOrtho2D(0.0,200.0,0.0,150.0);}void lineSegment(void){    glClear(G

Bresenham快速直線演算法

現在的計算機的影象的都是用畫素表示的,無論是點、直線、圓或其他圖形最終都會以點的形式顯示。人們看到螢幕的直線只不過是模擬出來的,人眼不能分辨出來而已。那麼計算機是如何畫直線的呢,其實有比較多的演算法,這裡講的是Bresenham的演算法,是光柵化的畫直線演算法。直線光柵化

unity利用Image直線,以及折線圖

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 掛載在parent上 /// </summ

(裝載)Unity使用UGUI的Image在Canvas中直線

http://www.mamicode.com/info-detail-2392052.html using System; using UnityEngine; using UnityEngine.UI; public class TestDrawLine : MonoBehaviour {

Emgu 邊緣檢測,LineSegment2D[]直線,CircleF[]

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sys

OPENGL—改進Bresenham直線

// 改進Bresenham畫直線 #include "stdafx.h" #include <gl/glut.h> #include <cmath> void init(void) { glClearColor(1.0,1.0,1.0,1.0);