2017-12-01 7 views
0

안녕하세요. D3을 사용하여이 예와 같은 경로로 마커 전환을 다시 시작하려고합니다. D3 tween - pause and resume controls 더하기 특정 마커 전환을 중지하십시오. 데이터 포인트는 D3 transition along segments of path and pause at coordinate values입니다. 마커를 클릭하여 전환을 시작하고 마커를 클릭 한 다음 다시 시작하면 마침표가 잠시 멈추고 다시 시작할 수 있습니다.D3 경로를 따라 전환하여 지형 데이터 좌표를 클릭 할 수있게합니다.

마커를 완전히 멈추고 싶습니다. 포인트를 사용하여 특정 작업을 수행 할 수 있습니다. 즉, json 데이터를 기반으로 특정 클릭 포인트에 대해 xlink : href를 클릭하여 페이지를 종료 한 다음 반환하십시오. 마커 전환점으로 이동하고 중단 한 지점에서 전환점을 다시 시작합니다.

나는 전환 함수에 pauseValues를 전달해야하지만이 작업을 수행하는 방법을 이해할 수 없다고 생각합니다. 나는 당신의 마지막 질문 당신을 도움

<!DOCTYPE html> 
<html lang="en"> 

<head> 
    <meta charset="utf-8"> 

    <script src="https://d3js.org/d3.v4.min.js"></script> 

<style type="text/css"> 
    body { 
    font-family: "Helvetica Neue", Helvetica, sans-serif; 
    color: red; 
    } 


    circle { 
    fill: steelblue; 
    stroke: steelblue; 
    stroke-width: 3px; 
    } 

    .point { 
    fill: green; 
    } 

    .line { 
    fill: none; 
    stroke: red; 
    stroke-width: 4; 
    stroke-dasharray: 4px, 8px; 
    } 

</style> 

<body> 

    <script> 
    var width = 960, 
     height = 500; 

    var data = [ 
    [610.4199794444444, 243.7191682432953], //Paris 
     [480, 200], 
     [580, 400], 
     [680, 100], 
     [780, 300], 
     [180, 300], 
     [280, 100], 
     [380, 400] 
    ]; 

    var duration = 20000/data.length, 
     pauseTime = 2000; 

    var line = d3.line() 
     .x(function(d) { 
     return (d)[0]; 
     }) 
     .y(function(d) { 
     return (d)[1]; 
     }); 

    var svg = d3.select("body") 
     .append("svg") 
     .attr("width", width) 
     .attr("height", height); 

    //path to animate - marker transitions along this path 
    var path = svg.append("path") 
     .data([data]) 
     .attr("d", line) 
     .attr('class', 'line') 
     .attr("d", function(d) { 
     return line(d) 
     }); 

    //Want to activate circles when marker paused on them - intention is to have on click to href and stop marker while href is displayed 
    svg.selectAll("circle") 
     .data(data) 
     .enter() 
     .append("circle") 
     .attr("class", "point") 
     .attr("r", 10) 

     .attr("transform", function(d) { 
      return "translate(" + d + ")"; 
     }) 

     .on('click', function(d, i) { 
      d3.select(this) 
       .style("fill", "pink") 
       //sample - data will be for each point and based on the geojson in real example 
       .append("a") 
      .attr("xlink:href", "http://collections.anmm.gov.au/en/objects/details/11429/") 

      pausePoints.push(i); 
      console.log("pausePoints_push_i: " +pausePoints.push(i)); 
      console.log("pausePoints: " + pausePoints); 
      if (pausePoints.length === 1) 
      transition();  
     }); 


    var marker = svg.append("circle") 
     .attr("r", 19) 
     .attr("transform", "translate(" + (data[0]) + ")") 
      .on('click', function(d, i) { 
      d3.select(this) 
       .style("fill", "pink") 

       pausePoints.push(i); 

       if (pausePoints.length === 1) 
       setTimeout(function() { 
       pauseValues.lastTime = pauseValues.currentTime; 
       }, 100); 
     transition();  
     }); 


    var pauseValues = { 
     lastTime: 0, 
     currentTime: 0 
    }; 

    var pausePoints = [], 
     iter = 0, 
     transData = data.slice(); 

    function transition() { 
     marker.transition() 
     .ease(d3.easeLinear) 
     .duration(duration - (duration * pauseValues.lastTime)) 
     .attrTween("transform", function(){ 
      var p0 = transData.shift(), 
       p1 = transData[0]; 
       m = (p0[1] - p1[1])/(p0[0] - p1[0]), 
       b = p0[1] - (m * p0[0]), 
       i = d3.interpolateNumber(p0[0], p1[0]); 

      return function(t){ 
      //console.log("T: " +t); 
       var x = i(t), 
        y = m*x + b; 

       return "translate(" + x + "," + y + ")"; 
      } 
     }) 
     .on("end", function(){ 
      if (transData.length <= 1) return; 
      iter++;  
      setTimeout(transition, pausePoints.indexOf(iter) !== -1 ? pauseTime : 0); 

     }); 
    }; 

    </script> 
</body> 

답변

0

:

