Spec-Zone.ru › D3.js 7

d3-force

Этот модуль реализует численный интегратор velocity Verlet для моделирования физических сил на частицах. Моделирование упрощено: предполагается постоянный единичный временной шаг Δt = 1 для каждого шага и постоянная единичная масса m = 1 для всех частиц. В результате сила F, действующая на частицу, эквивалентна постоянному ускорению a за интервал времени Δt и может быть смоделирована просто путем добавления к скорости частицы, которая затем добавляется к положению частицы.

В области визуализации информации физические моделирования полезны для изучения сетей и иерархий!

Force-Directed GraphForce-Directed Tree

Вы также можете моделировать круги (диски) с столкновениями, например, для диаграмм пузырей или диаграмм "пчелиных роев":

Collision DetectionBeeswarm

Вы даже можете использовать его как примитивный физический движок, скажем, для моделирования ткани:

Force-Directed Lattice

Для использования этого модуля создайте моделирование для массива узлов и составьте необходимые силы. Затем подпишитесь на события тика, чтобы отрисовать узлы по мере их обновления в вашей предпочтительной графической системе, такой как Canvas или SVG.

Установка

Если вы используете npm, npm install d3-force. Вы также можете загрузить последнюю версию на GitHub. Для обычного HTML в современных браузерах импортируйте d3-force из Skypack:

<script type="module">

import {forceSimulation} from "https://cdn.skypack.dev/d3-force@3";

const simulation = forceSimulation(nodes);

</script>

Для устаревших сред вы можете загрузить UMD-пакет d3-force с npm-базовой CDN, такой как jsDelivr; экспортируется глобальная переменная d3:

<script src="https://cdn.jsdelivr.net/npm/d3-dispatch@3"></script>
<script src="https://cdn.jsdelivr.net/npm/d3-quadtree@3"></script>
<script src="https://cdn.jsdelivr.net/npm/d3-timer@3"></script>
<script src="https://cdn.jsdelivr.net/npm/d3-force@3"></script>
<script>

const simulation = d3.forceSimulation(nodes);

</script>

Попробуйте d3-force в своём браузере.

Справочник по API

Моделирование

d3.forceSimulation([nodes]) · Источник

Создаёт новую симуляцию со указанным массивом узлов и без сил. Если nodes не указан, он по умолчанию равен пустому массиву. Моделировщик запускается автоматически; используйте simulation.on для подписки на события тика по мере выполнения моделирования. Если вы хотите запустить моделирование вручную, вызовите simulation.stop, а затем вызовите simulation.tick по своему усмотрению.

simulation.restart() · Источник

Перезапускает внутренний таймер моделирования и возвращает моделирование. В сочетании с simulation.alphaTarget или simulation.alpha этот метод может использоваться для «нагревания» моделирования во время взаимодействия, например, при перетаскивании узла, или для возобновления моделирования после временной паузы с помощью simulation.stop.

simulation.stop() · Источник

Останавливает внутренний таймер моделирования, если он запущен, и возвращает моделирование. Если таймер уже остановлен, этот метод ничего не делает. Этот метод полезен для ручного выполнения моделирования; см. simulation.tick.

simulation.tick([iterations]) · Источник

Вручную выполняет шаги моделирования на указанное число iterations и возвращает моделирование. Если iterations не указан, он по умолчанию равен 1 (один шаг).

Для каждого шага увеличивает текущее alpha на (alphaTarget - alpha) × alphaDecay; затем вызывает каждую зарегистрированную силу, передавая новое alpha; затем уменьшает скорость каждого узла на velocity × velocityDecay; наконец, увеличивает положение каждого узла на velocity.

Этот метод не отправляет событий; события отправляются только внутренним таймером, когда моделирование запускается автоматически при создании или при вызове simulation.restart.

Естественное количество тиков при запуске моделирования — ⌈log(alphaMin) / log(1 - alphaDecay)⌉; по умолчанию это 300.

Этот метод может использоваться в сочетании с simulation.stop для вычисления статической компоновки сил. Для больших графов статические компоновки должны вычисляться в веб-рабочем потоке, чтобы избежать зависания пользовательского интерфейса.

simulation.nodes([nodes]) · Источник

Если nodes указан, устанавливает узлы моделирования в указанный массив объектов, инициализируя их позиции и скорости при необходимости, а затем переинициализирует любые связанные силы; возвращает моделирование. Если nodes не указан, возвращает массив узлов моделирования, как указано в конструкторе.

