search

Home  >  Q&A  >  body text

d3 js circular animated breathing app traveling on a circular path

d3 js animated breathing application

I want to be able to create an animation of a circle that rotates around a path at a specific interval, and be able to control that interval to speed up/slow down.

My code currently looks like this. How to set a circle to move along a circle path - maybe even have the parent circle itself "breathe" in and out

July 27, 2023 - Current Base

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>
<html>
    <head>
        <title>multibar d3</title>
        <script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
        <style>
            
        </style>
    </head>
    <body>



        <script>

        var width = 960;
        var height = 600;

        var margin = {top: 20, right: 5, bottom: 30, left: 20};

                var svg = d3.select("body")
                    .append("svg")
                    .attr("width", width + margin.left + margin.right)
                    .attr("height", height + margin.top + margin.bottom)
                    .append("g")
                    .attr('class', 'circleorbits')
                    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");


        var originX = 200;
        var originY = 200;
        var innerCircleRadius = 40;
        var outerCircleRadius = 60;

        /*
        var table = svg.append("circle").attr({
            cx: originX,
            cy: originY,
            r: 40,
            fill: "white",
            stroke: "black"
        });
        */

        var group = svg.append("g");

        var outerCircle = svg.append("circle")
            .attr("cx", originX)
            .attr("cy", originY)
            .attr("opacity", 0)
            .attr("r", outerCircleRadius)
            .attr("fill", "none")
            .attr("stroke", "black");

//console.log("outerCircle", outerCircle);
        var chairOriginX = originX + ((60) * Math.sin(0));
        var chairOriginY = originY - ((60) * Math.cos(0));

        var pointOnOuterCircle = svg.append("circle")
             .attr("cx", chairOriginX)
             .attr("cy", chairOriginY)
             .attr("opacity", 0)
             .attr("r", 5)
             .attr("fill", "black");
//console.log("pointOnOuterCircle", pointOnOuterCircle);
        /*
        var chairWidth = 20;
        var chair = svg.append("rect").attr({
            x: chairOriginX - (chairWidth / 2),
            y: chairOriginY - (chairWidth / 2),
            width: chairWidth,
            opacity: 0,
            height: 20,
            fill: "none",
            stroke: "blue"
        });
        */

        // ANIMATIONS


        // drawing outer circle
        outerCircle.transition().delay(500).duration(500).style("opacity", 1);

        // drawing point on outer circle
        pointOnOuterCircle.transition().delay(1000).duration(500).style("opacity", 1);

        // drawing chair on the point
        //chair.transition().delay(1500).duration(500).style("opacity", 1);

        // rotating the chair
        var tween = function (d, i, a) {
            return d3.interpolateString("rotate(0, 200, 200)", "rotate(360, 200, 200)");
        }


        var duration = 5000;

        //chair.transition().delay(2000).duration(500).attrTween("transform", tween);
        pointOnOuterCircle.transition().delay(2000).duration(duration).attrTween("transform", tween);

        // fading out the intermediate objects
        //pointOnOuterCircle.transition().delay(4000).duration(500).style("opacity", 0);
        //outerCircle.transition().delay(4000).duration(500).style("opacity", 0);

        function newLoop(){
            pointOnOuterCircle.transition().delay(2000).duration(5000).attrTween("transform", tween);
        }

        setInterval(newLoop, duration);



        </script>



    </body>
</html>


svg = d3.create("svg");

var circle = svg
    .append("circle")
    .attr("cx", 150)
    .attr("cy", 75)
    .attr("r", 50);



circle
    .transition()
    .duration(2000)
    .attr('r', 75);

d3
    .select("#container")
    .append(() => svg.node());



var circle = svg
    .append("circle")
    .attr("cx", 150)
    .attr("cy", 75)
    .attr("r", 50);

<!DOCTYPE html>
<meta charset="utf-8">
<body>
<style>

path {
  fill: none;
  stroke: #000;
  stroke-width: 3px;
}

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

</style>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

var points = [
  [480, 200],
  [580, 400],
  [680, 100],
  [780, 300],
  [180, 300],
  [280, 100],
  [380, 400]
];

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

var path = svg.append("path")
    .data([points])
    .attr("d", d3.svg.line()
    .tension(0) // Catmull–Rom
    .interpolate("cardinal-closed"));

