【问题标题】:Connect two circles with mouse click event用鼠标点击事件连接两个圆圈
【发布时间】:2017-05-16 03:48:45
【问题描述】:

我想用鼠标事件连接两个或多个圆圈。我有如下代码

      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) 我只需要在两个不在 svg 区域的对象之间进行绘制。当我在 svg 空间中画一条线时,它需要转换为背景颜色。对此有什么建议吗?(*)

  • 我正在使用 mousemove 函数来绘制曲线或直线。当我将鼠标从一个圆圈拖动到另一个圆圈时,如果它在另一个圆圈的半径内,则需要画一条线。如果不是,就没有线。您可以在下图中看到。附加信息:圆圈将是可拖动的圆圈。所以当我选择并移动圆圈时需要刷新路径。

enter image description here

提前致谢,

【问题讨论】:

    标签: javascript d3.js svg geometry


    【解决方案1】:

    这是我的看法。尝试点击每个圆圈。

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

    不确定您所说的“当我在 svg 空间中绘制一条线时,它需要转换为背景颜色”,所以我把它理解为点击圆圈的背景颜色。

    另外,我不知道有什么方法可以创建像您图像中那样的线条。

    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
               })
        })
    }
    

    【讨论】:

    • 我编辑了这个问题。你能评论第二部分吗?我还添加了另一张图片
    • @zoint 如果您认为这个答案充分涵盖了第一部分,最好删除第二部分并将其作为一个单独的问题提出。
    • @zoint 那么如何区分拖动圆圈和通过拖动创建线条?
    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多