gpt4 book ai didi

javascript - 如何使用 linkRadial 在两点之间绘制链接?

转载 作者:行者123 更新时间:2023-12-01 00:25:54 25 4
gpt4 key购买 nike

我需要在圆上的点和聚集在所述圆的中心的点之间手动绘制一些链接。我有源点和目标点的 x,y 对,但我不希望它们之间有一条简单的直线;我想要一条曲线(类似于树形图中的链接)。我可以使用 linkHorizontallinkVertical但它们的切线是恒定的;我想使用 linkRadial并让切线成为该特定弧点处的径向线(我也有度数)。

我不明白 linkRadial虽然 API;它需要一个 Angular 和一个半径,而不是 x 或 y 点。如何将我的两个 x,y 对(和径向线 Angular )转换为预期的 Angular 和半径?

最佳答案

由于您有一个带有 x 的数据数组和 y位置(“我有源点和目标点的 x,y 对”),您必须将它们转换为 angleradius .让我们看看怎么做。

首先,让我们看一个固定坐标的例子。例如,假设您有这个数据数组,其中 xy职位:

var data = [{
source: {y: 150,x: 75
},
target: {y: 300,x: 0
}
}, {
source: {y: 150,x: 75
},
target: {y: 0,x: 0
}
}, {
source: {y: 150,x: 75
},
target: {y: 150,x: 150
}
}, ];

使用此链接生成器...
var link = d3.linkHorizontal()
.x(function(d) {
return d.y;
})
.y(function(d) {
return d.x;
});

...你会得到一个这样的图表:

var data = [{
source: {
y: 150,
x: 75
},
target: {
y: 300,
x: 0
}
}, {
source: {
y: 150,
x: 75
},
target: {
y: 0,
x: 0
}
}, {
source: {
y: 150,
x: 75
},
target: {
y: 150,
x: 150
}
}, ];

var svg = d3.select("svg");

var link = d3.linkHorizontal()
.x(function(d) {
return d.y;
})
.y(function(d) {
return d.x;
});

svg.selectAll(null)
.data(data)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "blue")
.attr("d", link);
<script src="https://d3js.org/d3.v4.js"></script>
<svg></svg>


我们如何将其转换为可用于 d3.linkRadial() 的数据集?

一种选择是迭代每个对象,使用基本三 Angular 法来填充 angle。和 radius特性:
var radialData = data.map(function(d) {
return {
source: {
x: 0,
y: 0
},
target: {
x: Math.atan2(d.target.y - d.source.y, d.target.x - d.source.x) - Math.PI,
y: Math.sqrt((d.target.x - d.source.x) * (d.target.x - d.source.x) + (d.target.y - d.source.y) * (d.target.y - d.source.y))
}
};
});

然后,使用此链接生成器:
var linkRadial = d3.linkRadial()
.angle(function(d) {
console.log(d)
return d.x;
})
.radius(function(d) {
return d.y;
});

我们会有这个:

var data = [{
source: {
y: 150,
x: 75
},
target: {
y: 300,
x: 0
}
}, {
source: {
y: 150,
x: 75
},
target: {
y: 0,
x: 0
}
}, {
source: {
y: 150,
x: 75
},
target: {
y: 150,
x: 150
}
}, ];

var svg = d3.select("svg");

var radialData = data.map(function(d) {
return {
source: {
x: 0,
y: 0
},
target: {
x: Math.atan2(d.target.y - d.source.y, d.target.x - d.source.x) - Math.PI,
y: Math.sqrt((d.target.x - d.source.x) * (d.target.x - d.source.x) + (d.target.y - d.source.y) * (d.target.y - d.source.y))
}
};
});

var g = svg.append("g")
.attr("transform", "translate(150,75)")

var linkRadial = d3.linkRadial()
.angle(function(d) {
return d.x;
})
.radius(function(d) {
return d.y;
});

g.selectAll(null)
.data(radialData)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "red")
.attr("d", linkRadial);
<script src="https://d3js.org/d3.v4.js"></script>
<svg></svg>


现在将两个生成器放在一起,以进行比较:

var data = [{
source: {
y: 150,
x: 75
},
target: {
y: 300,
x: 0
}
}, {
source: {
y: 150,
x: 75
},
target: {
y: 0,
x: 0
}
}, {
source: {
y: 150,
x: 75
},
target: {
y: 150,
x: 150
}
}, ];

var svg = d3.select("svg");

var link = d3.linkHorizontal()
.x(function(d) {
return d.y;
})
.y(function(d) {
return d.x;
});

svg.selectAll(null)
.data(data)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "blue")
.attr("d", link);

var radialData = data.map(function(d) {
return {
source: {
x: 0,
y: 0
},
target: {
x: Math.atan2(d.target.y - d.source.y, d.target.x - d.source.x) - Math.PI,
y: Math.sqrt((d.target.x - d.source.x) * (d.target.x - d.source.x) + (d.target.y - d.source.y) * (d.target.y - d.source.y))
}
};
});

var g = svg.append("g")
.attr("transform", "translate(150,75)")

var linkRadial = d3.linkRadial()
.angle(function(d) {
return d.x;
})
.radius(function(d) {
return d.y;
});

g.selectAll(null)
.data(radialData)
.enter()
.append("path")
.attr("fill", "none")
.attr("stroke", "red")
.attr("d", linkRadial);
<script src="https://d3js.org/d3.v4.js"></script>
<svg></svg>

关于javascript - 如何使用 linkRadial 在两点之间绘制链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44958789/

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