力導向 (Force-directed) 布局算法繪圖(布點)的簡單實現(xiàn)

描述

本文簡要介紹力導向算法的原理,提供了源碼和D3繪制的實驗結(jié)果圖。

Force-Directed Layout algorithms are graph drawing algorithms based only on information contained within the structure of the graph itself rather than relying on contextual information.

力導向布局算法是一類繪圖算法,它僅僅基于圖的解構(gòu)本身來繪圖,而不依賴于上下文信息。

力導向繪圖 (Force-directed graph drawing)可以用于描述關(guān)系圖的結(jié)點之間的關(guān)系,把結(jié)點分布到畫布上合理的位置,比如描述企業(yè)之間的關(guān)系,社交網(wǎng)絡(luò)中的人際關(guān)系等。

原理

斥力(Repulsive Force)

把每個節(jié)點看做一個電荷,電荷與電荷之間存在斥力,也就是庫侖力,根據(jù)庫侖定律( Coulomb's law),電子之間的斥力可以這么計算:

Coulomb's law

假設(shè)每個電子的電量都是1,那就有:

F = k/r2.

常數(shù)k可以根據(jù)畫布大小和電子數(shù)量計算。
由于需要更新x,y坐標,可以分別計算斥力產(chǎn)生的正向位移。

displacementX =  distX / dist * k * k / dist * ejectFactor

*關(guān)于計算x, y偏移和常數(shù)k的方式,可能并沒有特別明確的方式,這里可能并不是最優(yōu)的方法。

引力(Traction Force)

一些粒子之間被一些邊所牽連,這些邊產(chǎn)生類似彈簧的胡克引力:

Fs=ks(x?x0)

牽制著邊兩端的粒子。斥力和引力不斷作用,粒子在不斷位移之后趨于平衡,逐漸不再發(fā)生相對位移,能量不斷消耗,最終趨于零。

在引力和斥力地作用下不斷地更新坐標,經(jīng)過多次迭代達到一個穩(wěn)定狀態(tài),收斂結(jié)束。參數(shù)和迭代次數(shù)需要調(diào)試。

我分別用Java和JavaScript簡單實現(xiàn)了這個算法,并且利用D3做圖形化展示,下面是一些跑出來的數(shù)據(jù)呈現(xiàn)出的分布圖:

用Java和JavaScript簡單實現(xiàn)了這個算法,一些數(shù)據(jù)分布如下:

Graph 1. Iteration simulation of 24 nodes.
Graph 2. Randomly generated 20 nodes, each having 1~7 links.
Graph 3. Simulation of 100 nodes, iterating for 200 times.

代碼

代碼在我的Github上。


Refs:
https://www.ibm.com/developerworks/cn/web/0909_fudl_flashsocial/#major3
https://blog.csdn.net/newworld123made/article/details/51443603
http://philogb.github.io/blog/2009/09/30/force-directed-layouts/
https://bl.ocks.org/mbostock/4557698

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • D3.js里面有個force類可以實現(xiàn)對網(wǎng)絡(luò)拓撲圖的繪畫,其根本基礎(chǔ)是基于力導向算法來實現(xiàn)的。相關(guān)API信息如下:...
    bobcorbett閱讀 4,294評論 1 2
  • 2017年5月8日 一、背景 力導向圖非常適合于渲染關(guān)系型信息圖。 二、什么是力導向圖(Force-directe...
    HeyDelilah閱讀 21,840評論 3 9
  • 今天魚仔不想讀經(jīng)典,也不想去學跳舞,但還是堅持下來!引導真的好重要,人總是會有放棄的時候,但跨過去就好了!從小就是...
    miracleyiu閱讀 193評論 0 0
  • 小寶兒,昨晚發(fā)燒了,可把我急壞了,我騎著車子就往外跑,他爸喊我“回來,吃了飯再去”,我不聽“我不,我不去藥店就關(guān)...
    王爺有酒閱讀 385評論 0 1
  • 音頻:unit 08 unit 10 兒歌:泛聽 retell 1.Allen, let's watch the ...
    DS鑫花璐放閱讀 391評論 0 0

友情鏈接更多精彩內(nèi)容