2017-01-01 7 views
0

マウスイベントで2つ以上の円に接続したい。私は次のようなコードを持っていますマウスクリックイベントで2つの円を接続する

 var jsonCircles = [ 
      { "x_axis": 30, "y_axis": 30, "radius": 20, "color" : "green" , "class":"circleFirst"}, 
      { "x_axis": 70, "y_axis": 70, "radius": 20, "color" : "purple" , "class": "circleSecond"}, 
      { "x_axis": 110, "y_axis": 100, "radius": 20, "color" : "red", "class":"circleThird"}]; 

    var spaceHeight = 500; 
    var spaceWidth = 500; 
    var keep = false, 
     mouseStart = null, path = null; 

var dataObj = {}; 
var locationsObj = "locations"; 
dataObj[locationsObj] = {}; 
dataObj[locationsObj].source = []; 
dataObj[locationsObj].target = []; 


    var drag = d3.behavior.drag() 
     .on("dragstart", function() { 
      d3.event.sourceEvent.stopPropagation(); 
     }) 
     .on("drag", dragmove); 

    function dragmove(d) 
    { 
     //boundary of svg area 
     var x = Math.max(0, Math.min(spaceWidth - 100, d3.event.x)); 
     var y = Math.max(0, Math.min(spaceHeight - 50, d3.event.y)); 
     d3.select(this).attr("transform", "translate(" + x + "," + y + ")"); //main objects 
    } 


    var svgContainer = d3.select("body").append("svg") 
             .attr("width", spaceWidth) 
             .attr("height", spaceHeight) 
             .on("mousedown", mousedown) 
             .on("mousemove", mousemove) 
             .on("mouseup", mouseup); 


    var circles = svgContainer.selectAll("circle") 
           .data(jsonCircles) 
           .enter() 
           .append("circle"); 

    var circleAttributes = circles 
          .attr("cx", function (d) { return d.x_axis; }) 
          .attr("cy", function (d) { return d.y_axis; }) 
          .attr("r", function (d) { return d.radius; }) 
          .attr("class", function(d) { return d.class;}) 
          .style("fill", function(d) { return d.color; }) 
          .call(drag); 




    function mousedown() 
    { 
     path = svgContainer.append("path") 
      .style("stroke", "gray") 
      .style("stroke-width", "2px") 
      .style("fill", "none"); 
     keep = true; 
     mouseStart = d3.mouse(this); 

    } 

    function mouseup() 
    { 
     keep= false; 
    } 

    function mousemove() 
    { 
     if(keep) 
     { 
      var mouseEnd = d3.mouse(this); 
      var dx = mouseStart[0] - mouseEnd[0], 
       dy = mouseStart[1] - mouseEnd[1], 
       dr = Math.sqrt(dx * dx + dy*dy); 
      path.attr("d", "M" + 
       mouseStart[0] + "," + 
       mouseStart[1] + "A" + 
       dr + "," + dr + " 0 0,1 " + 
       mouseEnd[0] + "," + 
       mouseEnd[1]); 
     } 

    } 

1)クラスに応じてどのように接続できますか?私はあなたがコードで見ることができるように、クラス情報をdataObjにプッシュします。

enter image description here

2)私は2つのオブジェクト間のないSVG領域に描画する必要があります。私がsvg空間に線を引くとき、背景色に変換する必要があります。これについて何か提案がありますか?(*)

  • 私は曲線や線を描くためにmousemove関数を使用しています。ある円から他の円にマウスをドラッグすると、それが他の円の半径にある場合に線を描く必要があります。そうでなければ、行はありません。次の図を参照してください。追加情報:サークルはドラッグ可能なサークルになります。だから私はサークルを選択して移動したときにパスをリフレッシュする必要があります。事前に

enter image description here

おかげで、

答えて

1

ここにそれが私の感想です。各サークルをクリックしてみてください。あなたは「私はSVG空間における線を描画するとき、それは背景色に変換する必要がある」ので、私はクリックされたサークルの背景色を意味するためにそれを取ったことにより、どのような意味

https://jsfiddle.net/guanzo/f5c22h08/2/

わかりません。

また、画像のような行を作成する方法もわかりません。

function click(circle){ 
    d3.selectAll('line').remove() 
    d3.selectAll('circle[class^=circle]') 
    .filter(d=>d.class != circle.class) 
    .each(d=>{ 
     svg.append('line') 
      .attr({ 
      x1:circle.x_axis, 
      y1:circle.y_axis, 
      x2:d.x_axis, 
      y2:d.y_axis, 
      stroke:circle.color 
      }) 
    }) 
} 
+0

私は質問を編集しました。 2番目の部分についてコメントできますか?私はもう一つの画像を追加しました – zoint

+0

@ジョイントおそらく、第二の部分を削除して、この答えが最初の部分を適切にカバーしていると思うなら別の質問として尋ねるほうがいいでしょう。 –

+0

@zointしたがって、円をドラッグすることと、ドラッグすることによって行を作成することを区別する方法はありますか? –

関連する問題