Каждый узел должен быть объектом. Следующие свойства назначаются моделированием:

  • index - индекс узла с нуля в nodes
  • x - текущая позиция узла по оси x
  • y - текущая позиция узла по оси y
  • vx - текущая скорость узла по оси x
  • vy - текущая скорость узла по оси y

Положение ⟨x,y⟩ и скорость ⟨vx,vy⟩ могут быть изменены силами и моделированием. Если либо vx, либо vy равно NaN, скорость инициализируется как ⟨0,0⟩. Если либо x, либо y равно NaN, положение инициализируется в расположении филлотаксиса, чтобы обеспечить детерминированное, равномерное распределение.

Чтобы зафиксировать узел в заданном положении, можно указать два дополнительных свойства:

  • fx - фиксированное положение узла по оси x
  • fy - фиксированное положение узла по оси y

В конце каждого тика, после применения всех сил, узел с определённым node.fx имеет node.x, сброшенный к этому значению, а node.vx, установленный в ноль; аналогично, узел с определённым node.fy имеет node.y, сброшенный к этому значению, а node.vy, установленный в ноль. Чтобы разфиксировать узел, который был ранее зафиксирован, установите node.fx и node.fy в null или удалите эти свойства.

Если указанный массив nodes изменяется, например, при добавлении или удалении узлов из моделирования, этот метод должен быть вызван снова с новым (или изменённым) массивом, чтобы уведомить моделирование и привязанные силы об изменениях; моделирование не создаёт защитную копию указанного массива.

simulation.alpha([alpha]) · Источник

alpha примерно аналогично температуре в симулированном отжиге. Он уменьшается со временем по мере «остывания» моделирования. Когда alpha достигает alphaMin, моделирование останавливается; см. simulation.restart.

Если alpha указан, устанавливает текущее значение alpha до указанного числа в диапазоне [0,1] и возвращает это моделирование. Если alpha не указан, возвращает текущее значение alpha, которое по умолчанию равно 1.

simulation.alphaMin([min]) · Источник

Если min указан, устанавливает минимальное значение alpha до указанного числа в диапазоне [0,1] и возвращает это моделирование. Если min не указан, возвращает текущее минимальное значение alpha, которое по умолчанию равно 0,001. Внутренний таймер моделирования останавливается, когда текущее alpha меньше минимального alpha. Стандартная скорость затухания alpha ~0,0228 соответствует 300 итерациям.

simulation.alphaDecay([decay]) · Источник

Если decay указан, устанавливает скорость затухания alpha до указанного числа в диапазоне [0,1] и возвращает это моделирование. Если decay не указан, возвращает текущую скорость затухания alpha, которая по умолчанию равна 0,0228… = 1 - pow(0,001, 1 / 300), где 0,001 - это значение по умолчанию для минимального alpha.

Скорость затухания alpha определяет, насколько быстро текущее значение alpha интерполируется к целевому значению target alpha; так как целевое значение alpha по умолчанию равно нулю, по умолчанию это управляет тем, насколько быстро моделирование остывает. Более высокие значения скорости затухания приводят к более быстрому стабилизированию моделирования, но могут привести к застою в локальном минимуме; более низкие значения приводят к более длительному времени выполнения моделирования, но, как правило, сходятся к более подходящей компоновке. Чтобы моделирование работало вечно с текущим alpha, установите значение decay в ноль; альтернативно, установите целевое значение alpha больше, чем минимальное значение alpha.

END_OF_DOCUMENT_MARKER
simulation.alphaTarget([target]) · Source

Если target указано, устанавливает текущую целевую величину alpha до указанного числа в диапазоне [0,1] и возвращает эту симуляцию. Если target не указано, возвращает текущее целевое значение альфа, которое по умолчанию равно 0.

simulation.velocityDecay([decay]) · Source

Если decay указано, устанавливает коэффициент затухания скорости до указанного числа в диапазоне [0,1] и возвращает эту симуляцию. Если decay не указано, возвращает текущий коэффициент затухания скорости, который по умолчанию равен 0,4. Коэффициент затухания подобен атмосферному трению; после применения любых сил во время шага, скорость каждого узла умножается на 1 - decay. Как и при уменьшении скорости затухания альфа, меньшее затухание скорости может привести к лучшему решению, но рискует возникнуть числовые нестабильности и колебания.

simulation.force(name[, force]) · Source

