我使用D3.js创建了太阳系的数据可视化。 在这样做时,我注意到在设置圆形元素的x,y位置以及圆形元素或弯曲路径元素的半径时出现了奇怪的不一致。 为了放下行星,我做了:
planetEnter.append("circle")
.attr("r", function (d) {
return planetScale(d.radius); })
.attr("class", "body")
.attr("fill", "url(#gradePlanet)")
.attr("filter", "url(#glowPlanet)")
.attr("transform", function (d) {
// Position of planet in relation to the sun at (0,0)
// x and y are linear scales
return "translate(" + x(d.orbital_radius) + ", " + y(0) + "), scale(.05)"; });
现在要创建轨道线,我做:
var orbital_arc = d3.svg.arc()
.startAngle(0)
.endAngle(6.28318531) // 360 degrees
.innerRadius(function (d) {
return x(d.orbital_radius); })
.outerRadius(function (d) {
return x(d.orbital_radius); });
现在你会认为这会起作用,弧的半径将与行星的位置相匹配,但事实并非如此。半径越大越好。为了弥补,我通过反复试验找到了这个神奇的数字:
var orbital_arc = d3.svg.arc()
.startAngle(0)
.endAngle(6.28318531) // 360 degrees
.innerRadius(function (d) {
return x(d.orbital_radius) - 470; }) // Magic number.
.outerRadius(function (d) {
return x(d.orbital_radius) - 470; }); // Magic number.
这个数字一直适用于每个轨道线,我无法理解为什么。 并且它不仅仅是路径元素,圆的半径也会变得更大:
planetEnter.append("circle")
.attr("r", function (d) {
return x(d.orbital_radius); })
.attr("class", "body")
.attr("transform", function (d) {
return "translate(" + x(0) + ", " + y(0) + ")"; });
以下是演示此内容的jsfiddles(如果您需要更好的视图,请进行平移和缩放):
Solar System with Magic Number
Solar System without Magic Number
那为什么我需要这个神奇的数字?
答案 0 :(得分:2)
D3中的角度以弧度为单位设置,因此您可以使用函数...
function degreesToRadians(degrees) {
return degrees * (Math.PI/180);
}
但是你总是在使用圈子,所以更简单地通过......来做得更优雅。
var tau = Math.PI * 2; //this is your first magic number
var orbital_arc = d3.svg.arc()
.startAngle(0)
.endAngle(tau)
至于第二个幻数(470)它是你宽度的一半,所以把它们放在一起就可以做到......
var tau = Math.PI * 2; //this is your first magic number
var orbital_arc = d3.svg.arc()
.startAngle(0)
.endAngle(tau)
.innerRadius(function (d) { return x(d.orbital_radius) - width/2; })
.outerRadius(function (d) { return x(d.orbital_radius) - width/2; });