6

我对 SVG 和 d3.js 有点陌生。

在使用 D3 力布局绘制图形时,我使用了一个简单的对角线生成器并使用标记端来绘制箭头。

当使用弧线而不是对角线发生器时,箭头看起来很好。但是使用如下代码中的对角线生成器不会产生正确的标记:

var vis = this.vis = d3.select(el).append("svg:svg")
    .attr("width", w)
    .attr("height", h);

var force = d3.layout.force()
    .gravity(0.03)
    .distance(120)
    .charge(-800)
    .size([w, h]);

var linkDiag = d3.svg.diagonal()
    .projection(function(d)
    {
        return [d.x, d.y];
    });

vis.append("svg:defs")
        .selectAll("marker")
    .data(["normal", "special", "resolved"])
   .enter()
        .append("svg:marker")
    .attr("id", String)
    .attr("viewBox", "0 -5 10 10")
    .attr("refX", 15)
    .attr("refY", -1.5)
    .attr("markerWidth", 6)
    .attr("markerHeight", 6)
    .attr("orient", "auto")
    .append("svg:path")
    .attr("d", "M 0,-5 L 10,0 L0,5");

...然后还有:

    force.on("tick", function() {
        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; })
        .attr("d", linkDiag)
        .attr("marker-end", function(d) { return "url(#special)"; });

    });

标记根本不与顶点定向。

任何帮助,将不胜感激!

4

2 回答 2

3

它只是看起来好像箭头没有指向正确的方向,因为您正在通过refX和将箭头移动到新位置refY

例如,查看这个在各个方向绘制对角线的代码。箭头显示正确,但 180 度的箭头除外,但这可能是由于舍入误差。

现在,尝试将refX第 10 行的值更改为 5。现在,靠近水平方向的箭头看起来不正确。要更显着地看到这一点,请尝试将值更改为 8。

发生的事情是您隐藏了对角线的一部分,因此该线似乎在较早的点结束,该点的弯曲与实际端点略有不同。如果箭头太大以至于它覆盖了曲线的一部分,也会发生同样的事情。请注意,对于 d3 中的对角线,它们是对称的贝塞尔曲线,箭头应始终完美地指向水平或垂直方向。通过降低箭头的不透明度,您可以准确地看到正在发生的事情。

于 2013-08-14T05:39:27.827 回答
0

你能具体说明你的问题吗?但是,即使运行您的代码,我认为您的问题可能是

.attr("orient", "auto")

尝试指定 pos

于 2012-06-04T12:51:38.340 回答