要用svg作一個流程圖相似visio的連線,以下圖的git
其實有不少庫已經實現了流程圖,好比 jointjs,gojs,jsplumb 等等。惋惜都不是免費的。github
若是要作的簡單呢,就用貝塞爾曲線就行了,只須要提供起點終點兩個點的座標,就能用簡單的算法生成一個svg 的path了。這樣算法網上應該找獲得。算法
可是若是要用正交連線來實現,這個複雜度就上升了幾個檔次。咱們來看看正交連線的多個狀況:jsp
假設起點往下,目標節點在起始節點的右下方,那麼可能存在的狀況一共有四種。考慮到目標節點相對起始節點的方位有四種可能,那麼全部連線的可能有4*4=16 種,再考慮到起點出發方向也有四種,那麼全部的可能性有16 *4 = 64種。也就是說,若是你要用if else 來寫,須要寫64個分支。svg
固然沒必要寫64個if else ,寫程序不就是要抽象出規律嘛! 將這個連線分紅這麼幾個部分:性能
可是,我用了十八牛二虎之力找到了它的規律。spa
這個連線的最終走向與這幾個條件有關:3d
判斷平行: x0 * y1-x1 * y0 === 0;
判斷是否同公式,向量夾角爲0度,則向量點積爲1:x0 * y0 + x1 * y1 === 1
複製代碼
若是 正交線起始方向 == 正交線最終方向
那麼 轉彎數 = 2
不然 轉彎數 = 1
複製代碼
轉彎的座標點 = 正交線的第一個點 + 正交線起始方向向量
複製代碼
若是轉兩個彎,先獲取第一個轉彎點,既正交線始末方向的中點code
第一個轉彎點= 正交線的第一個點 + 正交線起始方向向量 * 0.5
複製代碼
再獲取第二個轉彎點 ,cdn
非起始方向向量 = 從直接向量的水平向量和豎直向量 中取出與起始方向向量垂直的那個向量
第二個轉彎點 = 第一個轉彎點 + 非起始方向向量
複製代碼
全部點的座標集合 = [起點,正交線的起點,...正交線的轉彎點,正交線的終點,終點]
複製代碼
這個算法的計算量不是很大,性能ok,適合邊拖曳邊重繪。但不是尋路算法,意味着沒有避讓節點的功能。
下一步要用曼哈頓算法來作一個。
這個demo拿去玩
desdesdesgo.github.io/flow-connec…
生成點的算法 github.com/Desdesdesgo…