Фиксированные узлы не фиксируются (d3 Force Directed Graph)

Я устанавливаю узлы для фиксации с помощью

let link = svg.append("g")
  .attr("class", "links")
  .selectAll("line")
  .data(graph.links)
  .enter().append("line")
  .attr("stroke-width",  () => 4)

let node = svg.append('g')
  .attr("class", "nodes")
  .selectAll(".node")
  .data(graph.nodes)
  .enter().append("g")
  .attr("class", "node")
  .call(
    d3.drag()
    .on("start", Node.dragstarted)
    .on("drag", Node.dragged)
    .on("end", Node.dragended))

node.append("title")
  .text(d => d.country)

node.append('image')
    .attr('xlink:href', d => 'https://rawgit.com/hjnilsson/country-flags/master/svg/' + d.code + '.svg')
    .attr('height', d => 2.5 * (area[d.code]||5))
    .attr('width', d => 4 * (area[d.code])||5)
simulation
  .nodes(graph.nodes.map(c => {
    if(latlong[c.code] === undefined) {
      console.log(c,'missing lat/long data')
      return c
    }
    c.x = (+latlong[c.code][0])
    c.y = (+latlong[c.code][1])
    c.fixed = true
    return c
  }))
  .on("tick", ticked)

Это правильно отображает изображения в явно разных местах, чем без значений x и y, но .. фиксированное свойство не работает.

Вот мой код: codepen

Если кто-нибудь также знает, как я могу настроить холст так, чтобы ничего не ускользнуло сверху или снизу, я тоже был бы признателен.


person roberto tomás    schedule 03.05.2017    source источник
comment
почему вы устанавливаете свойство c.fixed=true?   -  person bumbeishvili    schedule 04.05.2017
comment
это главное, о чем этот пост. У меня есть данные для моих узлов, таких как { foo: 'bar', baz: 'bam' ...} . Я установил его там, чтобы он также имел координаты x, y и был зафиксирован, чтобы узлы не двигались. Я делаю что-то не так, назначая его таким образом? см. ответ здесь   -  person roberto tomás    schedule 04.05.2017
comment
каково ожидаемое поведение?   -  person thedude    schedule 04.05.2017
comment
узлы остаются неподвижными, даже когда вы их перетаскиваете. в этом случае мне не нужна физика   -  person roberto tomás    schedule 04.05.2017
comment
вы нигде не используете принудительную раскладку, может быть, проблема в этом   -  person bumbeishvili    schedule 04.05.2017
comment
@bumbeishvili о чем ты говоришь. это силовая раскладка, насколько я понимаю. любой форсированный граф, использующий метод forceSimulation(), является принудительным макетом. см., например: принудительный ориентированный граф, где он иллюстрирует один и явно ссылается на принудительные макеты с использованием того же, например этого   -  person roberto tomás    schedule 04.05.2017
comment
извините, я пропустил codepen   -  person bumbeishvili    schedule 04.05.2017


Ответы (1)


d3.js v4 не имеет свойства fixed. Вместо этого вам нужно установить атрибуты узлов fx и fy. Обратите внимание, что ваши функции перетаскивания уже делают это.

.nodes(graph.nodes.map(c => {
if(latlong[c.code] === undefined) {
  console.log(c,'missing lat/long data')
  return c
}
c.fx = c.x = (+latlong[c.code][0])
c.fy = c.y = (+latlong[c.code][1])
return c
}))

https://codepen.io/anon/pen/ZKXmVe

person Andrew    schedule 05.05.2017
comment
так что оказывается, что хороший коэффициент выдумки для использования: `c.fx = c.x = (+latlong[c.code][1] * (width/246.3)) + width / 2; c.fy = c.y = (+latlong[c.code][0] * (высота/130) * -1) + высота / 2;` .. это было правильно, и я благодарю вас. Единственная оставшаяся проблема в том, что пара флажков слетает и не может быть остановлена. - person roberto tomás; 06.05.2017