Если force указано, назначает силу для указанного name и возвращает эту симуляцию. Если force не указано, возвращает силу с указанным именем или undefined, если такой силы нет. (По умолчанию новые симуляции не имеют сил.) Например, чтобы создать новую симуляцию для компоновки графа, вы можете сказать:

const simulation = d3.forceSimulation(nodes)
    .force("charge", d3.forceManyBody())
    .force("link", d3.forceLink(links))
    .force("center", d3.forceCenter());

Чтобы удалить силу с заданным name, передайте null в качестве force. Например, чтобы удалить силу заряда:

simulation.force("charge", null);
simulation.find(x, y[, radius]) · Source

Возвращает узел, ближайший к позиции ⟨x,y⟩ с заданным радиусом поиска radius. Если radius не указан, он по умолчанию равен бесконечности. Если в области поиска нет узла, возвращает undefined.

simulation.randomSource([source]) Source)

Если source указано, устанавливает функцию, используемую для генерации случайных чисел; это должна быть функция, которая возвращает число от 0 (включительно) до 1 (исключительно). Если source не указано, возвращает текущий случайный источник симуляции, который по умолчанию является генератором линейного конгруэнтного генератора с фиксированным зерном линейного конгруэнтного генератора. См. также random.source.

simulation.on(typenames, [listener]) · Source

Если listener указано, устанавливает обработчик событий listener для указанных typenames и возвращает эту симуляцию. Если обработчик событий уже был зарегистрирован для того же типа и имени, существующий обработчик удаляется перед добавлением нового. Если listener равно null, удаляет текущие обработчики событий для указанных typenames, если таковые имеются. Если listener не указано, возвращает первый из текущих обработчиков событий, соответствующий указанным typenames, если таковой имеется. При отправке указанного события каждый listener будет вызываться с this контекстом в качестве симуляции.

typenames — это строка, содержащая одно или несколько typename, разделенных пробелами. Каждое typename — это тип, необязательно после которого следует точка (.) и имя, например tick.foo и tick.bar; имя позволяет регистрировать несколько обработчиков событий для одного и того же типа. Тип должен быть одним из следующих:

  • tick — после каждого шага таймера внутренней симуляции.
  • end — после остановки таймера симуляции, когда alpha < alphaMin.

Обратите внимание, что события tick не отправляются при вызове simulation.tick вручную; события отправляются только внутренним таймером и предназначены для интерактивного отображения симуляции. Чтобы повлиять на симуляцию, вместо изменения позиций или скоростей узлов внутри обработчика событий шага, зарегистрируйте силы.

См. dispatch.on для получения дополнительных сведений.

Силы

Сила — это просто функция, которая изменяет позиции или скорости узлов; в этом контексте сила может применять классическую физическую силу, такую как электрический заряд или гравитация, или она может решать геометрическое ограничение, например, удерживать узлы внутри ограничивающей рамки или поддерживать связанные узлы на фиксированном расстоянии друг от друга. Например, простая сила позиционирования, которая перемещает узлы к началу координат ⟨0,0⟩, может быть реализована как:

function force(alpha) {
  for (let i = 0, n = nodes.length, node, k = alpha * 0.1; i < n; ++i) {
    node = nodes[i];
    node.vx -= node.x * k;
    node.vy -= node.y * k;
  }
}

Силы обычно считывают текущую позицию узла ⟨x,y⟩, а затем добавляют (или вычитают) из скорости узла ⟨vx,vy⟩. Однако силы также могут «заглядывать вперёд» в предсказанную следующую позицию узла ⟨x + vx,y + vy⟩; это необходимо для решения геометрических ограничений с помощью итеративного релаксации. Силы также могут изменять позицию напрямую, что иногда бывает полезно для предотвращения добавления энергии в симуляцию, например, при повторном центрировании симуляции в области просмотра.

Симуляции обычно комбинируют несколько сил по желанию. Этот модуль предоставляет несколько для вашего удовольствия:

  • Центрирование
  • Столкновение
  • Связи
  • Множественное тело
  • Позиционирование

Силы могут необязательно реализовать force.initialize, чтобы получить массив узлов симуляции.

force(alpha) · Source

Применяет эту силу, необязательно наблюдая указанную alpha. Как правило, сила применяется к массиву узлов, ранее переданному в force.initialize, однако некоторые силы могут применяться к подмножеству узлов или вести себя по-другому. Например, d3.forceLink применяется к источнику и цели каждой связи.

