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 designer畫PCB中間挖洞
在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);