代码之家  ›  专栏  ›  技术社区  ›  thatOneGuy

d3力网络图中SVG路径呈现不正确

  •  0
  • thatOneGuy  · 技术社区  · 8 年前

    我不知道这里发生了什么,但是当我绘制网络图时,结果是这样的:

    注意右边的蓝线。我有缩放能力,当我缩放时,右边的蓝色路径会消失。

    我的代码库很大,所以我将尝试将一个示例的代码笔放在一起,看看是否可以重新创建它。但我用这个作为创建曲线链接的指南:

    https://bl.ocks.org/mbostock/4600693

    这是我遇到问题的时候。

    网络创建的一些代码:

    数据< /P>

    var bilinks=[];
    边。foreach(函数(d){
    var s=d.源;
    var t=d.目标;
    var i={};
    边推({)
    资料来源:
    目标:我
    },{
    资料来源:
    目标:T
    (});
    
    推送(I)节点;
    推送({)
    资料来源:
    目标:
    米德诺德:我
    (});
    (});
    < /代码> 
    
    

    路径创建:

    链接中心 追加(“路径”) .attr('i d',函数(d,i){ 返回D.ID }) .attr('类','网络路径') .attr(“行程”,功能(d){ 返回颜色(d.color); }) .attr(“笔画宽度”,1) .attr('填充','无') .on(“单击”,函数(d){ 控制台。日志(D); }) < /代码>

    也许有一个类似的问题,但我不确定要搜索什么。

    顺便说一下,右边的蓝线不能用开发者选择工具来选择。我不确定它会怎样,但看起来与您的显示器连接松动时类似,我真的不确定。

    :

    所以,我隐藏了节点,并进入元素区域。将鼠标悬停在上面看到的路径上,如您所见,边界很小。当我将内容隐藏在蓝色框中时,右边的一堆路径就消失了。当我取消隐藏元素时,它们会返回。我不能通过dev tools中的select工具选择右边的路径。

    <>编辑< /P>

    勾选功能,绘制路径:

    link.selectall('path').attr('d',function(d){
    //
    //从源到目标的x和y的总差
    var diffx=d.target.x-d.source.x;
    var diffy=d.target.y-d.source.y;
    
    //从源节点中心到目标节点中心的路径长度
    var pathlength=math.sqrt((diffx*diffx)+(diffy*diffy));
    
    //目标节点中心到外边缘的X和Y距离
    var offsetx=(diffx*nodesize)/路径长度;
    var offsety=(diffy*nodesize)/路径长度;
    
    //返回“m”+d.source.x+“,+d.source.y+“l”+(d.target.x-offsetx)+“,”+(d.target.y-offsety);
    
    var thispath='m'+d.source.x+','+d.source.y+
    's'+d.middlenode.x+','+d.middlenode.y+
    “+(d.target.x-offsetx)+”,“+(d.target.y-offsety);
    
    返回此路径;
    
    (});
    < /代码> 
    
    

    下面是bostock的代码笔示例:https://codepen.io/anon/pen/epjbkz

    如果将其中一个节点拖到另一个节点的上,您应该能够看到这个问题。

    注意右边的蓝线。我有缩放能力,当我缩放时,右边的蓝色路径消失了。

    我的代码库很大,所以我将尝试将一个示例的代码笔放在一起,看看是否可以重新创建它。但我将其用作创建曲线链接的准则:

    https://bl.ocks.org/mbostock/4600693

    这是我遇到问题的时候。

    网络创建的一些代码:

    数据

    var bilinks = [];
    edges.forEach(function (d) {
        var s = d.source;
        var t = d.target;
        var i = {};
        edges.push({
            source: s,
            target: i
        }, {
            source: i,
            target: t
        });
    
        nodes.push(i);
        bilinks.push({
            source: s,
            target: t,
            middleNode: i
        });
    });
    

    路径创建:

    linkEnter
        .append('path')
        .attr('id', function (d, i) {
            return d.id
        })
        .attr('class', 'network-path')
        .attr('stroke', function (d) {    
            return colour(d.color);
        })
        .attr('stroke-width', 1)
        .attr('fill', 'none')
        .on('click', function (d) {
            console.log(d);
        })
    

    也许有一个类似的问题,但我不确定要搜索什么。

    顺便说一下,右边的蓝线不能用开发者选择工具来选择。我不知道会怎样,但看起来像是当你的显示器连接松动时,我真的不确定。

    补充:

    enter image description here

    所以,我隐藏了节点,进入了元素区域。将鼠标悬停在上面看到的路径上,如您所见,边界很小。当我将内容隐藏在蓝色框中时,右边的一堆路径就消失了。当我取消隐藏元素时,它们会返回。我不能通过dev tools中的select工具选择右边的路径。

    编辑

    勾选功能,绘制路径:

    link.selectAll('path').attr('d', function (d) {
        // ----
        // Total difference in x and y from source to target
        var diffX = d.target.x - d.source.x;
        var diffY = d.target.y - d.source.y;
    
        // Length of path from center of source node to center of target node
        var pathLength = Math.sqrt((diffX * diffX) + (diffY * diffY));
    
        // x and y distances from center to outside edge of target node
        var offsetX = (diffX * nodeSize) / pathLength;
        var offsetY = (diffY * nodeSize) / pathLength;
    
        // return "M" + d.source.x + "," + d.source.y + "L" + (d.target.x - offsetX) + "," + (d.target.y - offsetY);
    
        var thisPath = 'M' + d.source.x + ',' + d.source.y +
            'S' + d.middleNode.x + ',' + d.middleNode.y +
            ' ' + (d.target.x - offsetX) + ',' + (d.target.y - offsetY);
    
        return thisPath;
    
    });
    

    以下是Bostock示例的代码:https://codepen.io/anon/pen/ePJbKZ

    如果将其中一个节点拖到另一个节点的上,您应该能够看到这个问题。

    1 回复  |  直到 8 年前
        1
  •  2
  •   rioV8    8 年前

    问题是当三次贝塞尔样条曲线的点是同线性的。

    如果你设置 d3.forceManyBody() 达到…的强度 -1 效果更明显。

    看起来这是一个渲染问题(舍入误差)在删除这些三次贝塞尔样条。如果将节点拖动到重影线上,它们将消失,因为SVG的这一部分将被重新渲染。

    选择不同的样条曲线类型 Q 或 L (直线)没有此擦除问题。