Connect canvas with lines

后端 未结 1 1819
隐瞒了意图╮
隐瞒了意图╮ 2020-12-09 14:39

I need to connect two canvas with a line to create a dynamic workflow.

I\'ll generate the canvas rectangle dynamic (amount of steps I have at DB) but I need to conne

相关标签:
1条回答
  • 2020-12-09 15:05

    Here’s how to automatically connect 2 draggable canvas rectangles with a line

    enter image description hereenter image description here

    First, define some boxes and connectors:

        // define any boxes that will be drawn
        var boxes=[];
        boxes.push({x:50,y:25,w:75,h:50});    // x,y,width,height
        boxes.push({x:200,y:100,w:50,h:50});
    
        // define any connectors between any boxes
        var connectors=[];
        connectors.push({box1:0,box2:1});
    

    Draw the boxes and automatically draw their connectors:

        function draw(){
    
            // clear the canvas
            ctx.clearRect(0,0,canvas.width,canvas.height);
    
            for(var i=0;i<boxes.length;i++){
                var box=boxes[i];
                ctx.fillRect(box.x,box.y,box.w,box.h);
            }
            for(var i=0;i<connectors.length;i++){
                var connector=connectors[i];
                var box1=boxes[connector.box1];
                var box2=boxes[connector.box2];
                ctx.beginPath();
                ctx.moveTo(box1.x+box1.w/2,box1.y+box1.h/2);
                ctx.lineTo(box2.x+box2.w/2,box2.y+box2.h/2);
                ctx.stroke();
            }
    
        }
    

    The code below allows any box to be dragged and remain connected.

    Here is code and a Fiddle: http://jsfiddle.net/m1erickson/GX6HS/

    <!doctype html>
    <html>
    <head>
    <link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    
    <style>
        body{ background-color: ivory; padding:20px;}
        #canvas{border:1px solid red;}
    </style>
    
    <script>
    $(function(){
    
        var canvas=document.getElementById("canvas");
        var ctx=canvas.getContext("2d");
    
        var canvasOffset=$("#canvas").offset();
        var offsetX=canvasOffset.left;
        var offsetY=canvasOffset.top;
    
        var startX;
        var startY;
        var isDown=false;
        var dragTarget;
    
        var boxes=[];
        boxes.push({x:50,y:25,w:75,h:50});    // x,y,width,height
        boxes.push({x:200,y:100,w:50,h:50});
    
    
        var connectors=[];
        connectors.push({box1:0,box2:1});
    
        draw();
    
        function draw(){
    
            // clear the canvas
            ctx.clearRect(0,0,canvas.width,canvas.height);
    
            for(var i=0;i<boxes.length;i++){
                var box=boxes[i];
                ctx.fillRect(box.x,box.y,box.w,box.h);
            }
            for(var i=0;i<connectors.length;i++){
                var connector=connectors[i];
                var box1=boxes[connector.box1];
                var box2=boxes[connector.box2];
                ctx.beginPath();
                ctx.moveTo(box1.x+box1.w/2,box1.y+box1.h/2);
                ctx.lineTo(box2.x+box2.w/2,box2.y+box2.h/2);
                ctx.stroke();
            }
    
        }
    
        function hit(x,y){
            for(var i=0;i<boxes.length;i++){
                var box=boxes[i];
                if(x>=box.x && x<=box.x+box.w && y>=box.y && y<=box.y+box.h){
                    dragTarget=box;
                    return(true);
                }
            }
            return(false);
        }
    
        function handleMouseDown(e){
          startX=parseInt(e.clientX-offsetX);
          startY=parseInt(e.clientY-offsetY);
    
          // Put your mousedown stuff here
          isDown=hit(startX,startY);
        }
    
        function handleMouseUp(e){
          // Put your mouseup stuff here
          dragTarget=null;
          isDown=false;
        }
    
        function handleMouseOut(e){
            handleMouseUp(e);
        }
    
        function handleMouseMove(e){
          if(!isDown){return;}
    
          mouseX=parseInt(e.clientX-offsetX);
          mouseY=parseInt(e.clientY-offsetY);
    
          // Put your mousemove stuff here
          var dx=mouseX-startX;
          var dy=mouseY-startY;
          startX=mouseX;
          startY=mouseY;
          dragTarget.x+=dx;
          dragTarget.y+=dy;
          draw();
        }
    
        $("#canvas").mousedown(function(e){handleMouseDown(e);});
        $("#canvas").mousemove(function(e){handleMouseMove(e);});
        $("#canvas").mouseup(function(e){handleMouseUp(e);});
        $("#canvas").mouseout(function(e){handleMouseOut(e);});
    
    }); // end $(function(){});
    </script>
    
    </head>
    
    <body>
        <p>Drag boxes--they remain connected</p>
        <canvas id="canvas" width=300 height=300></canvas>
    </body>
    </html>
    
    0 讨论(0)
提交回复
热议问题