force.initialize(nodes) · Source

Предоставляет массив nodes и источник random для этой силы. Этот метод вызывается, когда сила привязывается к симуляции через simulation.force и когда узлы симуляции изменяются через simulation.nodes. Сила может выполнить необходимые действия во время инициализации, такие как оценка параметров на узел, чтобы избежать многократного выполнения работы во время каждого применения силы.

Центрирование

Центрирующая сила переводит узлы равномерно так, что средняя позиция всех узлов (центр масс, если все узлы имеют одинаковый вес) находится в заданной позиции ⟨x,y⟩. Эта сила изменяет позиции узлов при каждом применении; она не изменяет скорости, так как это обычно приведёт к тому, что узлы перейдут за желаемый центр и будут колебаться вокруг него. Эта сила помогает удерживать узлы в центре области просмотра, и, в отличие от силы позиционирования, она не искажает их относительные положения.

d3.forceCenter([x, y]) · Source

Создаёт новую центрирующую силу с указанными координатами x- и y-. Если x и y не указаны, они по умолчанию равны ⟨0,0⟩.

center.x([x]) · Source

Если x указано, устанавливает координату x центральной позиции на указанное число и возвращает эту силу. Если x не указано, возвращает текущую координату x, которая по умолчанию равна нулю.

center.y([y]) · Source

Если y указано, устанавливает координату y центральной позиции на указанное число и возвращает эту силу. Если y не указано, возвращает текущую координату y, которая по умолчанию равна нулю.

center.strength([strength]) · Source, Примеры

Если strength указано, устанавливает силу центрирования. Уменьшенная сила, например, 0,05, смягчает движения на интерактивных графиках, в которые входят или выходят новые узлы. Если strength не указано, возвращает текущую силу, которая по умолчанию равна 1.

Столкновение

Сила столкновения рассматривает узлы как окружности с заданным радиусом, а не как точки, и предотвращает перекрытие узлов. Более формально, два узла a и b разделяются так, чтобы расстояние между a и b было не менее radius(a) + radius(b). Для уменьшения дрожания по умолчанию используется «мягкое» ограничение с настраиваемой силой и количеством итераций.

d3.forceCollide([radius]) · Source

Создаёт новую силу кругового столкновения с указанным радиусом. Если radius не указан, он по умолчанию является константой для всех узлов.

collide.radius([radius]) · Source

Если указан radius, устанавливает обработчик радиуса в указанное число или функцию, повторно вычисляет обработчик радиуса для каждого узла и возвращает эту силу. Если radius не указан, возвращает текущий обработчик радиуса, который по умолчанию:

function radius() {
  return 1;
}

Обработчик радиуса вызывается для каждого узла в симуляции, принимая узел и его индекс, начиная с нуля. Полученное число затем хранится внутри, так что радиус каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым radius, а не при каждом применении силы.

collide.strength([strength]) · Source

Если указана strength, устанавливает силу взаимодействия в указанное число в диапазоне [0,1] и возвращает эту силу. Если strength не указан, возвращает текущую силу, которая по умолчанию равна 1.

Перекрывающиеся узлы разрешаются с помощью итеративной релаксации. Для каждого узла определяются другие узлы, которые, как ожидается, перекроются на следующем такте (используя ожидаемые позиции ⟨x + vx,y + vy⟩); скорость узла затем изменяется, чтобы вытолкнуть узел из каждого перекрывающегося узла. Изменение скорости ослабляется силой взаимодействия, так что разрешение одновременных перекрытий может быть объединены для нахождения устойчивого решения.

collide.iterations([iterations]) · Source

Если указано iterations, устанавливает количество итераций на каждое применение в указанное число и возвращает эту силу. Если iterations не указан, возвращает текущее значение количества итераций, которое по умолчанию равно 1. Увеличение количества итераций значительно увеличивает жёсткость ограничения и предотвращает частичное перекрытие узлов, но также увеличивает время выполнения для оценки силы.

Связи

Сила связи перемещает связанные узлы вместе или врозь в соответствии с желаемым расстоянием связи. Сила взаимодействия пропорциональна разнице между расстоянием связанных узлов и целевым расстоянием, что аналогично силе пружины.

d3.forceLink([links]) · Source

Создаёт новую силу связи со специфицированными links и параметрами по умолчанию. Если links не указаны, он по умолчанию равен пустому массиву.

link.links([links]) · Source

