zoukankan      html  css  js  c++  java
  • D3平移和缩放后的点击坐标(D3 click coordinates after pan and zoom)

    我使用D3库来创建绘图应用程序。



    我需要在用户单击的坐标上绘制对象(为了简单起见)。问题是当用户使用平移&缩放和移动视口。
    然后对象是错误的位置的地方(我想问题是事件坐标是相对于svg元素而不是g,所以他们是计算没有适当的转换)。



    < pre> $('svg')。on('click',function(event){
    d3.select('#content-layer')。append )
    .attr('r',10)
    .attr('cx',event.offsetX)
    .attr('cy',event.offsetY)
    .attr ('stroke','black')
    .attr('fill','white');
    });

    var zoomBehavior = d3.behavior.zoom()
    .scaleExtent([1,10])
    .on('zoom',()=> {
    var translate =translate(+ d3.event.translate +);
    var scale =scale(+ d3.event.scale +);
    d3.select '#content-layer')。attr(transform,translate + scale);
    });

    d3.select('svg')。call(zoomBehavior);


    我试图添加点击回调到g元素,但它不工作



    这里是jsfiddle:
    https://jsfiddle.net/klinki/53ftaw7r/

    解决方案

    基本上你需要



    所以我创建了一个变量:



      var translateVar = [0,0]; 



    当您平移更新此变量时:



      translateVar [0] = d3.event.translate [0]; 
    translateVar [1] = d3.event.translate [1];



    并将其添加到圈子的坐标:



      .attr('cx',mouseCoords [0]  -  translateVar [0])
    .attr('cy',mouseCoords [1] - translateVar [1] )



    更新小提琴: https://jsfiddle.net/thatoneguy/53ftaw7r/2/



    您还需要照顾缩放因此做类似的事情:



      var scaleVar = 1; 



    在缩放时更新变量:



      scaleVar = d3.event.scale 



    新坐标:



      .attr('cx',(mouseCoords [0]  -  translateVar [0])/ scaleVar)
    .attr cy',(mouseCoords [1] - translateVar [1])/ scaleVar)



    a href =https://jsfiddle.net/thatoneguy/53ftaw7r/5/ =nofollow> https://jsfiddle.net/thatoneguy/53ftaw7r/5/

  • 相关阅读:
    ECharts
    JavaScript实现数组去重方法
    面试题1
    Vue中的8种组件通信方式
    渐进式web应用 (PWA)
    单元测试(Jest 和 Mocha)
    axios
    Vue Router
    Vuex
    hash 模式与 history 模式小记
  • 原文地址:https://www.cnblogs.com/smedas/p/12483427.html
Copyright © 2011-2022 走看看