【发布时间】:2014-09-16 10:22:01
【问题描述】:
D3 和 SVG 的新手,我很困惑为什么我使用旋转角度 + 弧距计算 x、y 坐标(围绕圆/钟面的 SVG 元素位置)的数学...本质上:
-
我创建了圆圈/钟面(包括翻译):
var face = d3.select(".chart").append("g") .attr("class", "clock-face") .attr('transform','translate(' + width/2 + ',' + (circleRadius + margin) + ')'); -
我在钟面上附加了一个“g”元素(包含数据+一些视觉内容),并对单个数据点容器应用旋转(基于线性比例以围绕圆定位元素):
var circleScale = d3.scale.linear() .range([0, data.length]) .domain([0, 60]); // data container var bar = face.selectAll('g') .data(data) .enter().append('g') .attr('transform', function(d, i) { return 'rotate(' + circleScale(i) + ')'; }) .each(function(d, i) { // set theta d.theta = circleScale(i); }); -
我希望能够根据它的 theta(旋转角度)值计算我的单个数据点容器的 x/y 坐标:
function calcPosition(centerX, centerY, radius, theta) { var coords = {}; var x = centerX + radius * Math.cos(theta); var y = centerX + radius * Math.sin(theta); coords.x = x; coords.y = y; return coords; }; var origin = calcPosition(0, 0, circleRadius, d.theta); face.append('circle') .attr('cx', origin.x) .attr('cy', origin.y) .attr('r', 5) .attr('fill', 'yellow')
但是,这会产生完全错误的 x/y 坐标。我相信我的三角函数在根据旋转角度计算 x/y 坐标时是正确的,但是关于 SVG 转换的一些事情正在搞砸这一切......有什么建议吗?
非常感谢!
【问题讨论】:
-
theta是 度 还是 弧度? -
@PaulS。好问题...原来我有这样的圆形比例: var circleScale = d3.scale.linear().range([0, data.length]).domain([0, 2 * Math.PI]);
-
但这产生了奇怪的结果(没有正确映射到 360 度)......但是由于某种原因将圆比例更改为以下工作......我看到这可能是我的错误点.但我对 D3 比例感到困惑: var circleScale = d3.scale.linear().range([0, data.length]).domain([0, 60]);
标签: javascript svg d3.js rotation