Если указан links, устанавливает массив связей, связанных с этой силой, пересчитывает параметры расстояния и силы для каждой связи и возвращает эту силу. Если links не указан, возвращает текущий массив связей, который по умолчанию пустой.

Каждая связь — это объект со следующими свойствами:

  • source - исходный узел связи; см. simulation.nodes
  • target - целевой узел связи; см. simulation.nodes
  • index - индекс, начиная с нуля, в links, назначенный этим методом

Для удобства свойства source и target связи могут быть инициализированы с использованием числовых или строковых идентификаторов вместо ссылок на объекты; см. link.id. Когда сила связи инициализируется (или повторно инициализируется, например, при изменении узлов или связей), любое свойство link.source или link.target, которое не является объектом, заменяется ссылкой на объект соответствующего узла с заданным идентификатором.

Если указанный массив links изменяется, например, при добавлении или удалении связей из симуляции, этот метод должен быть вызван снова с новым (или изменённым) массивом, чтобы уведомить силу о change; сила не создаёт защитную копию указанного массива.

link.id([id]) · Source

Если указан id, устанавливает обработчик идентификатора узла в указанную функцию и возвращает эту силу. Если id не указан, возвращает текущий обработчик идентификатора узла, который по умолчанию является числовым node.index:

function id(d) {
  return d.index;
}

Обработчик идентификатора по умолчанию позволяет указывать исходный и целевой узел каждой связи как индекс, начиная с нуля, в массиве узлов. Например:

const nodes = [
  {"id": "Alice"},
  {"id": "Bob"},
  {"id": "Carol"}
];

const links = [
  {"source": 0, "target": 1}, // Alice → Bob
  {"source": 1, "target": 2} // Bob → Carol
];

Теперь рассмотрим другой обработчик идентификаторов, возвращающий строку:

function id(d) {
  return d.id;
}

С этим обработчиком вы можете использовать именованные источники и цели:

const nodes = [
  {"id": "Alice"},
  {"id": "Bob"},
  {"id": "Carol"}
];

const links = [
  {"source": "Alice", "target": "Bob"},
  {"source": "Bob", "target": "Carol"}
];

Это особенно полезно при представлении графиков в формате JSON, так как JSON не поддерживает ссылки. См. этот пример.

Обработчик идентификаторов вызывается для каждого узла всякий раз, когда сила инициализируется, например, когда узлы или связи узлов или связей изменяются, принимая узел и его индекс, начиная с нуля.

link.distance([distance]) · Source

Если указан distance, устанавливает обработчик расстояния в указанное число или функцию, повторно вычисляет обработчик расстояния для каждой связи и возвращает эту силу. Если distance не указан, возвращает текущий обработчик расстояния, который по умолчанию:

function distance() {
  return 30;
}

Обработчик расстояния вызывается для каждой связи, принимая связь и её индекс, начиная с нуля. Результирующее число хранится внутри, так что расстояние каждой связи пересчитывается только при инициализации силы или при вызове этого метода с новым distance, а не при каждом применении силы.

link.strength([strength]) · Source

Если указан strength, устанавливает обработчик силы в указанное число или функцию, повторно вычисляет обработчик силы для каждой связи и возвращает эту силу. Если strength не указан, возвращает текущий обработчик силы, который по умолчанию:

function strength(link) {
  return 1 / Math.min(count(link.source), count(link.target));
}

Где count(node) — функция, возвращающая количество связей с данным узлом в качестве источника или цели. Этот параметр по умолчанию был выбран, так как он автоматически снижает силу связей, подключенных к сильно связанным узлам, улучшая устойчивость.

Обработчик силы вызывается для каждой связи, принимая связь и её индекс, начиная с нуля. Результирующее число хранится внутри, так что сила каждой связи пересчитывается только при инициализации силы или при вызове этого метода с новым strength, а не при каждом применении силы.

link.iterations([iterations]) · Source

Если указано iterations, устанавливает количество итераций на каждое применение в указанное число и возвращает эту силу. Если iterations не указан, возвращает текущее значение количества итераций, которое по умолчанию равно 1. Увеличение количества итераций значительно увеличивает жёсткость ограничения и полезно для сложных структур, таких как решётки, но также увеличивает время выполнения для оценки силы.

Сила взаимодействия между всеми узлами

