d3拖拽元素之后如何获得对应坐标轴的值
let svg = d3.select('#create')
.append('svg')
.attr('id','chart')
.attr('width',width)
.attr("height",height);
//定义x轴y轴的比例尺
let xScale = d3.scaleLinear()
.domain([0,this.sliderMaxVal])
.range([0,width - padding.left - padding.right])
.clamp(true);
let yScale = d3.scaleLinear()
.domain([0,3])
.range([height - padding.top - padding.bottom,0])
.clamp(true);
//定义x轴y轴
let xAxis = d3.axisBottom().scale(xScale).ticks(10);
let yAxis = d3.axisLeft().scale(yScale).ticks(3);
//添加X轴y轴
svg.append('g')
.attr('class','axis')
.attr('transform','translate(' + padding.left + ',' + (height-padding.bottom) + ')')
.classed('axis-x',true)
.call(xAxis);
svg.append("g")
.attr('class','axis')
.attr('transform','translate(' + padding.left + ',' + padding.top + ')')
.classed('axis-y',true)
.call(yAxis);
//拖拽
let drag = d3.drag()
.on("start", function(d){
console.log("start");
}).on("end", function(d){
console.log(d3.mouse(this)[0]);
console.log("end");
}).on("drag", function(d){
d3.select(this.childNodes[0])
.attr("x",d3.event.x)
.attr("y",d3.event.y);
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据你x轴和y轴的比例尺定义,x轴轴上数值范围
[0, this.sliderMaxVal]
,坐标范围[0, width - padding.left - padding.right]
,y轴轴上数值范围[0, 3]
,坐标范围[height - padding.top - padding.bottom, 0]
即如下图:
按照比例尺,假设屏幕坐标为
$$ (x_0, y_0) $$
屏幕坐标向坐标系坐标转化矩阵为
$$
\begin{bmatrix} \
-\frac{3}{H - PT - PB} & 0 \\
0 & \frac{sliderMaxVal}{W - PL - PR}
\end{bmatrix}
$$
所以,坐标系坐标为
$$
x_1 = -\frac{3 \times x_0}{height - padding \cdot top - padding \cdot bottom} \\
y_1 = \frac{this \cdot sliderMaxVal \times y_0}{width - padding \cdot left - padding \cdot right}
$$
坐标系坐标为
$$
(-\frac{3 \times x_0}{height - padding \cdot top - padding \cdot bottom}, \frac{this \cdot sliderMaxVal \times y_0}{width - padding \cdot left - padding \cdot right})
$$