Force Layout
Last updated
Was this helpful?
Last updated
Was this helpful?
D3’ün kuvvet düzeni, görsel öğelerin konumlandırılması için fizik tabanlı bir simülatör kullanıyor. Kuvvetler, elemanlar arasında kurulabilir, örneğin:
tüm elemanlar birbirlerini iterler,
başka elementler ağırlık merkezlerine tutturulur
bağlantılı elemanlar birbirinden sabit bir mesafeye sahiptir
elementler üst üste gelmeyebilir (çarpışma tespiti)
Kuvvet yerleşimi, elemanları başka yollarla başarılması zor olacak şekilde konumlandırmamızı sağlar.
Örnek olarak, her biri A, B veya C kategorisine sahip olan birkaç çevremiz var ve aşağıdaki kuvvetleri ekledik:
tüm düğümler birbirini çeker (düğümleri bir araya getirmek için)
çarpışma algılama (dairelerin üst üste gelmesini durdurmak için),
kategorilerine bağlı olarak üç merkezden birine çekilir
Kuvvet yerleşimi, diğer D3 düzenlerinden daha büyük miktarda hesaplama (tipik olarak birkaç saniye gerektirir) gerektirir ve çözüm, adım adım (yinelemeli) bir şekilde hesaplanır. Genellikle, SVG / HTML öğelerinin konumları, simülasyon yinelendikçe güncellenir, bu nedenle düğümlerin sürekli konumlandırıldığını görürüz.
Burada basit 5 nesneye sahip bir dizi oluşturduk ve iki kuvvet işlevi forceManyBody
ve forceCenter
'ı sisteme ekledik. (Bunlardan birincisi elemanları birbirlerini iter, ikincisi ise elemanları bir merkez noktasına doğru çeker.)
Simülasyon her yinelendiğinde, ticked
fonksiyonu çağrılır. Bu işlev düğüm dizisini birleştirerek elemanları daire içine alır ve konumlarını günceller:
Kuvvet simülasyonunun gücü ve esnekliği, çekim, itme ve çarpışma algılama gibi bir takım etkilere ulaşmak için elementlerin pozisyonunu ve hızını ayarlayan kuvvet fonksiyonlarından gelir. Kendi kuvvet fonksiyonlarımızı tanımlayabiliriz, ancak D3 yerleşik olarak bir takım faydalı işlevlerle gelir:
forceCenter
(sistemin ağırlık merkezini ayarlamak için)
forceManyBody
(elemanların birbirini çekmesi veya itmesi için)
forceCollide
(çakışan elemanları önlemek için)
forceX
ve forceY
(elemanları belirli bir noktaya çekmek için)
forceLink
(bağlı elemanlar arasında sabit bir mesafe oluşturmak için)
forceCenter
, elemanlarınızı bir merkez noktası etrafında bir bütün olarak merkezlemek için (zorunlu değilse) kullanışlıdır. (Bu öğeler olmadan sayfadan kaybolabilir.)
Yukarıdaki 2 örnekte aynı şeyi yapar. Kullanım şekli tercihe kalmış. Eklemek için:
forceManyBody
, tüm öğelerin birbirini çekmesini veya itmesini sağlar. Çekim veya itme gücü, .strength()
kullanılarak ayarlanabilir; burada pozitif bir değer elementlerin birbirini çekmesine neden olurken, negatif bir değer elementlerin birbirlerini itmesine neden olur. Varsayılan değer -30'dur.
forceCollide
, üst üste gelen öğelerin durmasını sağlamak için kullanılır ve düğümlerin bir arada toplanması sırasında özellikle kullanışlıdır. .radius()
kullanarak elemanların yarıçapını belirtmeliyiz:
forceX
ve forceY
, elemanların belirtilen pozisyonlara doğru çekilmesine neden olur. Tüm elemanlar için tek bir merkez kullanabilir veya her eleman için bu gücü uygulayabiliriz.
Çekim gücü, .strength()
kullanılarak yapılandırılabilir. Örnek olarak, her biri 0, 1 veya 2 kategorisine sahip olan bir dizi öğemiz olduğunu varsayalım.
Yukarıdaki örneğin ayrıca forceCollide kullandığını unutmayın.
Eğer verilerimiz sayısal bir boyuta sahipse, elemanları bir eksen boyunca konumlandırmak için forceX veya forceY kullanabiliriz:
forceLink, bağlantılı elemanları aralarında sabit bir mesafe olacak şekilde iter. Hangi öğeleri birbirine bağlamak istediğimizi belirten bir dizi bağlantı gerektirir. Her link nesnesi, bir değer ve dizinin endeks olduğu değer olan bir kaynak ve hedef eleman belirtir.
Bağlantı dizimizi daha sonra .links()
kullanarak forceLink
işlevine aktarabiliriz:
Bağlantılı elemanların uzaklığı ve gücü .distance()
(varsayılan değer 30) ve .strength()
kullanılarak yapılandırılabilir.