Сила взаимодействия между всеми узлами (или сила n-тел) применяется ко всем узлам. Она может использоваться для моделирования гравитации (притяжения), если strength положительный, или электростатического заряда (отталкивания), если сила отрицательная. Эта реализация использует квадродерево и приближение Барнса-Хата для значительного повышения производительности; точность может быть настроена с помощью параметра theta.

В отличие от связей, которые влияют только на два связанных узла, сила заряда является глобальной: каждый узел влияет на каждый другой узел, даже если они находятся на несвязанных подграфах.

d3.forceManyBody() · Source

Создаёт новую силу взаимодействия между всеми узлами с параметрами по умолчанию.

manyBody.strength([strength]) · Source

Если указан strength, устанавливает обработчик силы в указанное число или функцию, повторно вычисляет обработчик силы для каждого узла и возвращает эту силу. Положительное значение заставляет узлы притягиваться друг к другу, подобно гравитации, а отрицательное значение заставляет узлы отталкиваться друг от друга, подобно электростатическому заряду. Если strength не указан, возвращает текущий обработчик силы, который по умолчанию:

function strength() {
  return -30;
}

Обработчик силы вызывается для каждого узла в симуляции, принимая узел и его индекс, начиная с нуля. Результирующее число хранится внутри, так что сила каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым strength, а не при каждом применении силы.

manyBody.theta([theta]) · Source

Если указан theta, устанавливает критерий приближения Барнса–Хата в указанное число и возвращает эту силу. Если theta не указан, возвращает текущее значение, которое по умолчанию равно 0.9.

Для ускорения вычислений эта сила использует приближение Барнса–Хата, которое занимает O(n log n) на каждое применение, где n — количество узлов. При каждом применении деревья квадрантов хранят текущие позиции узлов; затем для каждого узла вычисляется результирующая сила всех остальных узлов, действующая на данный узел. Для группы узлов, удалённых на большое расстояние, силу можно приблизить, рассматривая группу как один больший узел. Параметр theta определяет точность приближения: если отношение w / l ширины w ячейки дерева квадрантов к расстоянию l от узла до центра масс ячейки меньше theta, все узлы в данной ячейке рассматриваются как один узел, а не по отдельности.

manyBody.distanceMin([distance]) · Исходный код

Если distance указан, устанавливает минимальное расстояние между узлами, при котором эта сила учитывается. Если distance не указан, возвращает текущее минимальное расстояние, которое по умолчанию равно 1. Минимальное расстояние задаёт верхнюю границу силы между двумя близкими узлами, избегая нестабильности. В частности, оно предотвращает бесконечно большую силу, если два узла совпадают; в этом случае направление силы случайное.

manyBody.distanceMax([distance]) · Исходный код

Если distance указан, устанавливает максимальное расстояние между узлами, при котором эта сила учитывается. Если distance не указан, возвращает текущее максимальное расстояние, которое по умолчанию равно бесконечности. Указание конечного максимального расстояния повышает производительность и обеспечивает более локальную компоновку.

Позиционирование

Силы позиционирования x и y притягивают узлы к желаемому положению вдоль заданного измерения с настраиваемой силой. Сила radial аналогична, за исключением того, что она притягивает узлы к ближайшей точке на заданной окружности. Сила пропорциональна одномерному расстоянию между положением узла и целевым положением. Хотя эти силы могут использоваться для позиционирования отдельных узлов, они предназначены в первую очередь для глобальных сил, которые применяются ко всем (или большинству) узлам.

d3.forceX([x]) · Исходный код

Создаёт новую силу позиционирования вдоль оси x в направлении заданного положения x. Если x не указан, он по умолчанию равен 0.

x.strength([strength]) · Исходный код

Если strength указан, устанавливает функцию доступа к силе до заданного числа или функции, пересчитывает функцию доступа к силе для каждого узла и возвращает эту силу. strength определяет, насколько увеличить скорость узла по x: (x - node.x) × strength. Например, значение 0,1 указывает, что узел должен переместиться на десятую часть пути от его текущего положения x до целевого положения x при каждом применении. Более высокие значения перемещают узлы быстрее к целевому положению, часто в ущерб другим силам или ограничениям. Значение вне диапазона [0,1] не рекомендуется.

Если strength не указан, возвращает текущую функцию доступа к силе, которая по умолчанию:

function strength() {
  return 0.1;
}

Функция доступа к силе вызывается для каждого узла в симуляции, получая на вход узел и его нулевой индекс. Полученное число затем сохраняется внутри, так что сила каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым strength, а не при каждом применении силы.

