gpt4 book ai didi

javascript - 在D3.js中动态创建节点

转载 作者:行者123 更新时间:2023-11-28 07:54:52 25 4
gpt4 key购买 nike

注意:我的第一篇 StackOverFlow 帖子,请耐心等待。

我的代码的目标:

  • 以用户友好的方式将连接图作为输入(我的意思是用户应该能够通过双击添加节点。当用户想要连接两个节点时,他/她可能只选择两个节点,并且应该有一种方法让用户输入两个选定节点之间的距离)。

  • 成功将图作为输入后,我想在图上执行各种操作,例如告诉节点“A”到节点“B”的最短路径是什么。

方法:

我决定使用 D3.js 来达到此目的。我是 JavaScript/jQuery 的新手,但我仍然从 https://www.dashingd3js.com/table-of-contents 学习了 D3.js 。我见过人们使用 D3.js 创建了非常漂亮的涉及图形的项目,但即使在基础知识上我也有点挣扎。

尝试:

我编写了以下代码来连接两个节点:

<!DOCTYPE html>
<html>

<head>
<title>D3 Try</title>
<script type="text/javascript" src="d3.min.js"></script>

</head>

<style>

.node {
fill: #ccc;
stroke: #fff;
stroke-width: 2px;
}

.link {
stroke: #777;
stroke-width: 2px;
}

</style>
<body style="background-color: red">

<h2>Hello world</h2>

<script type="text/javascript">

var height=500,width=960;

// If we leave out the x and y coordinates of the visualization, d3 selects
// random positions for the nodes

// nodes are arbitrary objects

var nodes = [ {x: width/3, y: height/2 } , {x: 2*width/3, y: height/2} ];

// Define the array which contains information about the links

var links= [ {source: 0, target: 1}];


// container to hold the visualisation

var svg=d3.select('body').append('svg').attr('width',width).attr('height',height);

// Create force layout object which contains dimensions of the container and
// the arrays of nodes and links


var force=d3.layout.force().size([width,height]).nodes(nodes).links(links);



// Documentation says that define a function in place of width/2 but fir bhi , how?


force.linkDistance(width/2);



var link=svg.selectAll('.link').data(links).enter().append('line').attr('class','link');

var node=svg.selectAll('.node').data(nodes).enter().append('circle').attr('class','node');



force.on('end',function(){




node.attr('r', width/25)
.attr('cx', function(d) { return d.x; })
.attr('cy', function(d) { return d.y; });



link.attr('x1', function(d) { return d.source.x; })
.attr('y1', function(d) { return d.source.y; })
.attr('x2', function(d) { return d.target.x; })
.attr('y2', function(d) { return d.target.y; });


});


force.start();








</script>





</body>

</html>

我遇到的问题以及我真正想问的问题:

  1. 上面的代码连接了两个节点,很好,但是如何在用户双击时动态创建这样的节点?这里可能需要注意的是,不仅需要在 SVG 上绘制节点,而且 nodeslinks 数组也要更新。如何动态更新这些硬编码数组,以便它们在其中存储最新信息?

  2. 两个节点之间的距离必须由用户输入,这里是一个常量 width/2 。我在 github 上查看了 API,他们说定义一个函数而不是常量。我搜索了但找不到任何示例。即使我使用 D3 提供的变量 d ,它也没有用,因为它必须依赖于用户。

有什么帮助吗?谢谢。

最佳答案

为此,您可以依靠 d3 .enter() 方法的魔力。这是一个对选择进行操作的数据,并为分配给当前未映射到 DOM 中的 SVG 元素的选择的每条数据返回一个占位符。

这意味着,如果您修改数据,则可以将该数据附加到选择中,并通过选择中的更改来表示数据中的任何更改。如果你想向数据添加一个节点,它会像这样工作:

//Modify data
nodes.push({x : d3.mouse(svg)[0], y : d3.mouse(svg)[1]});

//Modify data of node selection
node.data(nodes);

//Operate on new nodes
node.enter()
.append('circle')
.attr('class','node')
.attr('r', width/25)
.attr('cx', function(d) { return d.x; })
.attr('cy', function(d) { return d.y; });
.call(force.end);

由于您的前两个数据点在您首次创建它们时就已经分配了 DOM 节点,因此这只会为新数据点附加一个新的 circle 元素。

所有这些都将从 mousedownclick 的事件处理程序中调用,并以鼠标位置的形式获取用户输入。

关于javascript - 在D3.js中动态创建节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26222040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com