svg.selectAll(".point")
    .data(points)
  .enter().append("circle")
    .attr("r", 4)
    .attr("transform", function(d) { return "translate(" + d + ")"; });

var circle = svg.append("circle")
    .attr("r", 13)
    .attr("transform", "translate(" + points[0] + ")");

transition();

function transition() {
  circle.transition()
      .duration(10000)
      .attrTween("transform", translateAlong(path.node()))
      .each("end", transition);
}

// Returns an attrTween for translating along the specified path element.
function translateAlong(path) {
  var l = path.getTotalLength();
  return function(d, i, a) {
    return function(t) {
      var p = path.getPointAtLength(t * l);
      return "translate(" + p.x + "," + p.y + ")";
    };
  };
}

</script>

P粉191610580P粉191610580464 days ago603

reply all(1)I'll reply

  • P粉864594965

    P粉8645949652023-09-15 00:41:22

    Able to create this app using this code - but may need to make it a react component to show/hide it when the user clicks the play button.

    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>
    <html>
        <head>
            <title>multibar d3</title>
            <script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
            <style>
                
            </style>
        </head>
        <body>
    
    
    
            <script>
    
            var width = 960;
            var height = 600;
    
            var margin = {top: 20, right: 5, bottom: 30, left: 20};
    
                    var svg = d3.select("body")
                        .append("svg")
                        .attr("width", width + margin.left + margin.right)
                        .attr("height", height + margin.top + margin.bottom)
                        .append("g")
                        .attr('class', 'circleorbits')
                        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
    
    
            var originX = 200;
            var originY = 200;
            var innerCircleRadius = 40;
            var outerCircleRadius = 60;
    
            /*
            var table = svg.append("circle").attr({
                cx: originX,
                cy: originY,
                r: 40,
                fill: "white",
                stroke: "black"
            });
            */
    
            var group = svg.append("g");
    
            var outerCircle = svg.append("circle")
                .attr("cx", originX)
                .attr("cy", originY)
                .attr("opacity", 0)
                .attr("r", outerCircleRadius)
                .attr("fill", "none")
                .attr("stroke", "black");
    
    //console.log("outerCircle", outerCircle);
            var chairOriginX = originX + ((60) * Math.sin(0));
            var chairOriginY = originY - ((60) * Math.cos(0));
    
            var pointOnOuterCircle = svg.append("circle")
                 .attr("cx", chairOriginX)
                 .attr("cy", chairOriginY)
                 .attr("opacity", 0)
                 .attr("r", 5)
                 .attr("fill", "black");
    //console.log("pointOnOuterCircle", pointOnOuterCircle);
            /*
            var chairWidth = 20;
            var chair = svg.append("rect").attr({
                x: chairOriginX - (chairWidth / 2),
                y: chairOriginY - (chairWidth / 2),
                width: chairWidth,
                opacity: 0,
                height: 20,
                fill: "none",
                stroke: "blue"
            });
            */
    
            // ANIMATIONS
    
    
            // drawing outer circle
            outerCircle.transition().delay(500).duration(500).style("opacity", 1);
    
            // drawing point on outer circle
            pointOnOuterCircle.transition().delay(1000).duration(500).style("opacity", 1);
    
            // drawing chair on the point
            //chair.transition().delay(1500).duration(500).style("opacity", 1);
    
            // rotating the chair
            var tween = function (d, i, a) {
                return d3.interpolateString("rotate(0, 200, 200)", "rotate(360, 200, 200)");
            }
    
    
            var duration = 5000;
    
            //chair.transition().delay(2000).duration(500).attrTween("transform", tween);
            pointOnOuterCircle.transition().delay(2000).duration(duration).attrTween("transform", tween);
    
            // fading out the intermediate objects
            //pointOnOuterCircle.transition().delay(4000).duration(500).style("opacity", 0);
            //outerCircle.transition().delay(4000).duration(500).style("opacity", 0);
    
            function newLoop(){
                pointOnOuterCircle.transition().delay(2000).duration(5000).attrTween("transform", tween);
            }
    
            setInterval(newLoop, duration);
    
    
    
            </script>
    
    
    
        </body>
    </html>

    reply
    0
  • Cancelreply