내 코드입니다. 내가 작성한 코드에서이 변수 pauseValues을 도입했습니다. 의도 한 것은 무엇입니까? 내가 알 수있는 것부터 이전의 일시 중지를 기준으로 지속 시간을 조정하려고 시도합니다. 모든 경로에서 하나의 긴 전환을 실행하는 경우에만이 기능이 필요했습니다. 내 코드는 각 다리를 단일 전환으로 실행합니다.

<!DOCTYPE html> 
 
<html lang="en"> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 

 
    <script src="https://d3js.org/d3.v4.min.js"></script> 
 

 
    <style type="text/css"> 
 
    body { 
 
     font-family: "Helvetica Neue", Helvetica, sans-serif; 
 
     color: red; 
 
    } 
 
    
 
    circle { 
 
     fill: steelblue; 
 
     stroke: steelblue; 
 
     stroke-width: 3px; 
 
    } 
 
    
 
    .point { 
 
     fill: green; 
 
    } 
 
    
 
    .line { 
 
     fill: none; 
 
     stroke: red; 
 
     stroke-width: 4; 
 
     stroke-dasharray: 4px, 8px; 
 
    } 
 
    </style> 
 

 
    <body> 
 

 
    <script> 
 
     var width = 960, 
 
     height = 500; 
 

 
     var data = [ 
 
     [610.4199794444444, 243.7191682432953], //Paris 
 
     [480, 200], 
 
     [580, 400], 
 
     [680, 100], 
 
     [780, 300], 
 
     [180, 300], 
 
     [280, 100], 
 
     [380, 400] 
 
     ]; 
 

 
     var duration = 20000/data.length, 
 
     pauseTime = 2000; 
 

 
     var line = d3.line() 
 
     .x(function(d) { 
 
      return (d)[0]; 
 
     }) 
 
     .y(function(d) { 
 
      return (d)[1]; 
 
     }); 
 

 
     var svg = d3.select("body") 
 
     .append("svg") 
 
     .attr("width", width) 
 
     .attr("height", height); 
 

 
     //path to animate - marker transitions along this path 
 
     var path = svg.append("path") 
 
     .data([data]) 
 
     .attr("d", line) 
 
     .attr('class', 'line') 
 
     .attr("d", function(d) { 
 
      return line(d) 
 
     }); 
 

 
     //Want to activate circles when marker paused on them - intention is to have on click to href and stop marker while href is displayed 
 
     svg.selectAll("circle") 
 
     .data(data) 
 
     .enter() 
 
     .append("circle") 
 
     .attr("class", "point") 
 
     .attr("r", 10) 
 

 
     .attr("transform", function(d) { 
 
     return "translate(" + d + ")"; 
 
     }) 
 

 
     .on('click', function(d, i) { 
 
     d3.select(this) 
 
      .style("fill", "pink") 
 
      //sample - data will be for each point and based on the geojson in real example 
 
      .append("a") 
 
      .attr("xlink:href", "http://collections.anmm.gov.au/en/objects/details/11429/") 
 

 
     pausePoints.push(i); 
 

 
     if (pausePoints.length === 1) 
 
      transition(); 
 
     }); 
 

 

 
     var marker = svg.append("circle") 
 
     .attr("r", 19) 
 
     .attr("transform", "translate(" + (data[0]) + ")") 
 
     .on('click', function(d, i) { 
 
      transition(); 
 
     }); 
 

 
     var pausePoints = [], 
 
     iter = 0; 
 
     transData = data.slice(); 
 

 
     function transition() { 
 
     marker.transition() 
 
      .ease(d3.easeLinear) 
 
      .duration(duration) 
 
      .attrTween("transform", function() { 
 
      var p0 = transData.shift(), 
 
       p1 = transData[0], 
 
       m = (p0[1] - p1[1])/(p0[0] - p1[0]), 
 
       b = p0[1] - (m * p0[0]), 
 
       interp = d3.interpolateNumber(p0[0], p1[0]); 
 

 
      return function(t) { 
 

 
       var x = interp(t), 
 
       y = m * x + b; 
 

 
       return "translate(" + x + "," + y + ")"; 
 
      } 
 
      }) 
 
      .on("end", function() { 
 
      iter++; 
 
      if (
 
       transData.length <= 1 || // out of points 
 
       pausePoints.indexOf(iter) !== -1) // on a clicked point 
 
      { 
 
       return; 
 
      } 
 
      transition(); 
 
      }); 
 
     }; 
 
    </script> 
 
    </body>

+0

예는, 대단히 감사합니다 지금은 조금 더 나은 무슨 일이 일어나고 있는지 이해하고 당신이 쓴 것은 나에게 많은 도움이 : 일시 정지 및 클릭에 다시 시작하려는 경우 여기 간단한 리팩토링이다 . 포인트의 전환을 시작 및 중지하고 지금 수행 할 수있는 마커를 클릭하여 포인트를 다시 시작할 수 있기를 원했습니다. 귀하의 코드를 약간 변경하여 "pausePoints.push (i);" 클릭 마커 기능을 사용하면 원하는 결과를 얻을 수 있습니다. 다시 한 번 감사드립니다! – user3471259