javascript - 未根据旋转角度正确计算秒数
问题描述
jsFiddle:演示
根据下面的小提琴或片段,您可以看到我有一个包含 5 个小圆圈的大圆圈。在下图中,我为所有圈子提供了数字。现在,当您尝试旋转小圆圈 1 时,它可以正常工作并以正确的方式增加数字(显示在左下角)。
现在尝试将其他圆圈一一旋转(2,3,4,5),您会看到数字显示不正确的负值,它应该在旋转时始终显示正确的秒数。
我已经更新了代码中的线性比例:
var timeScale = d3.scale.linear().range([0, 360]).domain([0, 60]);
基于每个圆圈的起始位置,但它不起作用。
谁能帮我解决这个问题?
var values = [
{value: 33, label: 'A'},
{value: 33, label: 'B'},
{value: 33, label: 'C'},
{value: 33, label: 'D'},
{value: 33, label: 'E'}
];
var total = 0;
var dragging = null;
var circleTransform;
var circleCoordinates;
values.forEach(function (d) {
d.absoluteValue = total;
total += d.value;
});
var height = 300, width = 300, margin = {top: 20, left: 20, bottom: 20, right: 20};
var radius = (height - margin.top - margin.bottom) / 2;
var parent = d3.select('.ring-input').append('svg')
.attr({
height: height,
width: width
}).append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
var angularScale = d3.scale.linear().range([0, 360]).domain([0, total]);
var timeScale = d3.scale.linear().range([0, 360]).domain([0, 60]);
var ring = parent.append('g').attr('id', 'rim').attr('transform', 'translate(' + radius + ',' + radius + ')');
ring.append('circle').attr({
r: radius,
'class': 'ring'
})
var handles = parent.append('g').attr('id', 'handles').attr('transform', 'translate(' + radius + ',' + radius + ')');
var drag = d3.behavior.drag()
.origin(function (d) {
return d;
})
.on("dragstart", function () {
circleTransform = d3.transform(d3.select(this).attr("transform"));
circleCoordinates = circleTransform.translate;
})
.on("drag", dragmove)
.on('dragend', function () {
d3.select(this)
.classed('active', false)
.attr({
transform: circleTransform
});
document.getElementById('estimated-time').innerHTML = 0;
});
//position the handles based on the input values
function drawHandles() {
var join = handles.selectAll('circle').data(values);
join.enter()
.append('circle').attr({
r: 10,
'class': 'handle'
}).on("mouseover", function () {
d3.select(this).classed('active', true);
})
.on("mouseout", function () {
d3.select(this).classed('active', false);
})
.call(drag);
join.attr({
transform: function (d) {
return 'rotate(' + angularScale(d.absoluteValue) + ') translate(' + radius + ',0)'
}
})
}
drawHandles();
function dragmove(d, i) {
d3.select(this).classed('active', true);
var coordinates = d3.mouse(parent.node());
var x = coordinates[0] - radius;
var y = coordinates[1] - radius;
var newAngle = Math.atan2(y, x) * 57.2957795;
if (newAngle < 0) {
newAngle = 360 + newAngle;
}
d.absoluteValue = angularScale.invert(newAngle);
var startAngle = Math.atan2(circleCoordinates[1], circleCoordinates[0]) * 57.2957795;
if (startAngle < 0) {
startAngle = 360 + startAngle;
}
timeScale.range([startAngle, startAngle + 360]);
document.getElementById('estimated-time').innerHTML = Math.round(timeScale.invert(newAngle));
//REDRAW HANDLES
drawHandles()
}
.handle {
fill: #FFF;
stroke: #000;
stroke-width: 4;
cursor: all-scroll;
}
.handle.active {
stroke: #F00;
}
.ring {
fill: none;
stroke: #000;
stroke-width: 4;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div class="ring-input"></div>
<div id="estimated-time">0</div>
解决方案
推荐阅读
- flutter - 为什么默认颤振文件夹名称 lib?
- c# - 在 .net 核心中重用来自 .net 4.5.2 web api 的 oauth 令牌
- python - boost.python module extension generates SIGSEGV
- node.js - npm installl node-icu-charset-detector 出错
- python - opencv warpAffine 忽略 flags=cv2.INTER_AREA
- sql - 更新特定案例的选择
- bpf - 使用 BPF 获取 XFRM 状态
- sparql - 涉及汉字的 SPARQL 查询
- javascript - 为什么我的项目中所有 Lodash 功能都不可用?(“不是函数”错误)
- c - objdump 产生错误的分支操作码解释