x.x([x]) · Исходный код

Если x указан, устанавливает функцию доступа к координате x до заданного числа или функции, пересчитывает функцию доступа к x для каждого узла и возвращает эту силу. Если x не указан, возвращает текущую функцию доступа к x, которая по умолчанию:

function x() {
  return 0;
}

Функция доступа к x вызывается для каждого узла в симуляции, получая на вход узел и его нулевой индекс. Полученное число затем сохраняется внутри, так что целевая координата x каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым x, а не при каждом применении силы.

d3.forceY([y]) · Исходный код

Создаёт новую силу позиционирования вдоль оси y в направлении заданного положения y. Если y не указан, он по умолчанию равен 0.

y.strength([strength]) · Исходный код

Если strength указан, устанавливает функцию доступа к силе до заданного числа или функции, пересчитывает функцию доступа к силе для каждого узла и возвращает эту силу. strength определяет, насколько увеличить скорость узла по y: (y - node.y) × strength. Например, значение 0,1 указывает, что узел должен переместиться на десятую часть пути от его текущего положения y до целевого положения y при каждом применении. Более высокие значения перемещают узлы быстрее к целевому положению, часто в ущерб другим силам или ограничениям. Значение вне диапазона [0,1] не рекомендуется.

Если strength не указан, возвращает текущую функцию доступа к силе, которая по умолчанию:

function strength() {
  return 0.1;
}

Функция доступа к силе вызывается для каждого узла в симуляции, получая на вход узел и его нулевой индекс. Полученное число затем сохраняется внутри, так что сила каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым strength, а не при каждом применении силы.

y.y([y]) · Исходный код

Если y указан, устанавливает функцию доступа к координате y до заданного числа или функции, пересчитывает функцию доступа к y для каждого узла и возвращает эту силу. Если y не указан, возвращает текущую функцию доступа к y, которая по умолчанию:

function y() {
  return 0;
}

Функция доступа к y вызывается для каждого узла в симуляции, получая на вход узел и его нулевой индекс. Полученное число затем сохраняется внутри, так что целевая координата y каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым y, а не при каждом применении силы.

d3.forceRadial(radius[, x][, y]) · Исходный код

Radial Force

Создаёт новую силу позиционирования в сторону окружности заданного radius с центром в точке ⟨x,y⟩. Если x и y не указаны, они по умолчанию равны ⟨0,0⟩.

radial.strength([strength]) · Исходный код

Если strength указан, устанавливает функцию доступа к силе до заданного числа или функции, пересчитывает функцию доступа к силе для каждого узла и возвращает эту силу. strength определяет, насколько увеличить скорость узла по x и y. Например, значение 0,1 указывает, что узел должен переместиться на десятую часть пути от его текущего положения до ближайшей точки на окружности при каждом применении. Более высокие значения перемещают узлы быстрее к целевому положению, часто в ущерб другим силам или ограничениям. Значение вне диапазона [0,1] не рекомендуется.

Если strength не указан, возвращает текущую функцию доступа к силе, которая по умолчанию:

function strength() {
  return 0.1;
}

Функция доступа к силе вызывается для каждого узла в симуляции, получая на вход узел и его нулевой индекс. Полученное число затем сохраняется внутри, так что сила каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым strength, а не при каждом применении силы.

radial.radius([radius]) · Исходный код

Если radius указан, устанавливает радиус окружности до заданного числа или функции, пересчитывает функцию доступа к radius для каждого узла и возвращает эту силу. Если radius не указан, возвращает текущую функцию доступа к radius.

Функция доступа к radius вызывается для каждого узла в симуляции, получая на вход узел и его нулевой индекс. Результирующее число затем хранится внутри, так что целевой радиус каждого узла пересчитывается только при инициализации силы или при вызове этого метода с новым radius, а не при каждом применении силы.

radial.x([x]) · Исходный код

Если x указан, устанавливает координату x центра окружности до заданного числа и возвращает эту силу. Если x не указан, возвращает текущую координату x центра, которая по умолчанию равна нулю.

radial.y([y]) · Исходный код

Если y указан, устанавливает координату y центра окружности до заданного числа и возвращает эту силу. Если y не указан, возвращает текущую координату y центра, которая по умолчанию равна нулю.

© 2010–2023 Michael Bostock
Licensed under the BSD License.
https://github.com/d3/d3-force

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API